Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 49996104ce | |||
| b3cf0b0aa1 | |||
| 63c0153860 | |||
| 8bfbdedf43 | |||
| 6d2fca9fc2 | |||
| b26ce2f114 | |||
| 8b75a15e3f | |||
| d69144f506 | |||
| 44cc07db73 |
@@ -68,4 +68,4 @@ jobs:
|
|||||||
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json'
|
manifest: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/latest/system.json'
|
||||||
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-celestopol-${{github.event.release.tag_name}}.zip'
|
notes: 'https://www.uberwald.me/gitea/${{gitea.repository}}/releases/download/${{github.event.release.tag_name}}/fvtt-celestopol-${{github.event.release.tag_name}}.zip'
|
||||||
compatibility-minimum: '13'
|
compatibility-minimum: '13'
|
||||||
compatibility-verified: '13'
|
compatibility-verified: '14'
|
||||||
|
|||||||
87
.github/copilot-instructions.md
vendored
@@ -1,87 +0,0 @@
|
|||||||
# Copilot Instructions — fvtt-celestopol
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
This is a **Foundry VTT system** for **Célestopol 1922**, a French tabletop RPG set in an art-deco 1922 universe. The project targets FoundryVTT v13+ and is developed in French.
|
|
||||||
|
|
||||||
The reference rulebooks are in `__regles/` (gitignored):
|
|
||||||
- *Célestopol 1922 Livre de base* — core rulebook
|
|
||||||
- *Célestopol 1922 Fiches de prêts à jouer* — pre-generated character sheets
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
This system uses **FoundryVTT v13 DataModels + ApplicationV2** — NOT the legacy template.json / AppV1 approach.
|
|
||||||
|
|
||||||
```
|
|
||||||
fvtt-celestopol.mjs # Main entry point (Hooks.once("init"))
|
|
||||||
module/
|
|
||||||
config/system.mjs # All game constants (SYSTEM export)
|
|
||||||
models/ # TypeDataModel subclasses (character, npc, items)
|
|
||||||
documents/ # Actor, Item, ChatMessage, Roll wrappers
|
|
||||||
applications/sheets/ # AppV2 sheets (HandlebarsApplicationMixin)
|
|
||||||
lang/fr.json # French i18n (key prefix: CELESTOPOL.*)
|
|
||||||
styles/ # LESS source files
|
|
||||||
css/ # Compiled CSS (via gulp)
|
|
||||||
templates/ # Handlebars (.hbs) templates
|
|
||||||
assets/fonts/ # CopaseticNF art-deco font
|
|
||||||
assets/ui/ # Background images
|
|
||||||
assets/icons/ # Item icons
|
|
||||||
packs-system/ # Source files for compendium packs
|
|
||||||
```
|
|
||||||
|
|
||||||
## DataModels (no template.json)
|
|
||||||
|
|
||||||
- Extend `foundry.abstract.TypeDataModel`
|
|
||||||
- Schema in `static defineSchema()` using `foundry.data.fields.*`
|
|
||||||
- `prepareDerivedData()` for computed values
|
|
||||||
- Files: `module/models/character.mjs`, `npc.mjs`, `items.mjs`
|
|
||||||
|
|
||||||
## ApplicationV2 / Sheets
|
|
||||||
|
|
||||||
- Actor sheets: `HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2)`
|
|
||||||
- Item sheets: `HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2)`
|
|
||||||
- `static DEFAULT_OPTIONS` for config; `static PARTS` for templates
|
|
||||||
- `_prepareContext()` for base context; `_preparePartContext(partId, context)` for per-tab
|
|
||||||
- Edit/Play mode toggle via `_sheetMode` + `isPlayMode`/`isEditMode` getters
|
|
||||||
- Actions: `static #onXxx(event, target)` private static methods in `DEFAULT_OPTIONS.actions`
|
|
||||||
- `form: { submitOnChange: true }` enables live saving
|
|
||||||
|
|
||||||
## Roll Mechanics
|
|
||||||
|
|
||||||
- Pool of d6 dice: `nbDice = max(1, skillValue + woundMalus)`
|
|
||||||
- Formula: `{n}d6 [+ moonBonus + modifier]`
|
|
||||||
- Moon phase bonus: Nouvelle Lune=0, Croissants=+1, Gibbeuse=+2, Pleine Lune=+3
|
|
||||||
- Compare total vs difficulty threshold (normal=7)
|
|
||||||
- Wound malus: levels 1-2=0, 3-4=-1, 5-6=-2, 7=-3, 8=-999 (out)
|
|
||||||
- DialogV2 for roll configuration: `foundry.applications.api.DialogV2.wait(...)`
|
|
||||||
|
|
||||||
## Game Data (4 stats × 4 skills)
|
|
||||||
|
|
||||||
- **Âme**: Artifice, Attraction, Coercition, Faveur
|
|
||||||
- **Corps**: Échauffourée, Effacement, Mobilité, Prouesse
|
|
||||||
- **Cœur**: Appréciation, Arts, Inspiration, Traque
|
|
||||||
- **Esprit**: Instruction, Merveilleux technologique, Raisonnement, Traitement
|
|
||||||
|
|
||||||
**Tracks**: Blessures (8 niveaux), Destin (8), Spleen (8)
|
|
||||||
**Anomalies**: 9 types (none + 8)
|
|
||||||
**Factions**: 8 standard + 2 custom
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install # Install dev deps
|
|
||||||
npx gulp css # Compile LESS → css/fvtt-celestopol.css (once)
|
|
||||||
npx gulp # Compile + watch
|
|
||||||
```
|
|
||||||
|
|
||||||
## Visual Style
|
|
||||||
|
|
||||||
- Font: **CopaseticNF** (Regular + Bold, in `assets/fonts/`) — art-deco style
|
|
||||||
- Header bg color: `rgb(12, 76, 12)` (dark green) with orange text (`#e07b00`)
|
|
||||||
- Sheet header texture: `assets/ui/fond_cadrille.jpg`
|
|
||||||
- CSS variables: `--cel-green`, `--cel-orange`, `--cel-font-title`, etc.
|
|
||||||
|
|
||||||
## Language
|
|
||||||
|
|
||||||
All in-game text, labels, and code comments should be in **French**. Code identifiers may be English. All i18n keys use the `CELESTOPOL.*` prefix (see `lang/fr.json`).
|
|
||||||
|
|
||||||
1
.gitignore
vendored
@@ -13,3 +13,4 @@ css/*.css
|
|||||||
# Règles (PDFs privés)
|
# Règles (PDFs privés)
|
||||||
__regles/
|
__regles/
|
||||||
*.pdf
|
*.pdf
|
||||||
|
.github/
|
||||||
|
|||||||
228
_source/pretires/Bao_Wang.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preBaoWang00001",
|
||||||
|
"_key": "!actors!preBaoWang00001",
|
||||||
|
"name": "Bao Wang",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "L’escroc",
|
||||||
|
"metier": "Videur",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 7,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "entropie",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 2,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Toujours tiré à quatre épingles, Bao est reconnu par ses coéquipiers comme le plus nonchalant du groupe.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Ancienne petite frappe de Shanghai devenue videur au casino flottant La Libellule, Bao a rejoint Célestopol pour disparaître des radars de la police chinoise.</p><p>Peu enclin à la violence, joueur, séducteur et débrouillard, il a été recruté par Ernest pour mettre son passé houleux au service de l’agence du Lys blanc.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "32 ans",
|
||||||
|
"genre": "Homme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Chine"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preBaoWangAnom",
|
||||||
|
"name": "Entropie",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "entropie",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 1,
|
||||||
|
"technique": "<p>Durant un scénario, Bao peut <strong>relancer le Dé de Lune une seule fois</strong> et conserver le résultat qu’il préfère.</p><p>Cette capacité ne s’applique pas aux tests de chance.</p>",
|
||||||
|
"narratif": "<p>Le protagoniste peut <strong>influencer le hasard</strong> à sa façon, en déclenchant ou en évitant de petits événements aléatoires dans son environnement proche. Ces manifestations sont mineures, subtiles, et ne semblent jamais surnaturelles aux yeux des témoins.</p>",
|
||||||
|
"exemples": "<ul><li>Obtenir une bonne main au jeu de cartes lors de la distribution.</li><li>Voir le feu passer au vert en tournant le coin de la rue.</li><li>Faire tomber le verre d'un convive gênant au bon moment.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preBaoWang00001.preBaoWangAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preBaoWangAsp1",
|
||||||
|
"name": "Aime le jeu",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Aime le jeu</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preBaoWang00001.preBaoWangAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preBaoWangAsp2",
|
||||||
|
"name": "Belle gueule",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Belle gueule</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preBaoWang00001.preBaoWangAsp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
228
_source/pretires/Elemiah_Cowen.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preElemiah0001",
|
||||||
|
"_key": "!actors!preElemiah0001",
|
||||||
|
"name": "Elemiah Cowen",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "L’ouvrier",
|
||||||
|
"metier": "Manutentionnaire",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 7,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "tarotdivinatoire",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 5
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Ancien ouvrier d’une trentaine d’années, Elemiah impressionne par son torse large, ses sourcils broussailleux, sa moustache travaillée et l’absence de deux doigts à la main gauche.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Après la mort de son frère Rubben dans un accident industriel, Elemiah s’est juré de soutenir les miséreux de Célestopol.</p><p>Taiseux mais profondément solidaire, il s’émerveille désormais de l’architecture et des automates de la cité tout en travaillant aux galeries Sabline.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "28 ans",
|
||||||
|
"genre": "Homme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Célestopol"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preElemiahAnom",
|
||||||
|
"name": "Tarot divinatoire",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "tarotdivinatoire",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'une <strong>Spécialisation du Cœur</strong> (Appréciation, Arts, Inspiration, Traque), le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>En <strong>tirant les cartes</strong>, le protagoniste peut apprendre une information sur une personne concernant son <em>passé, son présent ou son avenir</em>. L'information reste sujette à interprétation et le narrateur peut choisir de la formuler de façon symbolique ou métaphorique.</p>",
|
||||||
|
"exemples": "<ul><li>Deviner où se trouvera une cible le lendemain.</li><li>Connaître les antécédents douloureux d'un voisin mystérieux.</li><li>Obtenir une image symbolique du danger qui attend un allié.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preElemiah0001.preElemiahAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preElemiahAsp1",
|
||||||
|
"name": "Digne de confiance",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Digne de confiance</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preElemiah0001.preElemiahAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preElemiahAsp2",
|
||||||
|
"name": "Robuste",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Robuste</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preElemiah0001.preElemiahAsp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
228
_source/pretires/Maribel_Vargas.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preMaribel0001",
|
||||||
|
"_key": "!actors!preMaribel0001",
|
||||||
|
"name": "Maribel Vargas",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "La scientifique",
|
||||||
|
"metier": "Mécanicienne",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 7,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "communicationaveclesmorts",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 4
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 2,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Jeune scientifique mexicaine, Maribel possède l’allure vive et appliquée de celles qui pensent plus vite qu’elles ne parlent.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Mécanicienne brillante et major de promotion de l’université de Célestopol, Maribel s’est spécialisée dans l’ingénierie de pointe et le sélénium.</p><p>Longtemps freinée par son origine et son genre, elle a finalement trouvé sa place auprès d’Ernest, même si son habitude de parler seule amuse encore le reste de l’équipe.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "25 ans",
|
||||||
|
"genre": "Femme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Mexique"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preMaribelAnom",
|
||||||
|
"name": "Communication avec les morts",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "communicationaveclesmorts",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'une <strong>Spécialisation de l'Esprit</strong> (Instruction, Merveilleux technologique, Raisonnement, Traitement), le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>Le protagoniste entre <strong>en contact avec l'esprit d'un défunt</strong>. Il peut lui poser une <em>question fermée</em> (réponse par oui ou par non uniquement). Le contact est bref et les réponses peuvent être fragmentées ou métaphoriques, à la discrétion du narrateur.</p>",
|
||||||
|
"exemples": "<ul><li>Interroger la victime d'un meurtre sur l'identité de son agresseur.</li><li>Consulter l'esprit d'un ancêtre pour retrouver un objet caché.</li><li>Demander à un fantôme si quelqu'un l'a aidé à mourir.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preMaribel0001.preMaribelAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preMaribelAsp1",
|
||||||
|
"name": "Déterminée",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Déterminée</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preMaribel0001.preMaribelAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preMaribelAsp2",
|
||||||
|
"name": "Sagace",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Sagace</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preMaribel0001.preMaribelAsp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
228
_source/pretires/Nadeja_Danilo.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preNadeja00001",
|
||||||
|
"_key": "!actors!preNadeja00001",
|
||||||
|
"name": "Nadeja Danilo",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "La pilote",
|
||||||
|
"metier": "Pilote",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 10,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "telekinesie",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Nadeja donne d’abord l’image d’une femme sérieuse et farouche, toujours parfaitement concentrée.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Née à Célestopol dans une famille d’universitaires, Nadeja s’est tournée très tôt vers les étoiles et les destinations lointaines.</p><p>Pilote extrêmement douée, elle travaille pour Columbia après avoir subi le sexisme du milieu aéronautique et supporte mal le manque de respect.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "35 ans",
|
||||||
|
"genre": "Femme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Célestopol"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preNadeja0Anom",
|
||||||
|
"name": "Télékinésie",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "telekinesie",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'une <strong>Spécialisation du Corps</strong> (Échauffourée, Effacement, Mobilité, Prouesse), le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>Dans un rayon de <strong>8 mètres</strong>, le protagoniste peut <strong>déplacer par la pensée</strong> un petit objet léger sans attaches, sur <strong>4 mètres</strong> (dans n'importe quelle direction) pendant <strong>2 tours</strong>. L'objet doit être visible et accessible par le regard.</p>",
|
||||||
|
"exemples": "<ul><li>Déplacer une cuillère pour la faire tomber d'une table au bon moment.</li><li>Faire léviter un jeu de tarot ou un trousseau de clés.</li><li>Pousser doucement un verre pour attirer l'attention d'un interlocuteur.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNadeja00001.preNadeja0Anom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preNadeja0Asp1",
|
||||||
|
"name": "Résiliente",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Résiliente</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNadeja00001.preNadeja0Asp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preNadeja0Asp2",
|
||||||
|
"name": "Tête froide",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Tête froide</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNadeja00001.preNadeja0Asp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
228
_source/pretires/Niels_Bielke.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preNielsBielke1",
|
||||||
|
"_key": "!actors!preNielsBielke1",
|
||||||
|
"name": "Niels Bielke",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "L’Artiste maudit",
|
||||||
|
"metier": "Acteur",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 8,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "suggestion",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 2,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Niels approche de la quarantaine. Malgré une allure en apparence négligée et un tic nerveux persistant, il conserve un charisme et une aura certains.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Ancienne vedette des scènes suédoises, Niels a quitté la Terre pour conquérir Célestopol avant de sombrer dans la disgrâce et l’alcool.</p><p>Sauvé par Ernest alors qu’il était au bord du gouffre, il sert désormais l’équipe du Lys blanc avec la volonté de payer sa dette et de tenir sa parole de ne plus toucher à l’alcool.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "38 ans",
|
||||||
|
"genre": "Homme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Suède"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preNielsBiAnom",
|
||||||
|
"name": "Suggestion",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "suggestion",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'une <strong>Spécialisation de l'Âme</strong> (Artifice, Attraction, Coercition, Faveur), le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>Le protagoniste est capable d'<strong>influencer la prise de décision</strong> d'une personne en lui parlant à voix haute et en la regardant dans les yeux. Cette décision doit avoir un <em>impact immédiat</em> sur l'action de la personne concernée.</p><p>Cette capacité fonctionne également sur les <strong>automates sophistiqués de 4e et 5e génération</strong>.</p>",
|
||||||
|
"exemples": "<ul><li>Convaincre un garde de laisser passer sans vérifier les laissez-passer.</li><li>Pousser un prisonnier à donner son nom ou à s'asseoir.</li><li>Inciter un chauffeur de taxi à emprunter un itinéraire détourné.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNielsBielke1.preNielsBiAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preNielsBiAsp1",
|
||||||
|
"name": "Charismatique",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Charismatique</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNielsBielke1.preNielsBiAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preNielsBiAsp2",
|
||||||
|
"name": "Sensible",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Sensible</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preNielsBielke1.preNielsBiAsp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
250
_source/pretires/Polypheme.json
Normal file
@@ -0,0 +1,250 @@
|
|||||||
|
{
|
||||||
|
"_id": "prePolyphme0001",
|
||||||
|
"_key": "!actors!prePolyphme0001",
|
||||||
|
"name": "Polyphème",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "Le chroniqueur",
|
||||||
|
"metier": "Assistant-archiviste",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 7,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "voyageastral",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 4
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 2,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Automate de 4e génération remis en état par Ernest, Polyphème se distingue par son apparence artificielle et son obsession de ne pas avoir le « bon visage ».</p>",
|
||||||
|
"descriptionPsychologique": "<p>Retrouvé à demi détruit au fond d’une impasse, Polyphème a été réparé puis intégré à l’agence du Lys blanc comme assistant-archiviste.</p><p>Parfaitement intégré à l’équipe, il demeure hanté par la violence subie avant sa remise en état et par l’absence de souvenirs de sa vie passée.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "Inconnu",
|
||||||
|
"genre": "Automate",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Inconnue"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "prePolyphmAnom",
|
||||||
|
"name": "Voyage astral",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "voyageastral",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'<strong>Appréciation, Merveilleux technologique, Traitement ou Traque</strong>, le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>L'<strong>esprit du protagoniste quitte son enveloppe corporelle</strong> et se déplace de <strong>8 mètres par tour</strong> pendant <strong>4 tours</strong>, dans n'importe quelle direction. L'esprit est <em>invisible</em> et peut traverser tous les obstacles matériels. Les sens du protagoniste restent les mêmes durant le voyage.</p><p>Le corps reste immobile et vulnérable durant le voyage.</p>",
|
||||||
|
"exemples": "<ul><li>Accéder aux toits d'une maison pour effectuer une reconnaissance sans risque physique.</li><li>Inspecter une pièce adjacente verrouillée avant d'y pénétrer.</li><li>Voir à quelle distance un éboulement bloque le passage dans un tunnel et s'il y a des survivants.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!prePolyphme0001.prePolyphmAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "prePolyphmAsp1",
|
||||||
|
"name": "Difficile à lire",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Difficile à lire</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!prePolyphme0001.prePolyphmAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "prePolyphmAsp2",
|
||||||
|
"name": "Étrangeté",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Étrangeté</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!prePolyphme0001.prePolyphmAsp2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "prePolyphmAsp3",
|
||||||
|
"name": "Mémoire eidétique",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Mémoire eidétique</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!prePolyphme0001.prePolyphmAsp3"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "prePolyphmAsp4",
|
||||||
|
"name": "Vision aiguisée",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Vision aiguisée</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!prePolyphme0001.prePolyphmAsp4"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
228
_source/pretires/Sedami_Alassane.json
Normal file
@@ -0,0 +1,228 @@
|
|||||||
|
{
|
||||||
|
"_id": "preSedami000001",
|
||||||
|
"_key": "!actors!preSedami000001",
|
||||||
|
"name": "Sèdami Alassane",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "La diplomate",
|
||||||
|
"metier": "Guerrière / diplomate",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 9,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "telepathie",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 4
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 1,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Sèdami est une femme d’âge mûr, confiante dans ses capacités et dotée d’un esprit très ouvert.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Ancienne officière des Mino du Dahomey, Sèdami s’est illustrée au combat comme en stratégie avant de devenir diplomate.</p><p>Fascinée par Célestopol lors d’une mission de courtoisie, elle a choisi de rester vivre sur la Lune, malgré la nostalgie de son pays natal.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "58 ans",
|
||||||
|
"genre": "Femme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Dahomey"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preSedami0Anom",
|
||||||
|
"name": "Télépathie",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "telepathie",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test d'<strong>Appréciation, Attraction, Échauffourée ou Faveur</strong>, le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p><p>Cette capacité fonctionne également sur les <strong>automates sophistiqués de 4e et 5e génération</strong>.</p>",
|
||||||
|
"narratif": "<p>Le protagoniste est capable de <strong>percevoir les pensées superficielles</strong> d'un tiers. Il peut comprendre l'état émotionnel d'une personne ou capter une image ou un mot dans son esprit (à la discrétion du narrateur), simplement en <em>l'observant</em>.</p>",
|
||||||
|
"exemples": "<ul><li>Percevoir l'image d'un cristal de cyanure dans l'esprit d'un serviteur soupçonné de tentative de meurtre.</li><li>Détecter, malgré un visage parfaitement contrôlé, qu'un magistrat est en réalité terrifié.</li><li>Ressentir la culpabilité d'un homme qui ment avec aplomb.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preSedami000001.preSedami0Anom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preSedami0Asp1",
|
||||||
|
"name": "Comportementaliste",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Comportementaliste</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preSedami000001.preSedami0Asp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preSedami0Asp2",
|
||||||
|
"name": "Stratège",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 2,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Stratège</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preSedami000001.preSedami0Asp2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
239
_source/pretires/Wiktoria_Razny.json
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
{
|
||||||
|
"_id": "preWiktoria001",
|
||||||
|
"_key": "!actors!preWiktoria001",
|
||||||
|
"name": "Wiktoria Raźny",
|
||||||
|
"type": "character",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/ui/logo_jeu.png",
|
||||||
|
"system": {
|
||||||
|
"concept": "La vétérane",
|
||||||
|
"metier": "Soldate",
|
||||||
|
"faction": "Agence du Lys blanc",
|
||||||
|
"initiative": 6,
|
||||||
|
"anomaly": {
|
||||||
|
"type": "illusion",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"stats": {
|
||||||
|
"ame": {
|
||||||
|
"label": "CELESTOPOL.Stat.ame",
|
||||||
|
"res": 0,
|
||||||
|
"artifice": {
|
||||||
|
"label": "CELESTOPOL.Skill.artifice",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"attraction": {
|
||||||
|
"label": "CELESTOPOL.Skill.attraction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"coercition": {
|
||||||
|
"label": "CELESTOPOL.Skill.coercition",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"faveur": {
|
||||||
|
"label": "CELESTOPOL.Skill.faveur",
|
||||||
|
"value": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"label": "CELESTOPOL.Stat.corps",
|
||||||
|
"res": 0,
|
||||||
|
"echauffouree": {
|
||||||
|
"label": "CELESTOPOL.Skill.echauffouree",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"effacement": {
|
||||||
|
"label": "CELESTOPOL.Skill.effacement",
|
||||||
|
"value": 3
|
||||||
|
},
|
||||||
|
"mobilite": {
|
||||||
|
"label": "CELESTOPOL.Skill.mobilite",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"prouesse": {
|
||||||
|
"label": "CELESTOPOL.Skill.prouesse",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"label": "CELESTOPOL.Stat.coeur",
|
||||||
|
"res": 0,
|
||||||
|
"appreciation": {
|
||||||
|
"label": "CELESTOPOL.Skill.appreciation",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"arts": {
|
||||||
|
"label": "CELESTOPOL.Skill.arts",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"inspiration": {
|
||||||
|
"label": "CELESTOPOL.Skill.inspiration",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"traque": {
|
||||||
|
"label": "CELESTOPOL.Skill.traque",
|
||||||
|
"value": 3
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"label": "CELESTOPOL.Stat.esprit",
|
||||||
|
"res": 0,
|
||||||
|
"instruction": {
|
||||||
|
"label": "CELESTOPOL.Skill.instruction",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"mtechnologique": {
|
||||||
|
"label": "CELESTOPOL.Skill.mtechnologique",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"raisonnement": {
|
||||||
|
"label": "CELESTOPOL.Skill.raisonnement",
|
||||||
|
"value": 2
|
||||||
|
},
|
||||||
|
"traitement": {
|
||||||
|
"label": "CELESTOPOL.Skill.traitement",
|
||||||
|
"value": 2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"blessures": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"destin": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"spleen": {
|
||||||
|
"lvl": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": {
|
||||||
|
"value": 2,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"fortune": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"reve": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
},
|
||||||
|
"vision": {
|
||||||
|
"value": 0,
|
||||||
|
"max": 4
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"police": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"okhrana": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"lunanovatek": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"oto": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"syndicats": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"vorovskoymir": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"cour": {
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso1": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
},
|
||||||
|
"perso2": {
|
||||||
|
"label": "",
|
||||||
|
"value": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"prefs": {
|
||||||
|
"rollMoonDie": false,
|
||||||
|
"difficulty": "normal"
|
||||||
|
},
|
||||||
|
"xp": {
|
||||||
|
"actuel": 0,
|
||||||
|
"log": []
|
||||||
|
},
|
||||||
|
"descriptionPhysique": "<p>Wiktoria est une Polonaise dégingandée portant un œil de verre à la place de l’œil perdu durant la guerre.</p>",
|
||||||
|
"descriptionPsychologique": "<p>Ancienne soldate de la Seconde Guerre de Crimée, Wiktoria a quitté la Pologne par dégoût après avoir été rejetée pour son handicap.</p><p>Amie d’Ernest et agente du Lys blanc, elle aime les soirées mondaines où elle glane des informations utiles tout en cultivant un goût affirmé pour la compagnie et l’élégance.</p>",
|
||||||
|
"historique": "",
|
||||||
|
"portraitImage": "",
|
||||||
|
"notes": "<p>Compétences reconstruites à partir des résistances, des aspects et de l'archétype du prétiré, la source PDF ne fournissant pas de dots de spécialisation différenciés de manière exploitable.</p>",
|
||||||
|
"biodata": {
|
||||||
|
"age": "39 ans",
|
||||||
|
"genre": "Femme",
|
||||||
|
"taille": "",
|
||||||
|
"yeux": "",
|
||||||
|
"naissance": "",
|
||||||
|
"cheveux": "",
|
||||||
|
"origine": "Pologne"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"_id": "preWiktoriAnom",
|
||||||
|
"name": "Illusion",
|
||||||
|
"type": "anomaly",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/anomaly.svg",
|
||||||
|
"system": {
|
||||||
|
"subtype": "illusion",
|
||||||
|
"level": 2,
|
||||||
|
"usesRemaining": 2,
|
||||||
|
"technique": "<p>Durant un scénario, lors d'un test de <strong>Coercition, Échauffourée, Effacement ou Traque</strong>, le protagoniste gagne la possibilité de relancer les 2d8 un nombre de fois égal à son Niveau d'Anomalie.</p><p>Il doit conserver le dernier résultat.</p>",
|
||||||
|
"narratif": "<p>Le protagoniste peut <strong>générer une petite illusion mineure</strong> — visuelle, auditive ou olfactive, au choix — sans détail ni précision, pour une durée d'<strong>une minute</strong>. L'illusion ne peut représenter un être vivant en détail et ne résiste pas à un examen rapproché.</p>",
|
||||||
|
"exemples": "<ul><li>Le son d'un chat qui miaule ou d'un livre qui tombe dans la pièce voisine.</li><li>Un reflet métallique ou une ombre fugace au bout d'un couloir.</li><li>L'odeur de la pluie ou d'une fumée inquiétante.</li></ul>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preWiktoria001.preWiktoriAnom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preWiktoriAsp1",
|
||||||
|
"name": "Affable",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Affable</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preWiktoria001.preWiktoriAsp1"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preWiktoriAsp2",
|
||||||
|
"name": "Grande",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Grande</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preWiktoria001.preWiktoriAsp2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"_id": "preWiktoriAsp3",
|
||||||
|
"name": "Expérience militaire",
|
||||||
|
"type": "aspect",
|
||||||
|
"img": "systems/fvtt-celestopol/assets/icons/aspect.svg",
|
||||||
|
"system": {
|
||||||
|
"valeur": 1,
|
||||||
|
"description": "<p>Aspect du prétiré : <strong>Expérience militaire</strong>.</p>"
|
||||||
|
},
|
||||||
|
"_key": "!actors.items!preWiktoria001.preWiktoriAsp3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"effects": [],
|
||||||
|
"folder": null,
|
||||||
|
"sort": 0,
|
||||||
|
"ownership": {
|
||||||
|
"default": 0
|
||||||
|
},
|
||||||
|
"flags": {}
|
||||||
|
}
|
||||||
BIN
assets/scenes/0iGCRqkdJKjmmbl4-thumb.webp
Normal file
|
After Width: | Height: | Size: 9.6 KiB |
BIN
assets/scenes/X3XJg7raEXtOFOtj-thumb.webp
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
BIN
assets/tokens/bao.webp.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
assets/tokens/elemia.webp
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
assets/tokens/maribel.webp
Normal file
|
After Width: | Height: | Size: 9.7 KiB |
BIN
assets/tokens/nadeja.webp
Normal file
|
After Width: | Height: | Size: 8.0 KiB |
BIN
assets/tokens/niels_bielke.webp
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
assets/tokens/polypheme.webp
Normal file
|
After Width: | Height: | Size: 8.7 KiB |
BIN
assets/tokens/sedami.webp
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
assets/tokens/wiktoria.webp
Normal file
|
After Width: | Height: | Size: 7.2 KiB |
BIN
assets/ui/celestopol_carte.webp
Normal file
|
After Width: | Height: | Size: 1.5 MiB |
BIN
debug_aspects_left.png
Normal file
|
After Width: | Height: | Size: 770 KiB |
BIN
debug_attributs.png
Normal file
|
After Width: | Height: | Size: 149 KiB |
BIN
debug_attributs2.png
Normal file
|
After Width: | Height: | Size: 423 KiB |
BIN
debug_blessures.png
Normal file
|
After Width: | Height: | Size: 324 KiB |
154
extract_pretires.py
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
import fitz, re, json
|
||||||
|
|
||||||
|
pdf_path = '/home/morr/work/uberwald/fvtt-celestopol/__regles/Célestopol 1922 Fiches de prêts à jouer v1_cdjdr.pdf'
|
||||||
|
doc = fitz.open(pdf_path)
|
||||||
|
|
||||||
|
def is_green(color, tol=0.008):
|
||||||
|
if not color: return False
|
||||||
|
return (abs(color[0]-0.131) < tol and abs(color[1]-0.284) < tol and abs(color[2]-0.160) < tol)
|
||||||
|
|
||||||
|
SKILL_LIST = ['ARTIFICE','ATTRACTION','COERCITION','FAVEUR',
|
||||||
|
'ÉCHAUFFOURÉE','EFFACEMENT','MOBILITÉ','PROUESSE',
|
||||||
|
'APPRÉCIATION','ARTS','INSPIRATION','TRAQUE',
|
||||||
|
'INSTRUCTION','MERV.TECH.','RAISONNEMENT','TRAITEMENT']
|
||||||
|
|
||||||
|
def norm(s):
|
||||||
|
return s.strip().upper().replace('É','E').replace('È','E').replace('Ê','E').replace('Ô','O').replace('Â','A').replace('Î','I').replace('Œ','OE').replace('.','')
|
||||||
|
|
||||||
|
def get_skill_values(page):
|
||||||
|
words = page.get_text("words")
|
||||||
|
skill_y = {}
|
||||||
|
for w in words:
|
||||||
|
wn = norm(w[4])
|
||||||
|
for sk in SKILL_LIST:
|
||||||
|
if wn == norm(sk) and w[0] < 430:
|
||||||
|
skill_y[sk] = (w[1]+w[3])/2
|
||||||
|
# MERV.TECH. special
|
||||||
|
for w in words:
|
||||||
|
if 'MERV' in w[4].upper() and w[0] < 430:
|
||||||
|
skill_y['MERV.TECH.'] = (w[1]+w[3])/2
|
||||||
|
|
||||||
|
green_circles = []
|
||||||
|
for d in page.get_drawings():
|
||||||
|
if is_green(d.get('fill')):
|
||||||
|
rect = d['rect']
|
||||||
|
ws = rect.x1 - rect.x0
|
||||||
|
if 5.5 < ws < 8.5:
|
||||||
|
green_circles.append(((rect.x0+rect.x1)/2, (rect.y0+rect.y1)/2))
|
||||||
|
|
||||||
|
skills = {}
|
||||||
|
for sk in SKILL_LIST:
|
||||||
|
sy = skill_y.get(sk, None)
|
||||||
|
if sy is not None:
|
||||||
|
skills[sk] = sum(1 for cx, cy in green_circles if abs(cy - sy) < 7)
|
||||||
|
else:
|
||||||
|
skills[sk] = 0
|
||||||
|
return skills
|
||||||
|
|
||||||
|
def get_resistances(page):
|
||||||
|
words = page.get_text("words")
|
||||||
|
domain_y = {}
|
||||||
|
for w in sorted(words, key=lambda x: x[1]):
|
||||||
|
t = norm(w[4])
|
||||||
|
x0 = w[0]
|
||||||
|
if t == 'AME' and 300 < x0 < 500:
|
||||||
|
domain_y['ame'] = w[1]
|
||||||
|
elif t == 'CORPS' and 300 < x0 < 500:
|
||||||
|
domain_y['corps'] = w[1]
|
||||||
|
elif t == 'COEUR' and 300 < x0 < 500:
|
||||||
|
domain_y['coeur'] = w[1]
|
||||||
|
elif t == 'ESPRIT' and 300 < x0 < 500:
|
||||||
|
domain_y['esprit'] = w[1]
|
||||||
|
res = {}
|
||||||
|
for dom, dy in domain_y.items():
|
||||||
|
for w in words:
|
||||||
|
if w[4].strip().isdigit() and w[0] > 480 and abs(w[1]-dy) < 35:
|
||||||
|
res[dom] = int(w[4].strip())
|
||||||
|
break
|
||||||
|
return res
|
||||||
|
|
||||||
|
def get_anomalie_name(stats_page):
|
||||||
|
# Extract from text: the anomalie name appears in the bottom-right of the page
|
||||||
|
# Parse cleanly using raw text
|
||||||
|
text = stats_page.get_text("text")
|
||||||
|
lines = [l.strip() for l in text.split('\n') if l.strip()]
|
||||||
|
|
||||||
|
skip_words = {'ANOMALIE','NV','RÉSISTANCE','RESISTANCE'}
|
||||||
|
skip_starts = ['pour ','lors ','gagner ','trouver ','éviter ','sortir ','obtenir ',
|
||||||
|
'lors d', 'Vider ', 'Gain ', 'en pui', 'pour ne', 'pour ré']
|
||||||
|
|
||||||
|
for i, line in enumerate(lines):
|
||||||
|
if 'ANOMALIE' in line.upper() or 'NV' in line:
|
||||||
|
# Look in next few lines for the name
|
||||||
|
for j in range(i+1, min(i+10, len(lines))):
|
||||||
|
l = lines[j]
|
||||||
|
if not any(l.startswith(s) for s in skip_starts) and l not in skip_words:
|
||||||
|
if l and l[0].isupper() and len(l) > 1:
|
||||||
|
return l
|
||||||
|
return "?"
|
||||||
|
|
||||||
|
def get_anomalie_niveau(stats_page):
|
||||||
|
words = stats_page.get_text("words")
|
||||||
|
for w in sorted(words, key=lambda x: (x[1],x[0])):
|
||||||
|
if w[4].strip().isdigit() and w[0] > 480 and w[1] > 650:
|
||||||
|
return int(w[4].strip())
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_char_base_info(stats_page):
|
||||||
|
blocks = stats_page.get_text("dict")["blocks"]
|
||||||
|
name = None
|
||||||
|
for block in blocks:
|
||||||
|
for line in block.get("lines", []):
|
||||||
|
for span in line.get("spans", []):
|
||||||
|
if span.get("size", 0) > 11 and 'Bold' in span.get("font",""):
|
||||||
|
y = span["origin"][1]
|
||||||
|
t = span["text"].strip()
|
||||||
|
if t and len(t) > 3 and 150 < y < 250:
|
||||||
|
name = t
|
||||||
|
return {'name': name}
|
||||||
|
|
||||||
|
def get_raw_text(page):
|
||||||
|
html = page.get_text("html")
|
||||||
|
clean = re.sub(r'<[^>]+>', ' ', html)
|
||||||
|
clean = re.sub(r'&#x([0-9a-fA-F]+);', lambda m: chr(int(m.group(1),16)), clean)
|
||||||
|
clean = re.sub(r'&#([0-9]+);', lambda m: chr(int(m.group(1))), clean)
|
||||||
|
return re.sub(r'\s+', ' ', clean).strip()
|
||||||
|
|
||||||
|
def parse_aspects_page(asp_page):
|
||||||
|
text = asp_page.get_text("text")
|
||||||
|
lines = [l.strip() for l in text.split('\n') if l.strip()]
|
||||||
|
return lines
|
||||||
|
|
||||||
|
# Characters: (name_idx, anom_desc_idx, stats_idx, aspects_idx)
|
||||||
|
CHARACTERS = [
|
||||||
|
(0, 1, 2, 3),
|
||||||
|
(4, 5, 6, 7),
|
||||||
|
(8, 9, 10, 11),
|
||||||
|
(12, 13, 14, 15),
|
||||||
|
(16, 17, 18, 19),
|
||||||
|
(20, 21, 22, 23),
|
||||||
|
(24, 25, 26, 27),
|
||||||
|
(28, 29, 30, 31),
|
||||||
|
]
|
||||||
|
|
||||||
|
for n_idx, a_idx, s_idx, asp_idx in CHARACTERS:
|
||||||
|
sp = doc[s_idx]
|
||||||
|
skills = get_skill_values(sp)
|
||||||
|
res = get_resistances(sp)
|
||||||
|
anom_name = get_anomalie_name(sp)
|
||||||
|
anom_nv = get_anomalie_niveau(sp)
|
||||||
|
char_info = get_char_base_info(sp)
|
||||||
|
anom_desc = get_raw_text(doc[a_idx])
|
||||||
|
asp_lines = parse_aspects_page(doc[asp_idx])
|
||||||
|
|
||||||
|
print(f"\n{'='*70}")
|
||||||
|
print(f"NAME: {char_info.get('name','?')}")
|
||||||
|
print(f"SKILLS: {json.dumps(skills, ensure_ascii=False)}")
|
||||||
|
print(f"RESISTANCES: {res}")
|
||||||
|
print(f"ANOMALIE: {anom_name} nv{anom_nv}")
|
||||||
|
print(f"ANOM DESC (first 300 chars): {anom_desc[:300]}")
|
||||||
|
print("ASPECTS LINES:")
|
||||||
|
for i,l in enumerate(asp_lines[:60]): print(f" {i:2d}: {l}")
|
||||||
|
|
||||||
|
doc.close()
|
||||||
|
print("\nDONE")
|
||||||
@@ -39,7 +39,9 @@ import {
|
|||||||
} from "./module/applications/_module.mjs"
|
} from "./module/applications/_module.mjs"
|
||||||
|
|
||||||
const DAMAGE_APPLICATION_FLAG = "damageApplication"
|
const DAMAGE_APPLICATION_FLAG = "damageApplication"
|
||||||
|
const MOON_EFFECT_FLAG = "moonEffectApplied"
|
||||||
const FACTION_ASPECT_STATE_SETTING = "factionAspectState"
|
const FACTION_ASPECT_STATE_SETTING = "factionAspectState"
|
||||||
|
const PREGENS_IMPORTED_SETTING = "pregensImported"
|
||||||
const WELCOME_SCENE_IMPORTED_SETTING = "welcomeSceneImported"
|
const WELCOME_SCENE_IMPORTED_SETTING = "welcomeSceneImported"
|
||||||
|
|
||||||
/* ─── Init hook ──────────────────────────────────────────────────────────── */
|
/* ─── Init hook ──────────────────────────────────────────────────────────── */
|
||||||
@@ -172,6 +174,9 @@ Hooks.once("ready", async () => {
|
|||||||
if (foundry.utils.hasProperty(changed, `flags.${SYSTEM_ID}.${DAMAGE_APPLICATION_FLAG}`)) {
|
if (foundry.utils.hasProperty(changed, `flags.${SYSTEM_ID}.${DAMAGE_APPLICATION_FLAG}`)) {
|
||||||
_updateRenderedChatMessageState(message)
|
_updateRenderedChatMessageState(message)
|
||||||
}
|
}
|
||||||
|
if (foundry.utils.hasProperty(changed, `flags.${SYSTEM_ID}.${MOON_EFFECT_FLAG}`)) {
|
||||||
|
_updateRenderedMoonEffectState(message)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
_activateExistingChatCards()
|
_activateExistingChatCards()
|
||||||
|
|
||||||
@@ -179,7 +184,9 @@ Hooks.once("ready", async () => {
|
|||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
_migrateObsoleteItems()
|
_migrateObsoleteItems()
|
||||||
_migrateIntegerTracks()
|
_migrateIntegerTracks()
|
||||||
_setupAnomaliesFolder()
|
_migrateBiographyFields()
|
||||||
|
await _setupAnomaliesFolder()
|
||||||
|
await _setupPregensFolder()
|
||||||
await _setupWelcomeScene()
|
await _setupWelcomeScene()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -271,6 +278,31 @@ async function _migrateIntegerTracks() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Migration : ajoute les champs de biographie manquants sur les fiches existantes. */
|
||||||
|
async function _migrateBiographyFields() {
|
||||||
|
const actors = game.actors.contents.filter(actor => ["character", "npc"].includes(actor.type))
|
||||||
|
|
||||||
|
for (const actor of actors) {
|
||||||
|
const src = actor._source?.system
|
||||||
|
if (!src) continue
|
||||||
|
|
||||||
|
const updateData = {}
|
||||||
|
|
||||||
|
if (actor.type === "character" && !("historique" in src)) {
|
||||||
|
updateData["system.historique"] = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!("portraitImage" in src)) {
|
||||||
|
updateData["system.portraitImage"] = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(updateData).length > 0) {
|
||||||
|
console.log(`${SYSTEM_ID} | Migration biographie : ${actor.name}`, updateData)
|
||||||
|
await actor.update(updateData)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ─── Handlebars helpers ─────────────────────────────────────────────────── */
|
/* ─── Handlebars helpers ─────────────────────────────────────────────────── */
|
||||||
|
|
||||||
function _registerHandlebarsHelpers() {
|
function _registerHandlebarsHelpers() {
|
||||||
@@ -347,6 +379,12 @@ function _registerSettings() {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
})
|
})
|
||||||
|
game.settings.register(SYSTEM_ID, PREGENS_IMPORTED_SETTING, {
|
||||||
|
scope: "world",
|
||||||
|
config: false,
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
})
|
||||||
game.settings.register(SYSTEM_ID, FACTION_ASPECT_STATE_SETTING, {
|
game.settings.register(SYSTEM_ID, FACTION_ASPECT_STATE_SETTING, {
|
||||||
scope: "world",
|
scope: "world",
|
||||||
config: false,
|
config: false,
|
||||||
@@ -428,6 +466,34 @@ async function _setupWelcomeScene() {
|
|||||||
await game.settings.set(SYSTEM_ID, WELCOME_SCENE_IMPORTED_SETTING, true)
|
await game.settings.set(SYSTEM_ID, WELCOME_SCENE_IMPORTED_SETTING, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function _setupPregensFolder() {
|
||||||
|
const activeGM = game.users.activeGM
|
||||||
|
if (!game.user.isGM || (activeGM && activeGM.id !== game.user.id)) return
|
||||||
|
if (game.settings.get(SYSTEM_ID, PREGENS_IMPORTED_SETTING)) return
|
||||||
|
|
||||||
|
const pack = game.packs.get(`${SYSTEM_ID}.pretires`)
|
||||||
|
if (!pack) {
|
||||||
|
console.warn(`${SYSTEM_ID} | Compendium de prétirés introuvable`)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const folderName = game.i18n.localize("CELESTOPOL.Pregens.folderName")
|
||||||
|
let folder = game.folders.contents.find(f => f.type === "Actor" && f.name === folderName)
|
||||||
|
if (!folder) {
|
||||||
|
folder = await Folder.create({
|
||||||
|
name: folderName,
|
||||||
|
type: "Actor",
|
||||||
|
color: "#1b3828",
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`${SYSTEM_ID} | Premier lancement : import des prétirés dans le monde`)
|
||||||
|
await pack.importAll({ folderId: folder.id, keepId: true })
|
||||||
|
await game.settings.set(SYSTEM_ID, PREGENS_IMPORTED_SETTING, true)
|
||||||
|
console.log(`${SYSTEM_ID} | Prétirés importés avec succès dans le dossier "${folder.name}"`)
|
||||||
|
ui.notifications.info(game.i18n.localize("CELESTOPOL.Pregens.imported"))
|
||||||
|
}
|
||||||
|
|
||||||
/* ─── Template preload ───────────────────────────────────────────────────── */
|
/* ─── Template preload ───────────────────────────────────────────────────── */
|
||||||
|
|
||||||
function _preloadTemplates() {
|
function _preloadTemplates() {
|
||||||
@@ -486,8 +552,9 @@ function _activateExistingChatCards() {
|
|||||||
document.querySelectorAll(".message[data-message-id]").forEach(messageEl => {
|
document.querySelectorAll(".message[data-message-id]").forEach(messageEl => {
|
||||||
const messageId = messageEl.dataset.messageId
|
const messageId = messageEl.dataset.messageId
|
||||||
const message = game.messages.get(messageId)
|
const message = game.messages.get(messageId)
|
||||||
const root = messageEl.querySelector(".celestopol.chat-roll")
|
if (!message) return
|
||||||
if (!message || !root) return
|
const root = messageEl.querySelector(".celestopol.chat-roll, .celestopol-roll.moon-standalone-card")
|
||||||
|
if (!root) return
|
||||||
_activateChatCardListeners(message, root)
|
_activateChatCardListeners(message, root)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -497,12 +564,19 @@ function _activateChatCardListeners(message, html) {
|
|||||||
if (!root) return
|
if (!root) return
|
||||||
|
|
||||||
_renderWeaponDamageState(message, root)
|
_renderWeaponDamageState(message, root)
|
||||||
|
_renderMoonEffectState(message, root)
|
||||||
|
|
||||||
root.querySelectorAll('[data-action="apply-weapon-damage"]').forEach(button => {
|
root.querySelectorAll('[data-action="apply-weapon-damage"]').forEach(button => {
|
||||||
if (button.dataset.bound === "true") return
|
if (button.dataset.bound === "true") return
|
||||||
button.dataset.bound = "true"
|
button.dataset.bound = "true"
|
||||||
button.addEventListener("click", event => _onApplyWeaponDamageClick(event, message))
|
button.addEventListener("click", event => _onApplyWeaponDamageClick(event, message))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
root.querySelectorAll('[data-action="apply-moon-effect"]').forEach(button => {
|
||||||
|
if (button.dataset.bound === "true") return
|
||||||
|
button.dataset.bound = "true"
|
||||||
|
button.addEventListener("click", event => _onApplyMoonEffectClick(event, message))
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _onApplyWeaponDamageClick(event, message) {
|
async function _onApplyWeaponDamageClick(event, message) {
|
||||||
@@ -510,8 +584,10 @@ async function _onApplyWeaponDamageClick(event, message) {
|
|||||||
|
|
||||||
const button = event.currentTarget
|
const button = event.currentTarget
|
||||||
const card = button.closest(".celestopol.chat-roll")
|
const card = button.closest(".celestopol.chat-roll")
|
||||||
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorId"]')
|
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorUuid"]')
|
||||||
const actorId = button.dataset.actorId || select?.value || ""
|
const selectedOption = select?.selectedOptions?.[0] ?? null
|
||||||
|
const actorUuid = button.dataset.actorUuid || select?.value || ""
|
||||||
|
const actorId = button.dataset.actorId || selectedOption?.dataset.actorId || ""
|
||||||
const incomingWounds = Number.parseInt(button.dataset.incomingWounds ?? "", 10)
|
const incomingWounds = Number.parseInt(button.dataset.incomingWounds ?? "", 10)
|
||||||
const currentState = _getDamageApplicationState(message)
|
const currentState = _getDamageApplicationState(message)
|
||||||
|
|
||||||
@@ -520,7 +596,7 @@ async function _onApplyWeaponDamageClick(event, message) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!actorId) {
|
if (!actorUuid && !actorId) {
|
||||||
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Combat.selectCharacterFirst"))
|
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Combat.selectCharacterFirst"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -531,14 +607,15 @@ async function _onApplyWeaponDamageClick(event, message) {
|
|||||||
button.disabled = true
|
button.disabled = true
|
||||||
await _requestWeaponDamageApplication({
|
await _requestWeaponDamageApplication({
|
||||||
actorId,
|
actorId,
|
||||||
|
actorUuid,
|
||||||
incomingWounds,
|
incomingWounds,
|
||||||
chatMessageId: message?.id ?? null,
|
chatMessageId: message?.id ?? null,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMessageId = null }) {
|
async function _requestWeaponDamageApplication({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
|
||||||
if (game.user.isGM) {
|
if (game.user.isGM) {
|
||||||
return _applyWeaponDamage({ actorId, incomingWounds, chatMessageId })
|
return _applyWeaponDamage({ actorId, actorUuid, incomingWounds, chatMessageId })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!game.socket) return
|
if (!game.socket) return
|
||||||
@@ -546,6 +623,7 @@ async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMe
|
|||||||
game.socket.emit(`system.${SYSTEM_ID}`, {
|
game.socket.emit(`system.${SYSTEM_ID}`, {
|
||||||
type: "applyWeaponDamage",
|
type: "applyWeaponDamage",
|
||||||
actorId,
|
actorId,
|
||||||
|
actorUuid,
|
||||||
incomingWounds,
|
incomingWounds,
|
||||||
chatMessageId,
|
chatMessageId,
|
||||||
})
|
})
|
||||||
@@ -583,7 +661,7 @@ function _setDamageStatus(root, { text, cssClass = "" }) {
|
|||||||
|
|
||||||
function _renderPendingWeaponDamageState(root) {
|
function _renderPendingWeaponDamageState(root) {
|
||||||
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
||||||
const select = root.querySelector('select[name="targetActorId"]')
|
const select = root.querySelector('select[name="targetActorUuid"]')
|
||||||
if (button) {
|
if (button) {
|
||||||
button.disabled = true
|
button.disabled = true
|
||||||
button.textContent = game.i18n.localize("CELESTOPOL.Combat.damageApplying")
|
button.textContent = game.i18n.localize("CELESTOPOL.Combat.damageApplying")
|
||||||
@@ -597,7 +675,7 @@ function _renderPendingWeaponDamageState(root) {
|
|||||||
|
|
||||||
function _renderWeaponDamageState(message, root) {
|
function _renderWeaponDamageState(message, root) {
|
||||||
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
const button = root.querySelector('[data-action="apply-weapon-damage"]')
|
||||||
const select = root.querySelector('select[name="targetActorId"]')
|
const select = root.querySelector('select[name="targetActorUuid"]')
|
||||||
const state = _getDamageApplicationState(message)
|
const state = _getDamageApplicationState(message)
|
||||||
|
|
||||||
if (!state?.applied) {
|
if (!state?.applied) {
|
||||||
@@ -639,8 +717,8 @@ async function _markChatMessageDamageApplied(chatMessageId, data) {
|
|||||||
_updateRenderedChatMessageState(message)
|
_updateRenderedChatMessageState(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function _applyWeaponDamage({ actorId, incomingWounds, chatMessageId = null }) {
|
async function _applyWeaponDamage({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
|
||||||
const actor = game.actors.get(actorId)
|
const actor = await CelestopolRoll.resolveActor({ actorId, actorUuid })
|
||||||
if (!actor) return null
|
if (!actor) return null
|
||||||
|
|
||||||
const message = chatMessageId ? game.messages.get(chatMessageId) : null
|
const message = chatMessageId ? game.messages.get(chatMessageId) : null
|
||||||
@@ -680,6 +758,126 @@ async function _applyWeaponDamage({ actorId, incomingWounds, chatMessageId = nul
|
|||||||
return { actorName: actor.name, appliedWounds, armorProtection }
|
return { actorName: actor.name, appliedWounds, armorProtection }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ─── Dé de la Lune — contreparties ─────────────────────────────────────── */
|
||||||
|
|
||||||
|
function _getMoonEffectState(message) {
|
||||||
|
return message?.getFlag(SYSTEM_ID, MOON_EFFECT_FLAG) ?? null
|
||||||
|
}
|
||||||
|
|
||||||
|
function _renderMoonEffectState(message, root) {
|
||||||
|
const state = _getMoonEffectState(message)
|
||||||
|
const actionsDiv = root.querySelector(".moon-effect-actions")
|
||||||
|
if (!actionsDiv) return
|
||||||
|
|
||||||
|
if (!state?.applied) return
|
||||||
|
|
||||||
|
const NEGATIVE_EFFECTS = new Set(["lose-anomaly", "gain-spleen", "lose-destin"])
|
||||||
|
|
||||||
|
// Désactiver tous les boutons et afficher le statut
|
||||||
|
actionsDiv.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = true })
|
||||||
|
|
||||||
|
let statusEl = actionsDiv.querySelector(".moon-effect-applied-status")
|
||||||
|
if (!statusEl) {
|
||||||
|
statusEl = document.createElement("span")
|
||||||
|
actionsDiv.append(statusEl)
|
||||||
|
}
|
||||||
|
statusEl.className = "moon-effect-applied-status" + (NEGATIVE_EFFECTS.has(state.effect) ? " is-negative" : "")
|
||||||
|
statusEl.textContent = state.effectLabel
|
||||||
|
? game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: state.effectLabel })
|
||||||
|
: game.i18n.localize("CELESTOPOL.Moon.effectApplied")
|
||||||
|
}
|
||||||
|
|
||||||
|
function _updateRenderedMoonEffectState(message) {
|
||||||
|
const msgEl = document.querySelector(`.message[data-message-id="${message.id}"]`)
|
||||||
|
if (!msgEl) return
|
||||||
|
const root = msgEl.querySelector(".celestopol.chat-roll, .celestopol-roll.moon-standalone-card")
|
||||||
|
if (!root) return
|
||||||
|
_renderMoonEffectState(message, root)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function _onApplyMoonEffectClick(event, message) {
|
||||||
|
event.preventDefault()
|
||||||
|
const state = _getMoonEffectState(message)
|
||||||
|
if (state?.applied) return
|
||||||
|
|
||||||
|
const button = event.currentTarget
|
||||||
|
const effect = button.dataset.effect
|
||||||
|
const actionsDiv = button.closest(".moon-effect-actions")
|
||||||
|
const actorId = actionsDiv?.dataset.moonActorId ?? ""
|
||||||
|
const actorUuid = actionsDiv?.dataset.moonActorUuid ?? ""
|
||||||
|
|
||||||
|
// Désactiver immédiatement pour éviter les double-clics
|
||||||
|
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = true })
|
||||||
|
|
||||||
|
const actor = await CelestopolRoll.resolveActor({ actorId, actorUuid })
|
||||||
|
if (!actor) {
|
||||||
|
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Moon.actorNotFound"))
|
||||||
|
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = false })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const effectLabel = await _applyMoonEffect(actor, effect)
|
||||||
|
if (effectLabel === null) {
|
||||||
|
actionsDiv?.querySelectorAll(".moon-effect-btn").forEach(btn => { btn.disabled = false })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
await message.setFlag(SYSTEM_ID, MOON_EFFECT_FLAG, { applied: true, effect, effectLabel })
|
||||||
|
}
|
||||||
|
|
||||||
|
async function _applyMoonEffect(actor, effect) {
|
||||||
|
const i18n = key => game.i18n.localize(`CELESTOPOL.Moon.${key}`)
|
||||||
|
const anomaly = actor.items.find(i => i.type === "anomaly")
|
||||||
|
|
||||||
|
switch (effect) {
|
||||||
|
case "regain-anomaly": {
|
||||||
|
if (!anomaly) { ui.notifications.warn(i18n("noAnomaly")); return null }
|
||||||
|
const max = anomaly.system?.level ?? 0
|
||||||
|
const cur = anomaly.system?.usesRemaining ?? 0
|
||||||
|
if (cur >= max) { ui.notifications.warn(i18n("anomalyFull")); return null }
|
||||||
|
await anomaly.update({ "system.usesRemaining": Math.min(max, cur + 1) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectRegainAnomaly") }))
|
||||||
|
return i18n("effectRegainAnomaly")
|
||||||
|
}
|
||||||
|
case "lose-spleen": {
|
||||||
|
const cur = actor.system?.spleen?.lvl ?? 0
|
||||||
|
if (cur <= 0) { ui.notifications.warn(i18n("spleenEmpty")); return null }
|
||||||
|
await actor.update({ "system.spleen.lvl": Math.max(0, cur - 1) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseSpleen") }))
|
||||||
|
return i18n("effectLoseSpleen")
|
||||||
|
}
|
||||||
|
case "gain-destin": {
|
||||||
|
const cur = actor.system?.destin?.lvl ?? 0
|
||||||
|
await actor.update({ "system.destin.lvl": Math.min(8, cur + 2) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectGainDestin") }))
|
||||||
|
return i18n("effectGainDestin")
|
||||||
|
}
|
||||||
|
case "lose-destin": {
|
||||||
|
const cur = actor.system?.destin?.lvl ?? 0
|
||||||
|
await actor.update({ "system.destin.lvl": Math.max(0, cur - 2) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseDestin") }))
|
||||||
|
return i18n("effectLoseDestin")
|
||||||
|
}
|
||||||
|
case "lose-anomaly": {
|
||||||
|
if (!anomaly) { ui.notifications.warn(i18n("noAnomaly")); return null }
|
||||||
|
const cur = anomaly.system?.usesRemaining ?? 0
|
||||||
|
if (cur <= 0) { ui.notifications.warn(i18n("anomalyEmpty")); return null }
|
||||||
|
await anomaly.update({ "system.usesRemaining": Math.max(0, cur - 1) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectLoseAnomaly") }))
|
||||||
|
return i18n("effectLoseAnomaly")
|
||||||
|
}
|
||||||
|
case "gain-spleen": {
|
||||||
|
const cur = actor.system?.spleen?.lvl ?? 0
|
||||||
|
if (cur >= 8) { ui.notifications.warn(i18n("spleenFull")); return null }
|
||||||
|
await actor.update({ "system.spleen.lvl": Math.min(8, cur + 1) })
|
||||||
|
ui.notifications.info(game.i18n.format("CELESTOPOL.Moon.effectApplied", { label: i18n("effectGainSpleen") }))
|
||||||
|
return i18n("effectGainSpleen")
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function _getDefaultFactionAspectState() {
|
function _getDefaultFactionAspectState() {
|
||||||
return {
|
return {
|
||||||
pointsMax: 8,
|
pointsMax: 8,
|
||||||
|
|||||||
46
lang/fr.json
@@ -20,6 +20,14 @@
|
|||||||
"anomaly": "Anomalie",
|
"anomaly": "Anomalie",
|
||||||
"descriptionPhysique": "Description physique",
|
"descriptionPhysique": "Description physique",
|
||||||
"descriptionPsychologique": "Description psychologique",
|
"descriptionPsychologique": "Description psychologique",
|
||||||
|
"historique": "Historique",
|
||||||
|
"portraitImage": "Image de portrait",
|
||||||
|
"portraitImagePlaceholder": "Chemin vers une image verticale…",
|
||||||
|
"portraitImageHint": "Cette image est indépendante du portrait affiché dans l’en-tête de la fiche.",
|
||||||
|
"portraitImageEmpty": "Aucun portrait biographique distinct n’est encore renseigné.",
|
||||||
|
"portraitImageMissing": "Aucun portrait biographique distinct n’est disponible pour cette fiche.",
|
||||||
|
"sendPortraitToChat": "Envoyer dans le tchat",
|
||||||
|
"portraitChatTitle": "Portrait",
|
||||||
"notes": "Notes",
|
"notes": "Notes",
|
||||||
"metier": "Métier",
|
"metier": "Métier",
|
||||||
"origine": "Origine",
|
"origine": "Origine",
|
||||||
@@ -194,19 +202,23 @@
|
|||||||
"Combat": {
|
"Combat": {
|
||||||
"initiative": "Initiative",
|
"initiative": "Initiative",
|
||||||
"attack": "Attaquer",
|
"attack": "Attaquer",
|
||||||
|
"unarmedAttack": "Attaque à main nue",
|
||||||
|
"baseActions": "Actions de base",
|
||||||
|
"baseRangedDefense": "Esquive d'attaque à distance",
|
||||||
|
"rangedAttack": "Attaque à distance",
|
||||||
"corpsPnj": "Corps du PNJ",
|
"corpsPnj": "Corps du PNJ",
|
||||||
"tie": "ÉGALITÉ",
|
"tie": "ÉGALITÉ",
|
||||||
"tieDesc": "Personne n'est blessé",
|
"tieDesc": "Personne n'est blessé",
|
||||||
"successHit": "Attaque réussie — cible touchée",
|
"successHit": "Attaque réussie — cible touchée",
|
||||||
"failureHit": "Joueur touché — 1 blessure (mêlée)",
|
"failureHit": "Joueur touché — dégâts de l'arme appliqués (mêlée)",
|
||||||
"distanceNoWound": "Raté — pas de riposte",
|
"distanceNoWound": "Raté — pas de riposte",
|
||||||
"weaponDamage": "dégâts supplémentaires",
|
"weaponDamage": "dégâts supplémentaires",
|
||||||
"playerWounded": "Blessure infligée au joueur (mêlée)",
|
"playerWounded": "Blessures infligées au joueur (mêlée)",
|
||||||
"rangedDefenseTitle": "Esquiver (Mobilité)",
|
"rangedDefenseTitle": "Esquiver (Mobilité)",
|
||||||
"rangedDefenseTag": "Défense à distance",
|
"rangedDefenseTag": "Défense à distance",
|
||||||
"rangedDefenseSuccess": "Attaque esquivée — pas de blessure",
|
"rangedDefenseSuccess": "Attaque esquivée — pas de blessure",
|
||||||
"rangedDefenseFailure": "Touché par le PNJ — 1 blessure",
|
"rangedDefenseFailure": "Touché par le PNJ — dégâts de l'arme appliqués",
|
||||||
"rangedDefensePlayerWounded": "Blessure infligée par attaque à distance",
|
"rangedDefensePlayerWounded": "Blessures infligées par attaque à distance",
|
||||||
"targetLabel": "Cible",
|
"targetLabel": "Cible",
|
||||||
"targetAuto": "Saisir manuellement",
|
"targetAuto": "Saisir manuellement",
|
||||||
"targetCharacterLabel": "Personnage visé",
|
"targetCharacterLabel": "Personnage visé",
|
||||||
@@ -240,6 +252,7 @@
|
|||||||
"competences": "Domaines",
|
"competences": "Domaines",
|
||||||
"blessures": "Jauges",
|
"blessures": "Jauges",
|
||||||
"factions": "Factions",
|
"factions": "Factions",
|
||||||
|
"combat": "Combat",
|
||||||
"equipement": "Équipement",
|
"equipement": "Équipement",
|
||||||
"biography": "Biographie",
|
"biography": "Biographie",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
@@ -337,7 +350,22 @@
|
|||||||
"mauvaiseFortune": "🔴 Mauvaise Fortune",
|
"mauvaiseFortune": "🔴 Mauvaise Fortune",
|
||||||
"chanceInterpret": "Chance",
|
"chanceInterpret": "Chance",
|
||||||
"narrativeInterpret": "Narratif",
|
"narrativeInterpret": "Narratif",
|
||||||
"quantiteHint": "Valeur"
|
"quantiteHint": "Valeur",
|
||||||
|
"applyChoose": "Choisissez la contrepartie :",
|
||||||
|
"effectNarrativeOnly": "(Narratif — sans effet mécanique)",
|
||||||
|
"effectRegainAnomaly": "🌟 Regain d'1 Anomalie",
|
||||||
|
"effectLoseSpleen": "💚 Perte d'1 Spleen",
|
||||||
|
"effectGainDestin": "⭐ Gain de 2 Destin",
|
||||||
|
"effectLoseDestin": "⭐ Perte de 2 Destin",
|
||||||
|
"effectLoseAnomaly": "❌ Perte d'1 Anomalie",
|
||||||
|
"effectGainSpleen": "💔 Gain d'1 Spleen",
|
||||||
|
"effectApplied": "Contrepartie appliquée : {label}",
|
||||||
|
"noAnomaly": "Ce personnage n'a pas d'anomalie",
|
||||||
|
"anomalyFull": "L'anomalie est déjà au maximum d'utilisations",
|
||||||
|
"anomalyEmpty": "L'anomalie n'a plus d'utilisation disponible",
|
||||||
|
"spleenEmpty": "Le Spleen est déjà à 0",
|
||||||
|
"spleenFull": "Le Spleen est déjà au maximum",
|
||||||
|
"actorNotFound": "Personnage introuvable"
|
||||||
},
|
},
|
||||||
"Difficulty": {
|
"Difficulty": {
|
||||||
"unknown": "Aucun seuil",
|
"unknown": "Aucun seuil",
|
||||||
@@ -413,6 +441,10 @@
|
|||||||
"helpFallback": "Célestopol 1922 — Aides de jeu",
|
"helpFallback": "Célestopol 1922 — Aides de jeu",
|
||||||
"bookLinkLabel": "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
"bookLinkLabel": "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
},
|
},
|
||||||
|
"Pregens": {
|
||||||
|
"folderName": "Prétirés",
|
||||||
|
"imported": "Célestopol 1922 | Prétirés importés dans le dossier Acteurs."
|
||||||
|
},
|
||||||
"ChatCard": {
|
"ChatCard": {
|
||||||
"rollFor": "Jet de {skill} ({stat})"
|
"rollFor": "Jet de {skill} ({stat})"
|
||||||
},
|
},
|
||||||
@@ -432,7 +464,9 @@
|
|||||||
"rangeLongue": "Longue portée",
|
"rangeLongue": "Longue portée",
|
||||||
"type": "Type",
|
"type": "Type",
|
||||||
"typeMelee": "Mêlée",
|
"typeMelee": "Mêlée",
|
||||||
"typeDistance": "Distance"
|
"typeDistance": "Distance",
|
||||||
|
"equip": "Équiper",
|
||||||
|
"unequip": "Retirer"
|
||||||
},
|
},
|
||||||
"Armure": {
|
"Armure": {
|
||||||
"protection": "Protection",
|
"protection": "Protection",
|
||||||
|
|||||||
@@ -34,15 +34,19 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
dragDrop: [{ dragSelector: '[data-drag="true"], .rollable', dropSelector: null }],
|
dragDrop: [{ dragSelector: '[data-drag="true"], .rollable', dropSelector: null }],
|
||||||
actions: {
|
actions: {
|
||||||
editImage: CelestopolActorSheet.#onEditImage,
|
editImage: CelestopolActorSheet.#onEditImage,
|
||||||
|
sendBiographyPortrait: CelestopolActorSheet.#onSendBiographyPortrait,
|
||||||
toggleSheet: CelestopolActorSheet.#onToggleSheet,
|
toggleSheet: CelestopolActorSheet.#onToggleSheet,
|
||||||
edit: CelestopolActorSheet.#onItemEdit,
|
edit: CelestopolActorSheet.#onItemEdit,
|
||||||
delete: CelestopolActorSheet.#onItemDelete,
|
delete: CelestopolActorSheet.#onItemDelete,
|
||||||
attack: CelestopolActorSheet.#onAttack,
|
attack: CelestopolActorSheet.#onAttack,
|
||||||
rangedDefense: CelestopolActorSheet.#onRangedDefense,
|
rangedDefense: CelestopolActorSheet.#onRangedDefense,
|
||||||
|
unarmedAttack: CelestopolActorSheet.#onUnarmedAttack,
|
||||||
|
baseRangedDefense: CelestopolActorSheet.#onBaseRangedDefense,
|
||||||
trackBox: CelestopolActorSheet.#onTrackBox,
|
trackBox: CelestopolActorSheet.#onTrackBox,
|
||||||
skillLevel: CelestopolActorSheet.#onSkillLevel,
|
skillLevel: CelestopolActorSheet.#onSkillLevel,
|
||||||
factionLevel: CelestopolActorSheet.#onFactionLevel,
|
factionLevel: CelestopolActorSheet.#onFactionLevel,
|
||||||
toggleArmure: CelestopolActorSheet.#onToggleArmure,
|
toggleArmure: CelestopolActorSheet.#onToggleArmure,
|
||||||
|
toggleWeapon: CelestopolActorSheet.#onToggleWeapon,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -136,6 +140,35 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
return fp.browse()
|
return fp.browse()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onSendBiographyPortrait() {
|
||||||
|
const portrait = this.document.system?.portraitImage || ""
|
||||||
|
if (!portrait) {
|
||||||
|
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Actor.portraitImageMissing"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawContent = `
|
||||||
|
<div class="cel-portrait-message chat-system-card">
|
||||||
|
<div class="portrait-message-header">
|
||||||
|
<span class="portrait-message-mark">✦</span>
|
||||||
|
<span class="portrait-message-title">${game.i18n.localize("CELESTOPOL.Actor.portraitChatTitle")}</span>
|
||||||
|
</div>
|
||||||
|
<div class="portrait-message-body">
|
||||||
|
<div class="portrait-message-name">${foundry.utils.escapeHTML(this.document.name)}</div>
|
||||||
|
<div class="portrait-message-frame">
|
||||||
|
<img src="${portrait}" alt="${foundry.utils.escapeHTML(this.document.name)}" class="portrait-message-image">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
|
||||||
|
await ChatMessage.create({
|
||||||
|
speaker: ChatMessage.getSpeaker({ actor: this.document }),
|
||||||
|
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||||
|
content: await foundry.applications.ux.TextEditor.implementation.enrichHTML(rawContent, { async: true }),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
static #onToggleSheet() {
|
static #onToggleSheet() {
|
||||||
const modes = this.constructor.SHEET_MODES
|
const modes = this.constructor.SHEET_MODES
|
||||||
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
|
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
|
||||||
@@ -167,6 +200,16 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
await this.document.system.rollRangedDefense(itemId)
|
await this.document.system.rollRangedDefense(itemId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onUnarmedAttack() {
|
||||||
|
if (typeof this.document.system.rollUnarmedAttack !== "function") return
|
||||||
|
await this.document.system.rollUnarmedAttack()
|
||||||
|
}
|
||||||
|
|
||||||
|
static async #onBaseRangedDefense() {
|
||||||
|
if (typeof this.document.system.rollRangedDefenseBase !== "function") return
|
||||||
|
await this.document.system.rollRangedDefenseBase()
|
||||||
|
}
|
||||||
|
|
||||||
/** Met à jour une jauge de piste (blessures/destin/spleen) par clic sur une case. */
|
/** Met à jour une jauge de piste (blessures/destin/spleen) par clic sur une case. */
|
||||||
static #onTrackBox(_event, target) {
|
static #onTrackBox(_event, target) {
|
||||||
if (!this.isEditable) return
|
if (!this.isEditable) return
|
||||||
@@ -195,6 +238,13 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
|
|||||||
if (item?.type === "armure") await item.update({ "system.equipped": !item.system.equipped })
|
if (item?.type === "armure") await item.update({ "system.equipped": !item.system.equipped })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #onToggleWeapon(_event, target) {
|
||||||
|
const uuid = target.closest('[data-item-uuid]')?.dataset.itemUuid
|
||||||
|
if (!uuid) return
|
||||||
|
const item = await fromUuid(uuid)
|
||||||
|
if (item?.type === "weapon") await item.update({ "system.equipped": !item.system.equipped })
|
||||||
|
}
|
||||||
|
|
||||||
static #onFactionLevel(_event, target) {
|
static #onFactionLevel(_event, target) {
|
||||||
if (!this.isEditable) return
|
if (!this.isEditable) return
|
||||||
const factionId = target.dataset.faction
|
const factionId = target.dataset.faction
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
|||||||
competences:{ template: "systems/fvtt-celestopol/templates/character-competences.hbs" },
|
competences:{ template: "systems/fvtt-celestopol/templates/character-competences.hbs" },
|
||||||
blessures: { template: "systems/fvtt-celestopol/templates/character-blessures.hbs" },
|
blessures: { template: "systems/fvtt-celestopol/templates/character-blessures.hbs" },
|
||||||
factions: { template: "systems/fvtt-celestopol/templates/character-factions.hbs" },
|
factions: { template: "systems/fvtt-celestopol/templates/character-factions.hbs" },
|
||||||
|
combat: { template: "systems/fvtt-celestopol/templates/character-combat.hbs" },
|
||||||
equipement: { template: "systems/fvtt-celestopol/templates/character-equipement.hbs" },
|
equipement: { template: "systems/fvtt-celestopol/templates/character-equipement.hbs" },
|
||||||
biography: { template: "systems/fvtt-celestopol/templates/character-biography.hbs" },
|
biography: { template: "systems/fvtt-celestopol/templates/character-biography.hbs" },
|
||||||
}
|
}
|
||||||
@@ -53,6 +54,7 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
|||||||
competences:{ id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
competences:{ id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
||||||
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
||||||
factions: { id: "factions", group: "sheet", icon: "fa-solid fa-flag", label: "CELESTOPOL.Tab.factions" },
|
factions: { id: "factions", group: "sheet", icon: "fa-solid fa-flag", label: "CELESTOPOL.Tab.factions" },
|
||||||
|
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-khanda", label: "CELESTOPOL.Tab.combat" },
|
||||||
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
||||||
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "CELESTOPOL.Tab.biography" },
|
biography: { id: "biography", group: "sheet", icon: "fa-solid fa-book", label: "CELESTOPOL.Tab.biography" },
|
||||||
}
|
}
|
||||||
@@ -156,21 +158,29 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
|
|||||||
})
|
})
|
||||||
break
|
break
|
||||||
|
|
||||||
|
case "combat":
|
||||||
|
context.tab = context.tabs.combat
|
||||||
|
context.weapons = doc.itemTypes.weapon.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
|
context.armures = doc.itemTypes.armure.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
|
break
|
||||||
|
|
||||||
case "biography":
|
case "biography":
|
||||||
context.tab = context.tabs.biography
|
context.tab = context.tabs.biography
|
||||||
context.xpLogEmpty = (doc.system.xp?.log?.length ?? 0) === 0
|
context.xpLogEmpty = (doc.system.xp?.log?.length ?? 0) === 0
|
||||||
|
context.biographyPortrait = doc.system.portraitImage || ""
|
||||||
|
context.hasBiographyPortrait = !!doc.system.portraitImage
|
||||||
context.enrichedDescriptionPhysique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
context.enrichedDescriptionPhysique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
doc.system.descriptionPhysique, { relativeTo: this.document })
|
doc.system.descriptionPhysique, { relativeTo: this.document })
|
||||||
context.enrichedDescriptionPsychologique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
context.enrichedDescriptionPsychologique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
doc.system.descriptionPsychologique, { relativeTo: this.document })
|
doc.system.descriptionPsychologique, { relativeTo: this.document })
|
||||||
|
context.enrichedHistorique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
|
doc.system.historique, { relativeTo: this.document })
|
||||||
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
doc.system.notes, { relativeTo: this.document })
|
doc.system.notes, { relativeTo: this.document })
|
||||||
break
|
break
|
||||||
|
|
||||||
case "equipement":
|
case "equipement":
|
||||||
context.tab = context.tabs.equipement
|
context.tab = context.tabs.equipement
|
||||||
context.weapons = doc.itemTypes.weapon.sort((a, b) => a.name.localeCompare(b.name))
|
|
||||||
context.armures = doc.itemTypes.armure.sort((a, b) => a.name.localeCompare(b.name))
|
|
||||||
context.equipments= doc.itemTypes.equipment.sort((a, b) => a.name.localeCompare(b.name))
|
context.equipments= doc.itemTypes.equipment.sort((a, b) => a.name.localeCompare(b.name))
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
|||||||
tabs: { template: "templates/generic/tab-navigation.hbs" },
|
tabs: { template: "templates/generic/tab-navigation.hbs" },
|
||||||
competences: { template: "systems/fvtt-celestopol/templates/npc-competences.hbs" },
|
competences: { template: "systems/fvtt-celestopol/templates/npc-competences.hbs" },
|
||||||
blessures: { template: "systems/fvtt-celestopol/templates/npc-blessures.hbs" },
|
blessures: { template: "systems/fvtt-celestopol/templates/npc-blessures.hbs" },
|
||||||
|
combat: { template: "systems/fvtt-celestopol/templates/npc-combat.hbs" },
|
||||||
equipement: { template: "systems/fvtt-celestopol/templates/npc-equipement.hbs" },
|
equipement: { template: "systems/fvtt-celestopol/templates/npc-equipement.hbs" },
|
||||||
biographie: { template: "systems/fvtt-celestopol/templates/npc-biographie.hbs" },
|
biographie: { template: "systems/fvtt-celestopol/templates/npc-biographie.hbs" },
|
||||||
}
|
}
|
||||||
@@ -45,6 +46,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
|||||||
const tabs = {
|
const tabs = {
|
||||||
competences: { id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
competences: { id: "competences", group: "sheet", icon: "fa-solid fa-dice-d6", label: "CELESTOPOL.Tab.competences" },
|
||||||
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
blessures: { id: "blessures", group: "sheet", icon: "fa-solid fa-heart-crack", label: "CELESTOPOL.Tab.blessures" },
|
||||||
|
combat: { id: "combat", group: "sheet", icon: "fa-solid fa-khanda", label: "CELESTOPOL.Tab.combat" },
|
||||||
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
equipement: { id: "equipement", group: "sheet", icon: "fa-solid fa-shield-halved",label: "CELESTOPOL.Tab.equipement" },
|
||||||
biographie: { id: "biographie", group: "sheet", icon: "fa-solid fa-book-open", label: "CELESTOPOL.Tab.biographie" },
|
biographie: { id: "biographie", group: "sheet", icon: "fa-solid fa-book-open", label: "CELESTOPOL.Tab.biographie" },
|
||||||
}
|
}
|
||||||
@@ -106,11 +108,16 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
|
|||||||
context.system.notes, { relativeTo: this.document }
|
context.system.notes, { relativeTo: this.document }
|
||||||
)
|
)
|
||||||
break
|
break
|
||||||
|
case "combat":
|
||||||
|
context.tab = context.tabs.combat
|
||||||
|
break
|
||||||
case "equipement":
|
case "equipement":
|
||||||
context.tab = context.tabs.equipement
|
context.tab = context.tabs.equipement
|
||||||
break
|
break
|
||||||
case "biographie":
|
case "biographie":
|
||||||
context.tab = context.tabs.biographie
|
context.tab = context.tabs.biographie
|
||||||
|
context.biographyPortrait = context.system.portraitImage || ""
|
||||||
|
context.hasBiographyPortrait = !!context.system.portraitImage
|
||||||
context.enrichedHistoire = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
context.enrichedHistoire = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
|
||||||
context.system.histoire, { relativeTo: this.document }
|
context.system.histoire, { relativeTo: this.document }
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -78,6 +78,22 @@ export class CelestopolRoll extends Roll {
|
|||||||
.reduce((sum, a) => sum + Math.abs(a.system.protection ?? a.system.malus ?? 0), 0)
|
.reduce((sum, a) => sum + Math.abs(a.system.protection ?? a.system.malus ?? 0), 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Résout un acteur à partir de son UUID si disponible, sinon via son identifiant monde.
|
||||||
|
* @param {object} ref
|
||||||
|
* @param {string|null} ref.actorUuid
|
||||||
|
* @param {string|null} ref.actorId
|
||||||
|
* @returns {Promise<Actor|null>}
|
||||||
|
*/
|
||||||
|
static async resolveActor({ actorUuid = null, actorId = null } = {}) {
|
||||||
|
if (actorUuid) {
|
||||||
|
const actorFromUuid = await fromUuid(actorUuid)
|
||||||
|
if (actorFromUuid) return actorFromUuid
|
||||||
|
}
|
||||||
|
if (actorId) return game.actors.get(actorId) ?? null
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ouvre le dialogue de configuration du jet via DialogV2 et exécute le jet.
|
* Ouvre le dialogue de configuration du jet via DialogV2 et exécute le jet.
|
||||||
* @param {object} options
|
* @param {object} options
|
||||||
@@ -298,11 +314,16 @@ export class CelestopolRoll extends Roll {
|
|||||||
const useFortune = fortuneValue > 0 && (rollContext.useFortune === true || rollContext.useFortune === "true")
|
const useFortune = fortuneValue > 0 && (rollContext.useFortune === true || rollContext.useFortune === "true")
|
||||||
const puiserRessources = rollContext.puiserRessources === true || rollContext.puiserRessources === "true"
|
const puiserRessources = rollContext.puiserRessources === true || rollContext.puiserRessources === "true"
|
||||||
const rollMoonDie = rollContext.rollMoonDie === true || rollContext.rollMoonDie === "true"
|
const rollMoonDie = rollContext.rollMoonDie === true || rollContext.rollMoonDie === "true"
|
||||||
const selectedCombatTargetId = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
|
const selectedCombatTargetRef = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
|
||||||
const selectedCombatTarget = selectedCombatTargetId
|
const selectedCombatTarget = selectedCombatTargetRef
|
||||||
? availableTargets.find(t => t.id === selectedCombatTargetId) ?? null
|
? availableTargets.find(t => t.uuid === selectedCombatTargetRef || t.id === selectedCombatTargetRef) ?? null
|
||||||
: null
|
: null
|
||||||
|
const resolvedWeaponName = (isRangedDefense && selectedCombatTarget?.weaponName) ? selectedCombatTarget.weaponName : weaponName
|
||||||
|
const resolvedWeaponDegats = (isRangedDefense && selectedCombatTarget?.weaponDegats) ? selectedCombatTarget.weaponDegats : weaponDegats
|
||||||
|
// Dégâts de l'arme adverse en cas d'échec (arme équipée du PNJ ciblé en mêlée, arme distance en esquive)
|
||||||
|
const incomingWeaponDegats = selectedCombatTarget?.weaponDegats ?? resolvedWeaponDegats
|
||||||
const targetActorId = selectedCombatTarget?.id || ""
|
const targetActorId = selectedCombatTarget?.id || ""
|
||||||
|
const targetActorUuid = selectedCombatTarget?.uuid || ""
|
||||||
const targetActorName = selectedCombatTarget?.name || ""
|
const targetActorName = selectedCombatTarget?.name || ""
|
||||||
|
|
||||||
// En résistance : forcer puiser=false, lune=false, fortune=false, destin=false
|
// En résistance : forcer puiser=false, lune=false, fortune=false, destin=false
|
||||||
@@ -352,9 +373,11 @@ export class CelestopolRoll extends Roll {
|
|||||||
isCombat,
|
isCombat,
|
||||||
isRangedDefense,
|
isRangedDefense,
|
||||||
weaponType,
|
weaponType,
|
||||||
weaponName,
|
weaponName: resolvedWeaponName,
|
||||||
weaponDegats,
|
weaponDegats: resolvedWeaponDegats,
|
||||||
|
incomingWeaponDegats,
|
||||||
targetActorId,
|
targetActorId,
|
||||||
|
targetActorUuid,
|
||||||
targetActorName,
|
targetActorName,
|
||||||
availableTargets,
|
availableTargets,
|
||||||
rangedMod: effectiveRangedMod,
|
rangedMod: effectiveRangedMod,
|
||||||
@@ -363,7 +386,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
puiserRessources: effectivePuiser,
|
puiserRessources: effectivePuiser,
|
||||||
nbDice: (!isResistance && useFortune) ? 1 : nbDice,
|
nbDice: (!isResistance && useFortune) ? 1 : nbDice,
|
||||||
formula,
|
formula,
|
||||||
rollMode: rollContext.visibility ?? "publicroll",
|
rollMode: rollContext.visibility ?? "public",
|
||||||
rollMoonDie: effectiveMoon,
|
rollMoonDie: effectiveMoon,
|
||||||
moonDieResult,
|
moonDieResult,
|
||||||
moonFace,
|
moonFace,
|
||||||
@@ -375,7 +398,10 @@ export class CelestopolRoll extends Roll {
|
|||||||
roll.computeResult()
|
roll.computeResult()
|
||||||
|
|
||||||
// Test de résistance échoué → cocher automatiquement la prochaine case de blessure
|
// Test de résistance échoué → cocher automatiquement la prochaine case de blessure
|
||||||
const actor = game.actors.get(options.actorId)
|
const actor = await this.resolveActor({
|
||||||
|
actorUuid: options.actorUuid ?? null,
|
||||||
|
actorId: options.actorId ?? null,
|
||||||
|
})
|
||||||
if (isResistance && actor && roll.options.resultType === "failure") {
|
if (isResistance && actor && roll.options.resultType === "failure") {
|
||||||
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
|
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
|
||||||
if (nextLvl <= 8) {
|
if (nextLvl <= 8) {
|
||||||
@@ -384,16 +410,25 @@ export class CelestopolRoll extends Roll {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mêlée échouée OU défense à distance échouée → joueur prend une blessure
|
// Mêlée échouée OU défense à distance échouée → le protagoniste (PJ uniquement) subit les dégâts de l'arme PNJ
|
||||||
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor && roll.options.resultType === "failure") {
|
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor?.type === "character" && roll.options.resultType === "failure") {
|
||||||
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
|
const incomingWounds = this.getIncomingWounds(roll.options.incomingWeaponDegats ?? resolvedWeaponDegats)
|
||||||
if (nextLvl <= 8) {
|
const protection = this.getActorArmorProtection(actor)
|
||||||
|
const appliedWounds = incomingWounds === null
|
||||||
|
? 1
|
||||||
|
: Math.max(0, incomingWounds - protection)
|
||||||
|
if (appliedWounds > 0) {
|
||||||
|
const nextLvl = Math.min(8, (actor.system.blessures.lvl ?? 0) + appliedWounds)
|
||||||
await actor.update({ "system.blessures.lvl": nextLvl })
|
await actor.update({ "system.blessures.lvl": nextLvl })
|
||||||
roll.options.woundTaken = nextLvl
|
roll.options.woundTaken = nextLvl
|
||||||
|
roll.options.woundTakenCount = appliedWounds
|
||||||
|
roll.options.incomingWounds = incomingWounds
|
||||||
|
roll.options.selectedTargetProtection = protection
|
||||||
|
roll.options.selectedTargetAppliedWounds = appliedWounds
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await roll.toMessage({}, { rollMode: rollData.rollMode })
|
await roll.toMessage({}, { messageMode: rollData.rollMode })
|
||||||
|
|
||||||
// Batching de toutes les mises à jour de l'acteur en un seul appel réseau
|
// Batching de toutes les mises à jour de l'acteur en un seul appel réseau
|
||||||
if (actor) {
|
if (actor) {
|
||||||
@@ -506,12 +541,16 @@ export class CelestopolRoll extends Roll {
|
|||||||
const incomingWounds = isWeaponHit ? this.constructor.getIncomingWounds(weaponDegats) : null
|
const incomingWounds = isWeaponHit ? this.constructor.getIncomingWounds(weaponDegats) : null
|
||||||
const hasVariableDamage = isWeaponHit && incomingWounds === null
|
const hasVariableDamage = isWeaponHit && incomingWounds === null
|
||||||
const targetActorId = this.options.targetActorId ?? ""
|
const targetActorId = this.options.targetActorId ?? ""
|
||||||
|
const targetActorUuid = this.options.targetActorUuid ?? ""
|
||||||
const targetActorName = this.options.targetActorName ?? ""
|
const targetActorName = this.options.targetActorName ?? ""
|
||||||
const availableTargets = (this.options.availableTargets ?? []).map(target => ({
|
const availableTargets = (this.options.availableTargets ?? []).map(target => ({
|
||||||
...target,
|
...target,
|
||||||
selected: target.id === targetActorId,
|
selected: target.uuid === targetActorUuid || target.id === targetActorId,
|
||||||
}))
|
}))
|
||||||
const selectedTargetActor = targetActorId ? game.actors.get(targetActorId) : null
|
const selectedTargetActor = await this.constructor.resolveActor({
|
||||||
|
actorUuid: targetActorUuid,
|
||||||
|
actorId: targetActorId,
|
||||||
|
})
|
||||||
const selectedTargetProtection = selectedTargetActor
|
const selectedTargetProtection = selectedTargetActor
|
||||||
? this.constructor.getActorArmorProtection(selectedTargetActor)
|
? this.constructor.getActorArmorProtection(selectedTargetActor)
|
||||||
: null
|
: null
|
||||||
@@ -519,6 +558,13 @@ export class CelestopolRoll extends Roll {
|
|||||||
? Math.max(0, incomingWounds - selectedTargetProtection)
|
? Math.max(0, incomingWounds - selectedTargetProtection)
|
||||||
: null
|
: null
|
||||||
|
|
||||||
|
// Type de l'acteur qui lance le jet (character | npc)
|
||||||
|
const rollingActor = await this.constructor.resolveActor({
|
||||||
|
actorUuid: this.options.actorUuid ?? null,
|
||||||
|
actorId: this.options.actorId ?? null,
|
||||||
|
})
|
||||||
|
const actorType = rollingActor?.type ?? this.options.actorType ?? null
|
||||||
|
|
||||||
// Libellé de difficulté : en combat "Corps PNJ : N", en opposition "vs ?", sinon "Seuil : 11"
|
// Libellé de difficulté : en combat "Corps PNJ : N", en opposition "vs ?", sinon "Seuil : 11"
|
||||||
const difficultyLabel = this.options.isCombat
|
const difficultyLabel = this.options.isCombat
|
||||||
? `${game.i18n.localize("CELESTOPOL.Combat.corpsPnj")} : ${threshold}`
|
? `${game.i18n.localize("CELESTOPOL.Combat.corpsPnj")} : ${threshold}`
|
||||||
@@ -564,11 +610,14 @@ export class CelestopolRoll extends Roll {
|
|||||||
woundLabel,
|
woundLabel,
|
||||||
isResistance: this.options.isResistance ?? false,
|
isResistance: this.options.isResistance ?? false,
|
||||||
isCombat: this.options.isCombat ?? false,
|
isCombat: this.options.isCombat ?? false,
|
||||||
|
actorType,
|
||||||
|
isNpcAttack: actorType === "npc",
|
||||||
weaponName: this.options.weaponName ?? null,
|
weaponName: this.options.weaponName ?? null,
|
||||||
weaponDegats,
|
weaponDegats,
|
||||||
weaponType: this.options.weaponType ?? null,
|
weaponType: this.options.weaponType ?? null,
|
||||||
isRangedDefense: this.options.isRangedDefense ?? false,
|
isRangedDefense: this.options.isRangedDefense ?? false,
|
||||||
woundTaken: this.options.woundTaken ?? null,
|
woundTaken: this.options.woundTaken ?? null,
|
||||||
|
woundTakenCount: this.options.woundTakenCount ?? null,
|
||||||
situationMod: this.options.situationMod ?? 0,
|
situationMod: this.options.situationMod ?? 0,
|
||||||
rangedMod: this.options.rangedMod ?? 0,
|
rangedMod: this.options.rangedMod ?? 0,
|
||||||
hasDamageSummary: isWeaponHit,
|
hasDamageSummary: isWeaponHit,
|
||||||
@@ -577,6 +626,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
hasVariableDamage,
|
hasVariableDamage,
|
||||||
canApplyWeaponDamage: incomingWounds !== null,
|
canApplyWeaponDamage: incomingWounds !== null,
|
||||||
targetActorId,
|
targetActorId,
|
||||||
|
targetActorUuid,
|
||||||
targetActorName,
|
targetActorName,
|
||||||
selectedTargetProtection,
|
selectedTargetProtection,
|
||||||
selectedTargetAppliedWounds,
|
selectedTargetAppliedWounds,
|
||||||
@@ -589,20 +639,55 @@ export class CelestopolRoll extends Roll {
|
|||||||
moonResultClass: moonResultType?.cssClass ?? "",
|
moonResultClass: moonResultType?.cssClass ?? "",
|
||||||
moonResultLabel: moonResultType ? game.i18n.localize(moonResultType.label) : "",
|
moonResultLabel: moonResultType ? game.i18n.localize(moonResultType.label) : "",
|
||||||
moonResultDesc: moonResultType ? game.i18n.localize(moonResultType.desc) : "",
|
moonResultDesc: moonResultType ? game.i18n.localize(moonResultType.desc) : "",
|
||||||
|
moonResultTypeId: moonResultType?.id ?? null,
|
||||||
|
moonActorId: (actorType === "character") ? (this.options.actorId ?? null) : null,
|
||||||
|
moonActorUuid: (actorType === "character") ? (this.options.actorUuid ?? null) : null,
|
||||||
|
moonActorIsCharacter: actorType === "character",
|
||||||
isPrivate,
|
isPrivate,
|
||||||
tooltip: isPrivate ? "" : await this.getTooltip(),
|
tooltip: isPrivate ? "" : await this.getTooltip(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @override */
|
/** @override */
|
||||||
async toMessage(messageData = {}, { rollMode, create = true } = {}) {
|
async toMessage(messageData = {}, { messageMode, rollMode, create = true } = {}) {
|
||||||
|
const modernToLegacyRollMode = {
|
||||||
|
public: CONST.DICE_ROLL_MODES.PUBLIC,
|
||||||
|
gm: CONST.DICE_ROLL_MODES.PRIVATE,
|
||||||
|
blind: CONST.DICE_ROLL_MODES.BLIND,
|
||||||
|
self: CONST.DICE_ROLL_MODES.SELF,
|
||||||
|
ic: CONST.DICE_ROLL_MODES.PUBLIC,
|
||||||
|
}
|
||||||
|
let effectiveRollMode = rollMode ?? messageMode ?? game.settings.get("core", "rollMode") ?? CONST.DICE_ROLL_MODES.PUBLIC
|
||||||
|
effectiveRollMode = modernToLegacyRollMode[effectiveRollMode] ?? effectiveRollMode
|
||||||
|
if (!Object.values(CONST.DICE_ROLL_MODES).includes(effectiveRollMode)) {
|
||||||
|
effectiveRollMode = game.settings.get("core", "rollMode") ?? CONST.DICE_ROLL_MODES.PUBLIC
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!this._evaluated) await this.evaluate({ allowInteractive: effectiveRollMode !== CONST.DICE_ROLL_MODES.BLIND })
|
||||||
|
|
||||||
const skillLocalized = this.skillLabel ? game.i18n.localize(this.skillLabel) : ""
|
const skillLocalized = this.skillLabel ? game.i18n.localize(this.skillLabel) : ""
|
||||||
const statLocalized = this.options.statLabel
|
const statLocalized = this.options.statLabel
|
||||||
? game.i18n.localize(this.options.statLabel) : ""
|
? game.i18n.localize(this.options.statLabel) : ""
|
||||||
const flavor = statLocalized
|
const flavor = statLocalized
|
||||||
? `<strong>${statLocalized} › ${skillLocalized}</strong>`
|
? `<strong>${statLocalized} › ${skillLocalized}</strong>`
|
||||||
: `<strong>${skillLocalized}</strong>`
|
: `<strong>${skillLocalized}</strong>`
|
||||||
return super.toMessage({ flavor, ...messageData }, { rollMode })
|
const speakerActor = await this.constructor.resolveActor({
|
||||||
|
actorUuid: this.options.actorUuid ?? null,
|
||||||
|
actorId: this.options.actorId ?? null,
|
||||||
|
})
|
||||||
|
const content = await this.render({ isPrivate: effectiveRollMode !== CONST.DICE_ROLL_MODES.PUBLIC })
|
||||||
|
const chatData = foundry.utils.mergeObject({
|
||||||
|
author: game.user.id,
|
||||||
|
content,
|
||||||
|
flavor,
|
||||||
|
sound: CONFIG.sounds.dice,
|
||||||
|
rolls: [this],
|
||||||
|
speaker: speakerActor ? ChatMessage.getSpeaker({ actor: speakerActor }) : undefined,
|
||||||
|
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||||
|
}, messageData)
|
||||||
|
ChatMessage.applyRollMode(chatData, effectiveRollMode)
|
||||||
|
if (create) return ChatMessage.create(chatData)
|
||||||
|
return chatData
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -617,6 +702,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
const resultType = face ? SYSTEM.MOON_RESULT_TYPES[face.result] ?? null : null
|
const resultType = face ? SYSTEM.MOON_RESULT_TYPES[face.result] ?? null : null
|
||||||
const isGoodFortune = result <= 4
|
const isGoodFortune = result <= 4
|
||||||
|
|
||||||
|
const actorIsCharacter = actor?.type === "character"
|
||||||
const templateData = {
|
const templateData = {
|
||||||
result,
|
result,
|
||||||
moonFaceSymbol: face?.symbol ?? "",
|
moonFaceSymbol: face?.symbol ?? "",
|
||||||
@@ -624,8 +710,12 @@ export class CelestopolRoll extends Roll {
|
|||||||
moonResultLabel: resultType ? game.i18n.localize(resultType.label) : "",
|
moonResultLabel: resultType ? game.i18n.localize(resultType.label) : "",
|
||||||
moonResultDesc: resultType ? game.i18n.localize(resultType.desc) : "",
|
moonResultDesc: resultType ? game.i18n.localize(resultType.desc) : "",
|
||||||
moonResultClass: resultType?.cssClass ?? "",
|
moonResultClass: resultType?.cssClass ?? "",
|
||||||
|
moonResultTypeId: resultType?.id ?? null,
|
||||||
isGoodFortune,
|
isGoodFortune,
|
||||||
actorName: actor?.name ?? null,
|
actorName: actor?.name ?? null,
|
||||||
|
moonActorIsCharacter: actorIsCharacter,
|
||||||
|
moonActorId: actorIsCharacter ? (actor.id ?? null) : null,
|
||||||
|
moonActorUuid: actorIsCharacter ? (actor.uuid ?? null) : null,
|
||||||
}
|
}
|
||||||
|
|
||||||
const content = await foundry.applications.handlebars.renderTemplate(
|
const content = await foundry.applications.handlebars.renderTemplate(
|
||||||
@@ -640,8 +730,7 @@ export class CelestopolRoll extends Roll {
|
|||||||
await ChatMessage.create({
|
await ChatMessage.create({
|
||||||
content,
|
content,
|
||||||
speaker,
|
speaker,
|
||||||
rolls: [roll],
|
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
|
||||||
style: CONST.CHAT_MESSAGE_STYLES?.ROLL ?? 5,
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,8 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
// Description & notes
|
// Description & notes
|
||||||
schema.descriptionPhysique = new fields.HTMLField({ required: true, textSearch: true })
|
schema.descriptionPhysique = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
schema.descriptionPsychologique = new fields.HTMLField({ required: true, textSearch: true })
|
schema.descriptionPsychologique = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
|
schema.historique = new fields.HTMLField({ required: true, initial: "", textSearch: true })
|
||||||
|
schema.portraitImage = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
|
|
||||||
// Données biographiques
|
// Données biographiques
|
||||||
@@ -216,6 +218,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
|
|
||||||
return CelestopolRoll.prompt({
|
return CelestopolRoll.prompt({
|
||||||
actorId: this.parent.id,
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
actorName: this.parent.name,
|
actorName: this.parent.name,
|
||||||
actorImage: this.parent.img,
|
actorImage: this.parent.img,
|
||||||
statId,
|
statId,
|
||||||
@@ -247,6 +250,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
|
|
||||||
return CelestopolRoll.prompt({
|
return CelestopolRoll.prompt({
|
||||||
actorId: this.parent.id,
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
actorName: this.parent.name,
|
actorName: this.parent.name,
|
||||||
actorImage: this.parent.img,
|
actorImage: this.parent.img,
|
||||||
statId,
|
statId,
|
||||||
@@ -268,21 +272,46 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
/**
|
/**
|
||||||
* Collecte les cibles de combat sur la scène active.
|
* Collecte les cibles de combat sur la scène active.
|
||||||
* Pour un PJ attaquant, seules les cibles PNJ présentes sur la scène sont proposées.
|
* Pour un PJ attaquant, seules les cibles PNJ présentes sur la scène sont proposées.
|
||||||
* @returns {Array<{id:string, name:string, corps:number}>}
|
* @param {object} options
|
||||||
|
* @param {boolean} [options.onlyRanged=false] - Filtrer sur les PNJ ayant une arme à distance équipée
|
||||||
|
* @param {boolean} [options.fallbackToAll=false] - Revenir à tous les PNJ si aucune cible trouvée
|
||||||
|
* @param {boolean} [options.includeMeleeWeapon=false] - Inclure l'arme de mêlée équipée du PNJ (dégâts adverses)
|
||||||
|
* @returns {Array<{id:string, uuid:string, name:string, corps:number, weaponName?:string, weaponDegats?:string}>}
|
||||||
*/
|
*/
|
||||||
_getCombatTargets() {
|
_getCombatTargets({ onlyRanged = false, fallbackToAll = false, includeMeleeWeapon = false } = {}) {
|
||||||
const toEntry = actor => ({
|
const getEquippedWeapon = (actor, type) =>
|
||||||
|
actor.itemTypes?.weapon?.find(item => item.system.type === type && item.system.equipped) ?? null
|
||||||
|
|
||||||
|
const toEntry = actor => {
|
||||||
|
const entry = {
|
||||||
id: actor.id,
|
id: actor.id,
|
||||||
|
uuid: actor.uuid,
|
||||||
name: actor.name,
|
name: actor.name,
|
||||||
corps: actor.system.stats?.corps?.res ?? 0,
|
corps: actor.system.stats?.corps?.res ?? 0,
|
||||||
})
|
}
|
||||||
|
if (onlyRanged) {
|
||||||
|
const weapon = getEquippedWeapon(actor, "distance")
|
||||||
|
if (weapon) {
|
||||||
|
entry.weaponName = weapon.name
|
||||||
|
entry.weaponDegats = weapon.system.degats
|
||||||
|
}
|
||||||
|
} else if (includeMeleeWeapon) {
|
||||||
|
const weapon = getEquippedWeapon(actor, "melee")
|
||||||
|
entry.weaponDegats = weapon ? weapon.system.degats : "0"
|
||||||
|
}
|
||||||
|
return entry
|
||||||
|
}
|
||||||
|
|
||||||
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
||||||
return [...new Map(sceneTokens
|
const targets = [...new Map(sceneTokens
|
||||||
.filter(t => t.actor?.type === "npc" && t.actor.id !== this.parent.id)
|
.filter(t => t.actor?.type === "npc" && t.actor.id !== this.parent.id)
|
||||||
|
.filter(t => !onlyRanged || getEquippedWeapon(t.actor, "distance"))
|
||||||
.map(t => {
|
.map(t => {
|
||||||
const actor = t.actor
|
const actor = t.actor
|
||||||
return [actor.id, toEntry(actor)]
|
return [actor.uuid, toEntry(actor)]
|
||||||
})).values()]
|
})).values()]
|
||||||
|
if (!targets.length && onlyRanged && fallbackToAll) return this._getCombatTargets()
|
||||||
|
return targets
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -302,6 +331,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
|
|
||||||
return CelestopolRoll.prompt({
|
return CelestopolRoll.prompt({
|
||||||
actorId: this.parent.id,
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
actorName: this.parent.name,
|
actorName: this.parent.name,
|
||||||
actorImage: this.parent.img,
|
actorImage: this.parent.img,
|
||||||
statId: "corps",
|
statId: "corps",
|
||||||
@@ -320,7 +350,40 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
weaponType: item.system.type,
|
weaponType: item.system.type,
|
||||||
weaponName: item.name,
|
weaponName: item.name,
|
||||||
weaponDegats: item.system.degats,
|
weaponDegats: item.system.degats,
|
||||||
availableTargets: this._getCombatTargets(),
|
availableTargets: this._getCombatTargets({ includeMeleeWeapon: item.system.type === "melee" }),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lance une attaque à mains nues (Échauffourée sans arme).
|
||||||
|
*/
|
||||||
|
async rollUnarmedAttack() {
|
||||||
|
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||||
|
const echauffouree = this.stats.corps.echauffouree
|
||||||
|
if (!echauffouree) return null
|
||||||
|
|
||||||
|
return CelestopolRoll.prompt({
|
||||||
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
|
actorName: this.parent.name,
|
||||||
|
actorImage: this.parent.img,
|
||||||
|
statId: "corps",
|
||||||
|
skillId: "echauffouree",
|
||||||
|
statLabel: SYSTEM.STATS.corps.label,
|
||||||
|
skillLabel: SYSTEM.SKILLS.corps.echauffouree.label,
|
||||||
|
skillValue: echauffouree.value,
|
||||||
|
woundMalus: this.getWoundMalus(),
|
||||||
|
armorMalus: this.getArmorMalusForRoll("corps", "echauffouree"),
|
||||||
|
woundLevel: this.blessures.lvl,
|
||||||
|
rollMoonDie: this.prefs.rollMoonDie ?? false,
|
||||||
|
destGaugeFull: this.destin.lvl > 0,
|
||||||
|
fortuneValue: this.attributs.fortune.value,
|
||||||
|
isCombat: true,
|
||||||
|
isRangedDefense: false,
|
||||||
|
weaponType: "melee",
|
||||||
|
weaponName: game.i18n.localize("CELESTOPOL.Combat.unarmedAttack"),
|
||||||
|
weaponDegats: "0",
|
||||||
|
availableTargets: this._getCombatTargets({ includeMeleeWeapon: true }),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -340,6 +403,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
|
|
||||||
return CelestopolRoll.prompt({
|
return CelestopolRoll.prompt({
|
||||||
actorId: this.parent.id,
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
actorName: this.parent.name,
|
actorName: this.parent.name,
|
||||||
actorImage: this.parent.img,
|
actorImage: this.parent.img,
|
||||||
statId: "corps",
|
statId: "corps",
|
||||||
@@ -358,7 +422,41 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
|
|||||||
weaponType: "distance",
|
weaponType: "distance",
|
||||||
weaponName: item.name,
|
weaponName: item.name,
|
||||||
weaponDegats: "0",
|
weaponDegats: "0",
|
||||||
availableTargets: this._getCombatTargets(),
|
availableTargets: this._getCombatTargets({ onlyRanged: true, fallbackToAll: true }),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lance une esquive d'attaque à distance sans dépendre d'une arme possédée par le PJ.
|
||||||
|
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||||
|
*/
|
||||||
|
async rollRangedDefenseBase() {
|
||||||
|
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||||
|
const mobilite = this.stats.corps.mobilite
|
||||||
|
if (!mobilite) return null
|
||||||
|
|
||||||
|
return CelestopolRoll.prompt({
|
||||||
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
|
actorName: this.parent.name,
|
||||||
|
actorImage: this.parent.img,
|
||||||
|
statId: "corps",
|
||||||
|
skillId: "mobilite",
|
||||||
|
statLabel: SYSTEM.STATS.corps.label,
|
||||||
|
skillLabel: SYSTEM.SKILLS.corps.mobilite.label,
|
||||||
|
skillValue: mobilite.value,
|
||||||
|
woundMalus: this.getWoundMalus(),
|
||||||
|
armorMalus: this.getArmorMalusForRoll("corps", "mobilite"),
|
||||||
|
woundLevel: this.blessures.lvl,
|
||||||
|
rollMoonDie: this.prefs.rollMoonDie ?? false,
|
||||||
|
destGaugeFull: this.destin.lvl > 0,
|
||||||
|
fortuneValue: this.attributs.fortune.value,
|
||||||
|
isCombat: true,
|
||||||
|
isRangedDefense: true,
|
||||||
|
weaponType: "distance",
|
||||||
|
weaponName: game.i18n.localize("CELESTOPOL.Combat.rangedAttack"),
|
||||||
|
weaponDegats: "0",
|
||||||
|
availableTargets: this._getCombatTargets({ onlyRanged: true, fallbackToAll: true }),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ export class CelestopolWeapon extends foundry.abstract.TypeDataModel {
|
|||||||
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
|
choices: Object.keys(SYSTEM.WEAPON_DAMAGE_TYPES) }),
|
||||||
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
|
portee: new fields.StringField({ required: true, nullable: false, initial: "contact",
|
||||||
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
|
choices: Object.keys(SYSTEM.WEAPON_RANGE_TYPES) }),
|
||||||
|
equipped: new fields.BooleanField({ initial: false }),
|
||||||
description: new fields.HTMLField({ required: true, textSearch: true }),
|
description: new fields.HTMLField({ required: true, textSearch: true }),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
|||||||
// PNJs : 4 domaines uniquement (pas de sous-compétences)
|
// PNJs : 4 domaines uniquement (pas de sous-compétences)
|
||||||
const domainField = (statId) => new fields.SchemaField({
|
const domainField = (statId) => new fields.SchemaField({
|
||||||
label: new fields.StringField({ required: true, initial: SYSTEM.STATS[statId].label }),
|
label: new fields.StringField({ required: true, initial: SYSTEM.STATS[statId].label }),
|
||||||
res: new fields.NumberField({ ...reqInt, initial: 0, min: 0, max: 8 }),
|
res: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
actuel: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
actuel: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }),
|
||||||
})
|
})
|
||||||
|
|
||||||
@@ -51,6 +51,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
|||||||
|
|
||||||
schema.histoire = new fields.HTMLField({ required: true, textSearch: true })
|
schema.histoire = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
schema.descriptionPhysique = new fields.HTMLField({ required: true, textSearch: true })
|
schema.descriptionPhysique = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
|
schema.portraitImage = new fields.StringField({ required: true, nullable: false, initial: "" })
|
||||||
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
schema.notes = new fields.HTMLField({ required: true, textSearch: true })
|
||||||
|
|
||||||
return schema
|
return schema
|
||||||
@@ -111,6 +112,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
|||||||
|
|
||||||
return CelestopolRoll.prompt({
|
return CelestopolRoll.prompt({
|
||||||
actorId: this.parent.id,
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
actorName: this.parent.name,
|
actorName: this.parent.name,
|
||||||
actorImage: this.parent.img,
|
actorImage: this.parent.img,
|
||||||
statId,
|
statId,
|
||||||
@@ -126,4 +128,95 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
|
|||||||
async rollResistance(statId) {
|
async rollResistance(statId) {
|
||||||
return this.roll(statId)
|
return this.roll(statId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collecte les cibles protagonistes de la scène active pour les jets de combat PNJ.
|
||||||
|
* @returns {Array<{id:string, name:string, corps:number}>}
|
||||||
|
*/
|
||||||
|
_getCombatTargets() {
|
||||||
|
const toEntry = actor => ({
|
||||||
|
id: actor.id,
|
||||||
|
uuid: actor.uuid,
|
||||||
|
name: actor.name,
|
||||||
|
corps: actor.system.stats?.corps?.res ?? 0,
|
||||||
|
})
|
||||||
|
const sceneTokens = canvas?.scene?.isView ? (canvas.tokens?.placeables ?? []) : []
|
||||||
|
return [...new Map(sceneTokens
|
||||||
|
.filter(t => t.actor?.type === "character" && t.actor.id !== this.parent.id)
|
||||||
|
.map(t => {
|
||||||
|
const actor = t.actor
|
||||||
|
return [actor.id, toEntry(actor)]
|
||||||
|
})).values()]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lance une attaque PNJ avec une arme.
|
||||||
|
* Le test utilise le domaine Corps et transmet explicitement les dégâts de l'arme.
|
||||||
|
* @param {string} itemId
|
||||||
|
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||||
|
*/
|
||||||
|
async rollAttack(itemId) {
|
||||||
|
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||||
|
const item = this.parent.items.get(itemId)
|
||||||
|
if (!item || item.type !== "weapon") return null
|
||||||
|
|
||||||
|
return CelestopolRoll.prompt({
|
||||||
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
|
actorName: this.parent.name,
|
||||||
|
actorImage: this.parent.img,
|
||||||
|
statId: "corps",
|
||||||
|
skillId: null,
|
||||||
|
statLabel: SYSTEM.STATS.corps.label,
|
||||||
|
skillLabel: "CELESTOPOL.Combat.attack",
|
||||||
|
skillValue: this.stats.corps.res,
|
||||||
|
woundMalus: this.getWoundMalus(),
|
||||||
|
armorMalus: this.getArmorMalusForRoll("corps"),
|
||||||
|
woundLevel: this.blessures.lvl,
|
||||||
|
rollMoonDie: false,
|
||||||
|
destGaugeFull: false,
|
||||||
|
fortuneValue: 0,
|
||||||
|
isCombat: true,
|
||||||
|
isRangedDefense: false,
|
||||||
|
weaponType: item.system.type,
|
||||||
|
weaponName: item.name,
|
||||||
|
weaponDegats: item.system.degats,
|
||||||
|
availableTargets: this._getCombatTargets(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lance un jet de tir/esquive PNJ avec une arme à distance.
|
||||||
|
* @param {string} itemId
|
||||||
|
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
|
||||||
|
*/
|
||||||
|
async rollRangedDefense(itemId) {
|
||||||
|
const { CelestopolRoll } = await import("../documents/roll.mjs")
|
||||||
|
const item = this.parent.items.get(itemId)
|
||||||
|
if (!item || item.type !== "weapon" || item.system.type !== "distance") return null
|
||||||
|
|
||||||
|
return CelestopolRoll.prompt({
|
||||||
|
actorId: this.parent.id,
|
||||||
|
actorUuid: this.parent.uuid,
|
||||||
|
actorName: this.parent.name,
|
||||||
|
actorImage: this.parent.img,
|
||||||
|
statId: "corps",
|
||||||
|
skillId: null,
|
||||||
|
statLabel: SYSTEM.STATS.corps.label,
|
||||||
|
skillLabel: "CELESTOPOL.Combat.rangedDefenseTitle",
|
||||||
|
skillValue: this.stats.corps.res,
|
||||||
|
woundMalus: this.getWoundMalus(),
|
||||||
|
armorMalus: this.getArmorMalusForRoll("corps"),
|
||||||
|
woundLevel: this.blessures.lvl,
|
||||||
|
rollMoonDie: false,
|
||||||
|
destGaugeFull: false,
|
||||||
|
fortuneValue: 0,
|
||||||
|
isCombat: true,
|
||||||
|
isRangedDefense: true,
|
||||||
|
weaponType: "distance",
|
||||||
|
weaponName: item.name,
|
||||||
|
weaponDegats: item.system.degats,
|
||||||
|
availableTargets: this._getCombatTargets(),
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000022
|
MANIFEST-000076
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/11-15:27:57.620400 7ff3bebfd6c0 Recovering log #20
|
2026/04/14-21:45:17.258246 7fc1d9fbd6c0 Recovering log #75
|
||||||
2026/04/11-15:27:57.630743 7ff3bebfd6c0 Delete type=3 #18
|
2026/04/14-21:45:17.274015 7fc1d9fbd6c0 Delete type=0 #75
|
||||||
2026/04/11-15:27:57.630810 7ff3bebfd6c0 Delete type=0 #20
|
2026/04/14-21:45:17.274077 7fc1d9fbd6c0 Delete type=3 #74
|
||||||
2026/04/11-15:29:26.022154 7ff3bdbfb6c0 Level-0 table #25: started
|
2026/04/15-02:16:16.676658 7fc1d8fbb6c0 Level-0 table #79: started
|
||||||
2026/04/11-15:29:26.022184 7ff3bdbfb6c0 Level-0 table #25: 0 bytes OK
|
2026/04/15-02:16:16.676686 7fc1d8fbb6c0 Level-0 table #79: 0 bytes OK
|
||||||
2026/04/11-15:29:26.028372 7ff3bdbfb6c0 Delete type=0 #23
|
2026/04/15-02:16:16.720642 7fc1d8fbb6c0 Delete type=0 #77
|
||||||
2026/04/11-15:29:26.034985 7ff3bdbfb6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:16.819908 7fc1d8fbb6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||||
2026/04/11-15:29:26.054681 7ff3bdbfb6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:16.881523 7fc1d8fbb6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/04/11-15:27:20.564248 7f20edbfe6c0 Recovering log #16
|
2026/04/14-10:43:54.304360 7fddcbfff6c0 Recovering log #72
|
||||||
2026/04/11-15:27:20.573933 7f20edbfe6c0 Delete type=3 #14
|
2026/04/14-10:43:54.314599 7fddcbfff6c0 Delete type=3 #70
|
||||||
2026/04/11-15:27:20.573986 7f20edbfe6c0 Delete type=0 #16
|
2026/04/14-10:43:54.314647 7fddcbfff6c0 Delete type=0 #72
|
||||||
2026/04/11-15:27:31.323603 7f1e4ffff6c0 Level-0 table #21: started
|
|
||||||
2026/04/11-15:27:31.323630 7f1e4ffff6c0 Level-0 table #21: 0 bytes OK
|
|
||||||
2026/04/11-15:27:31.330503 7f1e4ffff6c0 Delete type=0 #19
|
|
||||||
2026/04/11-15:27:31.336782 7f1e4ffff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/11-15:27:31.347179 7f1e4ffff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
MANIFEST-000058
|
MANIFEST-000129
|
||||||
|
|||||||
@@ -1,15 +1,24 @@
|
|||||||
2026/04/11-15:27:57.608051 7ff3bf3fe6c0 Recovering log #55
|
2026/04/14-21:45:17.210322 7fc1dafbf6c0 Recovering log #128
|
||||||
2026/04/11-15:27:57.617618 7ff3bf3fe6c0 Delete type=3 #53
|
2026/04/14-21:45:17.212264 7fc1dafbf6c0 Level-0 table #130: started
|
||||||
2026/04/11-15:27:57.617668 7ff3bf3fe6c0 Delete type=0 #55
|
2026/04/14-21:45:17.217282 7fc1dafbf6c0 Level-0 table #130: 3524 bytes OK
|
||||||
2026/04/11-15:29:26.012403 7ff3bdbfb6c0 Level-0 table #61: started
|
2026/04/14-21:45:17.232642 7fc1dafbf6c0 Delete type=0 #128
|
||||||
2026/04/11-15:29:26.015819 7ff3bdbfb6c0 Level-0 table #61: 3524 bytes OK
|
2026/04/14-21:45:17.232776 7fc1dafbf6c0 Delete type=3 #127
|
||||||
2026/04/11-15:29:26.022024 7ff3bdbfb6c0 Delete type=0 #59
|
2026/04/15-02:16:16.615618 7fc1d8fbb6c0 Level-0 table #133: started
|
||||||
2026/04/11-15:29:26.034975 7ff3bdbfb6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:16.640160 7fc1d8fbb6c0 Level-0 table #133: 3524 bytes OK
|
||||||
2026/04/11-15:29:26.044411 7ff3bdbfb6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 53 : 1
|
2026/04/15-02:16:16.676484 7fc1d8fbb6c0 Delete type=0 #131
|
||||||
2026/04/11-15:29:26.044420 7ff3bdbfb6c0 Compacting 1@1 + 1@2 files
|
2026/04/15-02:16:16.763469 7fc1d8fbb6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 109 : 1
|
||||||
2026/04/11-15:29:26.047715 7ff3bdbfb6c0 Generated table #62@1: 9 keys, 6617 bytes
|
2026/04/15-02:16:16.763478 7fc1d8fbb6c0 Compacting 2@0 + 0@1 files
|
||||||
2026/04/11-15:29:26.047736 7ff3bdbfb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
2026/04/15-02:16:16.781648 7fc1d8fbb6c0 Generated table #134@0: 1 keys, 1363 bytes
|
||||||
2026/04/11-15:29:26.054365 7ff3bdbfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
2026/04/15-02:16:16.781712 7fc1d8fbb6c0 Compacted 2@0 + 0@1 files => 1363 bytes
|
||||||
2026/04/11-15:29:26.054474 7ff3bdbfb6c0 Delete type=2 #57
|
2026/04/15-02:16:16.819583 7fc1d8fbb6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
2026/04/11-15:29:26.054607 7ff3bdbfb6c0 Delete type=2 #61
|
2026/04/15-02:16:16.819716 7fc1d8fbb6c0 Delete type=2 #130
|
||||||
2026/04/11-15:29:26.064047 7ff3bdbfb6c0 Manual compaction at level-1 from '!items!null' @ 53 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:16.819841 7fc1d8fbb6c0 Delete type=2 #133
|
||||||
|
2026/04/15-02:16:16.881505 7fc1d8fbb6c0 Manual compaction at level-0 from '!items!null' @ 109 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||||
|
2026/04/15-02:16:16.881561 7fc1d8fbb6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 116 : 1
|
||||||
|
2026/04/15-02:16:16.881568 7fc1d8fbb6c0 Compacting 1@1 + 1@2 files
|
||||||
|
2026/04/15-02:16:16.899721 7fc1d8fbb6c0 Generated table #135@1: 9 keys, 6617 bytes
|
||||||
|
2026/04/15-02:16:16.899762 7fc1d8fbb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
||||||
|
2026/04/15-02:16:16.937990 7fc1d8fbb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||||
|
2026/04/15-02:16:16.938116 7fc1d8fbb6c0 Delete type=2 #126
|
||||||
|
2026/04/15-02:16:16.938278 7fc1d8fbb6c0 Delete type=2 #134
|
||||||
|
2026/04/15-02:16:17.092334 7fc1d8fbb6c0 Manual compaction at level-1 from '!items!null' @ 116 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,15 +1,3 @@
|
|||||||
2026/04/11-15:27:20.551914 7f20ee3ff6c0 Recovering log #50
|
2026/04/14-10:43:54.279048 7fddd97be6c0 Recovering log #124
|
||||||
2026/04/11-15:27:20.562310 7f20ee3ff6c0 Delete type=3 #48
|
2026/04/14-10:43:54.288686 7fddd97be6c0 Delete type=3 #122
|
||||||
2026/04/11-15:27:20.562396 7f20ee3ff6c0 Delete type=0 #50
|
2026/04/14-10:43:54.288755 7fddd97be6c0 Delete type=0 #124
|
||||||
2026/04/11-15:27:31.313674 7f1e4ffff6c0 Level-0 table #56: started
|
|
||||||
2026/04/11-15:27:31.317287 7f1e4ffff6c0 Level-0 table #56: 3524 bytes OK
|
|
||||||
2026/04/11-15:27:31.323440 7f1e4ffff6c0 Delete type=0 #54
|
|
||||||
2026/04/11-15:27:31.336770 7f1e4ffff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/11-15:27:31.336813 7f1e4ffff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 49 : 1
|
|
||||||
2026/04/11-15:27:31.336819 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/11-15:27:31.340181 7f1e4ffff6c0 Generated table #57@1: 9 keys, 6617 bytes
|
|
||||||
2026/04/11-15:27:31.340207 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
|
|
||||||
2026/04/11-15:27:31.346883 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/11-15:27:31.346998 7f1e4ffff6c0 Delete type=2 #52
|
|
||||||
2026/04/11-15:27:31.347109 7f1e4ffff6c0 Delete type=2 #56
|
|
||||||
2026/04/11-15:27:31.353403 7f1e4ffff6c0 Manual compaction at level-1 from '!items!null' @ 49 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
BIN
packs-system/anomalies/MANIFEST-000129
Normal file
BIN
packs-system/pretires/000018.ldb
Normal file
1
packs-system/pretires/CURRENT
Normal file
@@ -0,0 +1 @@
|
|||||||
|
MANIFEST-000037
|
||||||
0
packs-system/pretires/LOCK
Normal file
8
packs-system/pretires/LOG
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
2026/04/14-21:45:17.237698 7fc1da7be6c0 Recovering log #36
|
||||||
|
2026/04/14-21:45:17.253057 7fc1da7be6c0 Delete type=0 #36
|
||||||
|
2026/04/14-21:45:17.253185 7fc1da7be6c0 Delete type=3 #35
|
||||||
|
2026/04/15-02:16:16.720764 7fc1d8fbb6c0 Level-0 table #40: started
|
||||||
|
2026/04/15-02:16:16.720792 7fc1d8fbb6c0 Level-0 table #40: 0 bytes OK
|
||||||
|
2026/04/15-02:16:16.763312 7fc1d8fbb6c0 Delete type=0 #38
|
||||||
|
2026/04/15-02:16:16.819920 7fc1d8fbb6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||||
|
2026/04/15-02:16:16.881536 7fc1d8fbb6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
|
||||||
3
packs-system/pretires/LOG.old
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
2026/04/14-10:43:54.291004 7fddd8fbd6c0 Recovering log #33
|
||||||
|
2026/04/14-10:43:54.301929 7fddd8fbd6c0 Delete type=3 #31
|
||||||
|
2026/04/14-10:43:54.301981 7fddd8fbd6c0 Delete type=0 #33
|
||||||
BIN
packs-system/pretires/MANIFEST-000037
Normal file
0
packs-system/scenes/000078.log
Normal file
BIN
packs-system/scenes/000080.ldb
Normal file
@@ -1 +1 @@
|
|||||||
MANIFEST-000015
|
MANIFEST-000076
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
2026/04/11-15:27:57.633319 7ff3bf3fe6c0 Recovering log #13
|
2026/04/14-21:45:17.278141 7fc1d97bc6c0 Recovering log #75
|
||||||
2026/04/11-15:27:57.644646 7ff3bf3fe6c0 Delete type=3 #11
|
2026/04/14-21:45:17.294441 7fc1d97bc6c0 Delete type=0 #75
|
||||||
2026/04/11-15:27:57.644712 7ff3bf3fe6c0 Delete type=0 #13
|
2026/04/14-21:45:17.294490 7fc1d97bc6c0 Delete type=3 #74
|
||||||
2026/04/11-15:29:26.001386 7ff3bdbfb6c0 Level-0 table #18: started
|
2026/04/15-02:16:16.819929 7fc1d8fbb6c0 Level-0 table #79: started
|
||||||
2026/04/11-15:29:26.005135 7ff3bdbfb6c0 Level-0 table #18: 3095 bytes OK
|
2026/04/15-02:16:16.847375 7fc1d8fbb6c0 Level-0 table #79: 3342 bytes OK
|
||||||
2026/04/11-15:29:26.012219 7ff3bdbfb6c0 Delete type=0 #16
|
2026/04/15-02:16:16.881351 7fc1d8fbb6c0 Delete type=0 #77
|
||||||
2026/04/11-15:29:26.034958 7ff3bdbfb6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:16.881546 7fc1d8fbb6c0 Manual compaction at level-0 from '!scenes!0iGCRqkdJKjmmbl4' @ 72057594037927935 : 1 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at (end)
|
||||||
2026/04/11-15:29:26.035011 7ff3bdbfb6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 31 : 1
|
2026/04/15-02:16:16.938347 7fc1d8fbb6c0 Manual compaction at level-1 from '!scenes!0iGCRqkdJKjmmbl4' @ 72057594037927935 : 1 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 49 : 0
|
||||||
2026/04/11-15:29:26.035018 7ff3bdbfb6c0 Compacting 1@1 + 1@2 files
|
2026/04/15-02:16:16.938354 7fc1d8fbb6c0 Compacting 1@1 + 1@2 files
|
||||||
2026/04/11-15:29:26.038199 7ff3bdbfb6c0 Generated table #19@1: 7 keys, 3095 bytes
|
2026/04/15-02:16:16.955205 7fc1d8fbb6c0 Generated table #80@1: 3 keys, 1810 bytes
|
||||||
2026/04/11-15:29:26.038215 7ff3bdbfb6c0 Compacted 1@1 + 1@2 files => 3095 bytes
|
2026/04/15-02:16:16.955236 7fc1d8fbb6c0 Compacted 1@1 + 1@2 files => 1810 bytes
|
||||||
2026/04/11-15:29:26.044152 7ff3bdbfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
2026/04/15-02:16:16.986128 7fc1d8fbb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||||
2026/04/11-15:29:26.044236 7ff3bdbfb6c0 Delete type=2 #10
|
2026/04/15-02:16:16.986229 7fc1d8fbb6c0 Delete type=2 #57
|
||||||
2026/04/11-15:29:26.044341 7ff3bdbfb6c0 Delete type=2 #18
|
2026/04/15-02:16:16.986351 7fc1d8fbb6c0 Delete type=2 #79
|
||||||
2026/04/11-15:29:26.064030 7ff3bdbfb6c0 Manual compaction at level-1 from '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 31 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
2026/04/15-02:16:17.092360 7fc1d8fbb6c0 Manual compaction at level-1 from '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 49 : 0 .. '!scenes.levels!Jr7lGxYk2RETlXRv.defaultLevel0000' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,3 @@
|
|||||||
2026/04/11-15:27:20.576678 7f20ecbfc6c0 Recovering log #8
|
2026/04/14-10:43:54.317254 7fddd9fbf6c0 Recovering log #72
|
||||||
2026/04/11-15:27:20.586717 7f20ecbfc6c0 Delete type=3 #6
|
2026/04/14-10:43:54.326872 7fddd9fbf6c0 Delete type=3 #70
|
||||||
2026/04/11-15:27:20.586780 7f20ecbfc6c0 Delete type=0 #8
|
2026/04/14-10:43:54.326932 7fddd9fbf6c0 Delete type=0 #72
|
||||||
2026/04/11-15:27:31.330627 7f1e4ffff6c0 Level-0 table #14: started
|
|
||||||
2026/04/11-15:27:31.330649 7f1e4ffff6c0 Level-0 table #14: 0 bytes OK
|
|
||||||
2026/04/11-15:27:31.336642 7f1e4ffff6c0 Delete type=0 #12
|
|
||||||
2026/04/11-15:27:31.336792 7f1e4ffff6c0 Manual compaction at level-0 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/11-15:27:31.347189 7f1e4ffff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
BIN
packs-system/scenes/MANIFEST-000076
Normal file
654
pretires_extracted.json
Normal file
@@ -0,0 +1,654 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Niels Bielke",
|
||||||
|
"concept": "L’ARTISTE MAUDIT",
|
||||||
|
"metier": "Acteur",
|
||||||
|
"age": "JOUEUR 38",
|
||||||
|
"origine": "Suède",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Niels Bielke connut une carrière fulgurante en jouant sur les planches de tous les théâtres réputés \nde Suède. Lassé par son succès, il quitta la Terre pour conquérir la Lune.\nQuelle déception de perdre son statut de vedette ! En effet, la concurrence est rude à Célestopol, \noù la culture sous toutes ses formes est richement célébrée, notamment à travers les dépenses pha-\nraoniques du duc Nikolaï. Niels pensait pouvoir se tailler la part du lion, mais c’est son ego qui \nse retrouva taillé en pièce. Il s’obstina pendant plusieurs années, voyant toutes les portes se fermer \ndevant lui petit à petit. Sombrant dans le mépris de lui-même et l’alcool conjointement, Niels \nne connut son salut que grâce à l’intervention d’Ernest, qui sauva littéralement la vie de l’artiste \nmaudit sur le point de se jeter dans le sélénium.\nDepuis, Niels tente de payer sa dette en servant de son mieux comme agent au sein de l’équipe \ndu Lys blanc et en respectant sa parole de ne plus toucher à l’alcool. Niels porte les stigmates d’un \nhomme ayant commis des abus – en particulier un tic nerveux dont il n’arrive pas à se débarrasser. \nMalgré ce désagrément et une allure en apparence négligée, il conserve un charisme et une aura \ncertains. Niels approche de la quarantaine.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Suggestion",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation d’Âme, Niels peut relancer les\n2d8 2 fois au cours d’un même scénario, mais doit conserver le\ndernier résultat.",
|
||||||
|
"narratif": "Niels est en mesure d’influer sur la prise de décision d’une per-\nsonne en lui parlant à voix haute et en la fixant dans les yeux. Cette\ndécision doit avoir un impact immédiat.\nExemples : Un garde choisit finalement de laisser passer Niels. Un\nprisonnier accepte de lui donner son nom, etc.\nNote : Ce pouvoir fonctionne également sur les automates\nsophistiqués de 4e et 5e générations.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 2,
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 3,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 3
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 4,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 4,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 2,
|
||||||
|
"instruction": 3,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Charismatique",
|
||||||
|
"valeur": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Sensible",
|
||||||
|
"valeur": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Polyphème",
|
||||||
|
"concept": "LE CHRONIQUEUR",
|
||||||
|
"metier": "Assistant-archiviste",
|
||||||
|
"age": "JOUEUR Inconnu",
|
||||||
|
"origine": "Inconnue",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Automate de 4e génération émancipé par Ernest après que le Français le retrouva dans un piteux \nétat au fond d’une impasse.\nL’attention du vétéran fut attirée par l’être artificiel alors qu’un groupe d’étudiants sortaient hilares \nde la ruelle sombre. L’automate avait manifestement été passé à tabac. Après plusieurs semaines \ndurant lesquelles personne n’en revendiqua la propriété, Ernest prit sur lui de payer ses réparations.\nMalgré sa remise en état de marche, l’automate semblait ne pas conserver de souvenir de sa « vie » \npassée. C’est ainsi qu’il entra au service d’Ernest en tant qu’assistant-archiviste au sein de l’agence \ndu Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, l’automate le plus célèbre de \nla Cité, l’archiviste est désormais la propriété d’Ernest.\nDans les faits, l’automate est un membre à part entière de l’agence, parfaitement intégré au sein \nde son équipe. Malgré tout, depuis son agression, Polyphème se plaint de ne pas avoir le « bon \nvisage », ce dont il peut parfois faire une obsession.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Voyage astral",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’Appréciation, de Merveilleux technologique, de\nTraitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au\ncours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "L’esprit de Polpyphème quitte son enveloppe corporelle et se déplace\nde 8 mètres par tour pendant 4 tours, dans n’importe quelle direction.\nDe cette manière, l’esprit est invisible et peut ignorer tous les obstacles.\nSes sens restent toutefois les mêmes.\nExemples : Polyphème accède aux toits d’une maison ou il peut aller\nen repérage dans la pièce voisine. Si un éboulis bloque le passage d’un\ntunnel, Polyphème peut voir sur quelle distance et s’il y a des survivants.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 0,
|
||||||
|
"artifice": 3,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 3
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 0,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 3
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 2,
|
||||||
|
"instruction": 4,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 3,
|
||||||
|
"traitement": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"vision": 2,
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Difficile à lire",
|
||||||
|
"valeur": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Étrangeté",
|
||||||
|
"valeur": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Mémoire eidétique",
|
||||||
|
"valeur": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Vision aiguisée",
|
||||||
|
"valeur": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sèdami Alassane",
|
||||||
|
"concept": "LA DIPLOMATE",
|
||||||
|
"metier": "Guerrière /",
|
||||||
|
"age": "JOUEUR 58",
|
||||||
|
"origine": "Dahomey",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Formée au sein du redoutable bataillon des Mino, ces guerrières d’élite du royaume de Dahomey, Sèdami \ns’illustra au combat mais également en stratégie, ce qui lui permit rapidement de devenir officière parmi les \n« amazones du Dahomey », comme on les surnomme souvent.\nToutefois, son esprit militaire cohabitait toujours avec une certaine rêverie tournée vers la Lune \net sa ville utopique, Célestopol. Longtemps, elle espéra secrètement parcourir ses rues, obser-\nver ses canaux, ressentir son ambiance slave unique… Possédant une intelligence interpersonnelle \ntrès développée, Sèdami devint alors diplomate et fut à plusieurs reprises assignée à des missions \nprotocolaires sur le continent africain puis en Europe et au Moyen-Orient. Il y a cinq ans, elle eut l’occa-\nsion d’exaucer son rêve en tant que conseillère du roi Béhanzin au cours d’une visite de courtoisie au duc \nNikolaï, à Célestopol.\nTotalement subjuguée par la cité sélène et marquée dans son âme par le sélénium, Sèdami ne l’a plus jamais \nquittée, abandonnant son rôle de diplomate du Dahomey. Quoique son Afrique natale lui manque sou-\nvent, elle ne reviendra pas sur sa décision de vivre désormais sur la Lune.\nSèdami est une femme d’âge mûr, confiante en ses capacités, avec un esprit très ouvert.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télépathie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’Appréciation, d’Attraction, d’Échauffourée ou de\nFaveur, Sèdami peut relancer les 2d8 2 fois au cours d’un même\nscénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Sèdami est capable de percevoir les pensées superficielles d’un tiers.\nDe cette manière, elle peut comprendre l’état émotionnel d’une per-\nsonne, voire capter une image ou un mot (à l’appréciation du narra-\nteur) dans son esprit, simplement en l’observant.\nExemples : Sèdami suspecte une tentative de meurtre et perçoit un flacon\nde cyanure dans l’esprit d’un domestique. Malgré un faciès contenu, elle\nsaisit qu’un magistrat est en fait terrorisé.\nNote : Ce pouvoir fonctionne également sur les automates\nsophistiqués de 4e et 5e générations.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 4,
|
||||||
|
"artifice": 1,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 3
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 3,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 0,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 2
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 1,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Comportementaliste",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Stratège",
|
||||||
|
"valeur": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bao Wang",
|
||||||
|
"concept": "L’ESCROC",
|
||||||
|
"metier": "Videur",
|
||||||
|
"age": "JOUEUR 32",
|
||||||
|
"origine": "Chine",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Ancien employé du casino flottant La Libellule, où il officiait comme videur.\nAprès une adolescence de petite frappe dans les faubourgs de Shanghai, il parvint à s’introduire dans un \nobus-traversier pour rejoindre Célestopol, autant attiré par les perspectives offertes par la cité lunaire que \npar le besoin de se faire oublier des services de police de sa ville natale.\nProblème : Bao répugne à se battre et préfère largement la finesse à la violence. De son ancienne vie, il \nconserve un goût prononcé pour le jeu et la gent féminine. Par ailleurs, Bao a également un certain pen-\nchant pour les cabarets clandestins, dans lesquels il aime à se travestir à l’occasion. C’est dans l’un de ces \nlieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de l’agence de détectives du Lys \nblanc. Le vétéran sut voir un certain potentiel chez Bao et les deux hommes sympathisèrent. Bao, passable-\nment désœuvré et fauché, accepta, sans trop y croire, d’intégrer l’agence en tant que détective.\nSon sens de la débrouillardise et son passé houleux parfois bien utile lui octroient des compétences uniques \net font désormais de lui un agent indispensable. Le jeune homme s’investit d’ailleurs sincèrement dans son \ntravail. Toujours tiré à quatre épingles, Bao est reconnu parmi ses coéquipiers comme le plus nonchalant \ndu groupe.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Entropie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Bao peut relancer le dé de la Lune 1 fois au cours d’un même\nscénario et choisir de conserver le résultat qu’il préfère (cette faculté\nne fonctionne pas pour les tests de chance).",
|
||||||
|
"narratif": "Bao peut influer sur le hasard de manière mineure.\nExemples : En jouant au poker, Bao récupère une bonne main à la\ndistribution. Le feu passe au vert alors qu’il tourne au coin de la rue.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 2,
|
||||||
|
"artifice": 4,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 4,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 4,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 0,
|
||||||
|
"appreciation": 2,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 3
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 0,
|
||||||
|
"instruction": 0,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 2,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Aime le jeu",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Belle gueule",
|
||||||
|
"valeur": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Elemiah Cowen",
|
||||||
|
"concept": "L’OUVRIER",
|
||||||
|
"metier": "Manutentionnaire",
|
||||||
|
"age": "JOUEUR 28",
|
||||||
|
"origine": "Célestopol",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Elemiah et son frère Rubben travaillèrent toute leur vie comme des forçats dans les usines souterraines \nde Célestopol. Comme des dizaines de milliers d’ouvriers vivant dans des conditions très difficiles, ils \napprirent à se serrer les coudes de manière à soutenir leur communauté. Un jour, un des nombreux acci-\ndents quotidiens liés à un dysfonctionnement d’une machine emporta Rubben et priva Elemiah de deux \ndoigts de sa main gauche. Depuis, l’ouvrier survivant s’est promis de tout faire pour aider les miséreux \nde la ville. Il connaît donc bien la face cachée de Célestopol et en garde un goût amer. Dur à la tâche, \ndu genre taiseux, mais toujours le premier à proposer son aide et son soutien, cet ancien ouvrier d’une \ntrentaine d’années a le cœur tendre. Son torse large, ses sourcils broussailleux et sa moustache travaillée \nimpressionnent souvent. Mais il est surtout connu pour avoir un certain talent pour le tirage des cartes – il \ntombe d’ailleurs encore plus souvent juste depuis son accident –, et reste très apprécié de sa communauté, \nmême s’il travaille aujourd’hui comme manutentionnaire aux galeries Sabline.\nSubjugué par l’architecture démentielle de la cité lunaire et, surtout, par ses automates, il consacre désor-\nmais chaque minute de son temps libre à errer à travers la ville et à s’en émerveiller. Une manière pour lui \nd’expérimenter ce que son frère ne pourra jamais faire.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Tarot divinatoire",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation de Cœur, Elemiah gagne la pos-\nsibilité de relancer les 2d8 2 fois au cours d’un même scénario,\nmais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "En tirant les cartes, Elemiah peut apprendre une information sur\nune personne concernant son passé, son présent ou son futur.\nL’information reste soumise à interprétation.\nExemples : Elemiah cherche à savoir où sera sa cible le lendemain. Il\nveut connaître l’histoire d’un voisin.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 0,
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 4
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 4,
|
||||||
|
"appreciation": 4,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 4,
|
||||||
|
"traque": 0
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 0,
|
||||||
|
"instruction": 0,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 1,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Digne de confiance",
|
||||||
|
"valeur": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Robuste",
|
||||||
|
"valeur": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nadeja Danilo",
|
||||||
|
"concept": "LA PILOTE",
|
||||||
|
"metier": "Pilote",
|
||||||
|
"age": "JOUEUR 35",
|
||||||
|
"origine": "Célestopol",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Née à Célestopol de deux parents universitaires, Nadeja ne fut jamais une enfant comme les autres. \nIntrovertie, elle avait du mal à entrer en relation avec les autres. Intriguée par les nombreux livres occu-\npant l’espace familial, elle tourna surtout son esprit vers les étoiles, le lointain. Mars, Cérès, les confins du \nsystème solaire occupaient ses pensées comme une obsession, si bien qu’avec l’âge, elle choisit de devenir \npilote d’aéronef afin de pouvoir caresser l’espoir de rejoindre un jour ces destinations chères à son cœur. \nNadeja intégra l’académie de pilotes de la White Star Line et démontra des aptitudes presque hors norme, à \ntel point que les commandes des vaisseaux semblaient répondre à ses exigences sans qu’elle ait à intervenir. \nLucide, concentrée, apprenant vite, Nadeja décrocha son diplôme sans aucune difficulté et réalisa ainsi la \npremière étape de son rêve.\nC’était avant que la réalité – et la misogynie galopante dans le milieu majoritairement masculin des pilotes \nd’aéronef – ne la rattrape : Nadeja, pourtant bien plus compétente que la plupart de ses collègues, fut sou-\nvent reléguée au poste de copilote. Elle en garde une certaine rancœur et préfère, pour le moment, travailler \npour l’entreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. \nEn réalité, elle ne supporte pas qu’on lui manque de respect.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télékinésie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation de Corps, Nadeja peut relancer\nles 2d8 2 fois au cours d’un même scénario, mais doit conserver le\ndernier résultat.",
|
||||||
|
"narratif": "Dans un rayon de 8 mètres, Nadeja peut déplacer un petit objet\nléger et sans attaches par la pensée sur 4 mètres (n’importe quelle\ndirection) pendant 2 tours.\nExemples : Nadeja peut déplacer une cuillère pour la faire tomber\nd’une table. Elle peut faire léviter un jeu de tarot.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 0,
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 3,
|
||||||
|
"prouesse": 2
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 1
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Résiliente",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Tête froide",
|
||||||
|
"valeur": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Maribel Vargas",
|
||||||
|
"concept": "LA SCIENTIFIQUE",
|
||||||
|
"metier": "Mécanicienne",
|
||||||
|
"age": "JOUEUR 25",
|
||||||
|
"origine": "Mexique",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Ancienne mécanicienne ayant travaillé notamment sur les lignes de chemin de fer reliant Célestopol à la \nstation du Pôle Nord.\nMaribel Vargas fut longtemps bridée dans son évolution de carrière à cause de son origine mexicaine et de \nson genre. Or, malgré son jeune âge (vingt-cinq ans), Maribel est une experte dans l’ingénierie de pointe, \nspécialement dans l’utilisation du fameux sélénium occupant les canaux de la ville. Ses parents, aux revenus \nmodestes, firent beaucoup de sacrifices pour lui permettre d’étudier à l’université de Célestopol, dont elle \nest d’ailleurs sortie major de promotion. Pourtant, personne n’avait souhaité lui donner sa chance avant \nErnest, qui tenait à avoir dans son agence une personne capable de réparer Polyphème, mais aussi de com-\nprendre les complexités de la technologie lunaire.\nMaribel subit les moqueries amusées du reste de son équipe, car elle a tendance à parler seule, surtout \nquand elle répare ou examine un mécanisme, quel qu’il soit. Par ailleurs, c’est une véritable amatrice de \npeinture, qui connaît très bien les allées du musée des Beaux-Arts.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Communication avec les morts",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors du test d’une Spécialisation d’Esprit, Maribel peut relancer\nles 2d8 2 fois au cours d’un même scénario, mais doit conserver le\ndernier résultat.",
|
||||||
|
"narratif": "Maribel entre en contact avec l’esprit d’un défunt. Elle peut lui\nposer une question fermée (réponse par oui ou non).\nExemples : Maribel interroge la victime d’un meurtre. Elle consulte\nl’esprit d’un aïeul.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 0,
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 2
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 3,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 2
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Déterminée",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Sagace",
|
||||||
|
"valeur": 2
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Wiktoria Raźny",
|
||||||
|
"concept": "LA VÉTÉRANE",
|
||||||
|
"metier": "Soldate",
|
||||||
|
"age": "JOUEUR 39",
|
||||||
|
"origine": "Pologne",
|
||||||
|
"faction": null,
|
||||||
|
"biographie": "Wiktoria Raźny était soldate durant la Seconde Guerre de Crimée.\nCette Polonaise de presque quarante ans aujourd’hui prit les armes pour défendre sa patrie en tant que \nconscrite. Blessée à l’œil, qu’elle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort \ndans l’estime et la reconnaissance que son sacrifice aurait dû lui apporter. Au contraire, son handicap et \nsa dégaine dégingandée lui valurent un certain rejet de ses compatriotes, ce qui la poussa, par dégoût, à \ns’éloigner autant que possible de la Pologne. Et pour cela, quoi de mieux que d’aller sur la Lune ? Sur place, \nelle rencontra Ernest, avec qui elle eut une aventure. Leurs points communs étaient multiples, il faut dire. \nDevenus bons amis, ils commencèrent à travailler ensemble quand le vétéran recruta l’ancienne soldate \ndans son agence du Lys blanc.\nAvec l’âge et le recul, Wiktoria assume parfaitement son handicap et porte un œil de verre. Elle explore les \nsoirées mondaines qu’elle apprécie tant et durant lesquelles elle se fait fort de collecter nombre d’informa-\ntions utiles à l’agence, mêlant ainsi l’utile à l’agréable.",
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Illusion",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test de Coercition, d’Échauffourée, d’Effacement ou de\nTraque, Wiktoria peut relancer les 2d8 2 fois au cours d’un même\nscénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Wiktoria peut générer une petite illusion mineure (visuelle, audi-\ntive, olfactive, etc., au choix) sans détail ou précision pendant\n1 minute.\nExemples : Wiktoria peut faire entendre le bruit d’un chat qui miaule\nou d’un livre qui tombe. Elle peut faire apparaître un éclat métallique\nou une ombre fugace. Elle peut créer une odeur de pluie ou de fumée.",
|
||||||
|
"exemples": null,
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"domaines": {
|
||||||
|
"ame": {
|
||||||
|
"resistance": 2,
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2
|
||||||
|
},
|
||||||
|
"corps": {
|
||||||
|
"resistance": 2,
|
||||||
|
"echauffouree": 4,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 3
|
||||||
|
},
|
||||||
|
"coeur": {
|
||||||
|
"resistance": 0,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 2,
|
||||||
|
"traque": 3
|
||||||
|
},
|
||||||
|
"esprit": {
|
||||||
|
"resistance": 0,
|
||||||
|
"instruction": 1,
|
||||||
|
"merveilleux_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 2,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
{
|
||||||
|
"nom": "Affable",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Grande",
|
||||||
|
"valeur": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom": "Expérience militaire",
|
||||||
|
"valeur": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"Agence Pinkerton": 0,
|
||||||
|
"-4 -3 -2 -1 0 1 2 3 4": 0,
|
||||||
|
"Police secrète du duc": 0,
|
||||||
|
"Okhrana": 0,
|
||||||
|
"Luna NovaTek": 0,
|
||||||
|
"Société théosophique OTO": 0,
|
||||||
|
"Syndicats clandestins": 0,
|
||||||
|
"Vorovskoy Mir": 0,
|
||||||
|
"Cour des merveilles": 0
|
||||||
|
},
|
||||||
|
"weapons": [],
|
||||||
|
"armures": [],
|
||||||
|
"equipment": [],
|
||||||
|
"descriptionPhysique": null,
|
||||||
|
"descriptionPsychologique": null,
|
||||||
|
"notes": "Armes/armures/équipement non présents dans le PDF. Relations de factions toutes à 0 (valeur par défaut, indicateurs visuels hors portée du PDF text)."
|
||||||
|
}
|
||||||
|
]
|
||||||
605
pretires_v2.json
Normal file
@@ -0,0 +1,605 @@
|
|||||||
|
{
|
||||||
|
"Niels Bielke": {
|
||||||
|
"age": 38,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Acteur MÉTIER",
|
||||||
|
"faction_label": "Suède ORIGINE Acteur MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 4,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 3,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 4,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 3,
|
||||||
|
"merv_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 1
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Suggestion",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Charismatique (2)",
|
||||||
|
"Sensible (1)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "NIELS BIELKE : L’ARTISTE MAUDIT\nNiels Bielke connut une carrière fulgurante en jouant sur les planches de tous les théâtres réputés \nde Suède. Lassé par son succès, il quitta la Terre pour conquérir la Lune.\nQuelle déception de perdre son statut de vedette ! En effet, la concurrence est rude à Célestopol, \noù la culture sous toutes ses formes est richement célébrée, notamment à travers les dépenses pha-\nraoniques du duc Nikolaï. Niels pensait pouvoir se tailler la part du lion, mais c’est son ego qui \nse retrouva taillé en pièce. Il s’obstina pendant plusieurs années, voyant toutes les portes se fermer \ndevant lui petit à petit. Sombrant dans le mépris de lui-même et l’alcool conjointement, Niels \nne connut son salut que grâce à l’intervention d’Ernest, qui sauva littéralement la vie de l’artiste \nmaudit sur le point de se jeter dans le sélénium.\nDepuis, Niels tente de payer sa dette en servant de son mieux comme agent au sein de l’équipe \ndu Lys blanc et en respectant sa parole de ne plus toucher à l’alcool. Niels porte les stigmates d’un \nhomme ayant commis des abus – en particulier un tic nerveux dont il n’arrive pas à se débarrasser. \nMalgré ce désagrément et une allure en apparence négligée, il conserve un charisme et une aura \ncertains. Niels approche de la quarantaine.\nANOMALIE\nSuggestion 2\nTechnique\nLors d’un test d’une Spécialisation d’Âme, Niels peut relancer les \n2d8 2 fois au cours d’un même scénario, mais doit conserver le \ndernier résultat.\nNarratif\nNiels est en mesure d’influer sur la prise de décision d’une per-\nsonne en lui parlant à voix haute et en la fixant dans les yeux. Cette \ndécision doit avoir un impact immédiat.\nExemples : Un garde choisit finalement de laisser passer Niels. Un \nprisonnier accepte de lui donner son nom, etc.\nNote : Ce pouvoir fonctionne également sur les automates \nsophistiqués de 4e et 5e générations.\n",
|
||||||
|
"_asp_text_raw": "BLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nCharismatique (2)\nSensible (1)\n"
|
||||||
|
},
|
||||||
|
"Polyphème": {
|
||||||
|
"age": null,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Assistant-archiviste MÉTIER",
|
||||||
|
"faction_label": "Inconnue ORIGINE Assistant-archiviste MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 3,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 4,
|
||||||
|
"merv_tech": 3,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "astral",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Difficile à lire (2)",
|
||||||
|
"Étrangeté (2)",
|
||||||
|
"Mémoire eidétique (2)",
|
||||||
|
"Vision aiguisée (1)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "POLYPHÈME : LE CHRONIQUEUR\nAutomate de 4e génération émancipé par Ernest après que le Français le retrouva dans un piteux \nétat au fond d’une impasse.\nL’attention du vétéran fut attirée par l’être artificiel alors qu’un groupe d’étudiants sortaient hilares \nde la ruelle sombre. L’automate avait manifestement été passé à tabac. Après plusieurs semaines \ndurant lesquelles personne n’en revendiqua la propriété, Ernest prit sur lui de payer ses réparations.\nMalgré sa remise en état de marche, l’automate semblait ne pas conserver de souvenir de sa « vie » \npassée. C’est ainsi qu’il entra au service d’Ernest en tant qu’assistant-archiviste au sein de l’agence \ndu Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, l’automate le plus célèbre de \nla Cité, l’archiviste est désormais la propriété d’Ernest.\nDans les faits, l’automate est un membre à part entière de l’agence, parfaitement intégré au sein \nde son équipe. Malgré tout, depuis son agression, Polyphème se plaint de ne pas avoir le « bon \nvisage », ce dont il peut parfois faire une obsession.\nANOMALIE\nVoyage astral 2\nTechnique\nLors d’un test d’Appréciation, de Merveilleux technologique, de \nTraitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au \ncours d’un même scénario, mais doit conserver le dernier résultat.\nNarratif\nL’esprit de Polpyphème quitte son enveloppe corporelle et se déplace \nde 8 mètres par tour pendant 4 tours, dans n’importe quelle direction. \nDe cette manière, l’esprit est invisible et peut ignorer tous les obstacles. \nSes sens restent toutefois les mêmes.\nExemples : Polyphème accède aux toits d’une maison ou il peut aller \nen repérage dans la pièce voisine. Si un éboulis bloque le passage d’un \ntunnel, Polyphème peut voir sur quelle distance et s’il y a des survivants.\n \n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nDifficile à lire (2)\nÉtrangeté (2)\nMémoire eidétique (2)\nVision aiguisée (1)\n"
|
||||||
|
},
|
||||||
|
"Sèdami Alassane": {
|
||||||
|
"age": 58,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Guerrière / diplomate MÉTIER",
|
||||||
|
"faction_label": "Dahomey ORIGINE Guerrière / diplomate MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 4,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 1,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 1,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 5,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 3,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télépathie",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Comportementaliste (1)",
|
||||||
|
"Stratège (2)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "SÈDAMI ALASSANE : LA DIPLOMATE\nFormée au sein du redoutable bataillon des Mino, ces guerrières d’élite du royaume de Dahomey, Sèdami \ns’illustra au combat mais également en stratégie, ce qui lui permit rapidement de devenir officière parmi les \n« amazones du Dahomey », comme on les surnomme souvent.\nToutefois, son esprit militaire cohabitait toujours avec une certaine rêverie tournée vers la Lune \net sa ville utopique, Célestopol. Longtemps, elle espéra secrètement parcourir ses rues, obser-\nver ses canaux, ressentir son ambiance slave unique… Possédant une intelligence interpersonnelle \ntrès développée, Sèdami devint alors diplomate et fut à plusieurs reprises assignée à des missions \nprotocolaires sur le continent africain puis en Europe et au Moyen-Orient. Il y a cinq ans, elle eut l’occa-\nsion d’exaucer son rêve en tant que conseillère du roi Béhanzin au cours d’une visite de courtoisie au duc \nNikolaï, à Célestopol.\nTotalement subjuguée par la cité sélène et marquée dans son âme par le sélénium, Sèdami ne l’a plus jamais \nquittée, abandonnant son rôle de diplomate du Dahomey. Quoique son Afrique natale lui manque sou-\nvent, elle ne reviendra pas sur sa décision de vivre désormais sur la Lune.\nSèdami est une femme d’âge mûr, confiante en ses capacités, avec un esprit très ouvert.\nANOMALIE\nTélépathie 2\nTechnique\nLors d’un test d’Appréciation, d’Attraction, d’Échauffourée ou de \nFaveur, Sèdami peut relancer les 2d8 2 fois au cours d’un même \nscénario, mais doit conserver le dernier résultat.\nNarratif\nSèdami est capable de percevoir les pensées superficielles d’un tiers. \nDe cette manière, elle peut comprendre l’état émotionnel d’une per-\nsonne, voire capter une image ou un mot (à l’appréciation du narra-\nteur) dans son esprit, simplement en l’observant.\nExemples : Sèdami suspecte une tentative de meurtre et perçoit un flacon \nde cyanure dans l’esprit d’un domestique. Malgré un faciès contenu, elle \nsaisit qu’un magistrat est en fait terrorisé.\nNote : Ce pouvoir fonctionne également sur les automates \nsophistiqués de 4e et 5e générations.\n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nComportementaliste (1)\nStratège (2)\n"
|
||||||
|
},
|
||||||
|
"Bao Wang": {
|
||||||
|
"age": 32,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Videur MÉTIER",
|
||||||
|
"faction_label": "Chine ORIGINE Videur MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 4,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 2,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 4,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 4,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 4,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0,
|
||||||
|
"appreciation": 2,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 0,
|
||||||
|
"merv_tech": 2,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Entropie",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Aime le jeu (1)",
|
||||||
|
"Belle gueule (2)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "BAO WANG : L’ESCROC\nAncien employé du casino flottant La Libellule, où il officiait comme videur.\nAprès une adolescence de petite frappe dans les faubourgs de Shanghai, il parvint à s’introduire dans un \nobus-traversier pour rejoindre Célestopol, autant attiré par les perspectives offertes par la cité lunaire que \npar le besoin de se faire oublier des services de police de sa ville natale.\nProblème : Bao répugne à se battre et préfère largement la finesse à la violence. De son ancienne vie, il \nconserve un goût prononcé pour le jeu et la gent féminine. Par ailleurs, Bao a également un certain pen-\nchant pour les cabarets clandestins, dans lesquels il aime à se travestir à l’occasion. C’est dans l’un de ces \nlieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de l’agence de détectives du Lys \nblanc. Le vétéran sut voir un certain potentiel chez Bao et les deux hommes sympathisèrent. Bao, passable-\nment désœuvré et fauché, accepta, sans trop y croire, d’intégrer l’agence en tant que détective.\nSon sens de la débrouillardise et son passé houleux parfois bien utile lui octroient des compétences uniques \net font désormais de lui un agent indispensable. Le jeune homme s’investit d’ailleurs sincèrement dans son \ntravail. Toujours tiré à quatre épingles, Bao est reconnu parmi ses coéquipiers comme le plus nonchalant \ndu groupe.\nANOMALIE\nEntropie 2\nTechnique\nBao peut relancer le dé de la Lune 1 fois au cours d’un même \nscénario et choisir de conserver le résultat qu’il préfère (cette faculté \nne fonctionne pas pour les tests de chance).\nNarratif\nBao peut influer sur le hasard de manière mineure.\nExemples : En jouant au poker, Bao récupère une bonne main à la \ndistribution. Le feu passe au vert alors qu’il tourne au coin de la rue.\n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nAime le jeu (1)\nBelle gueule (2)\n"
|
||||||
|
},
|
||||||
|
"Elemiah Cowen": {
|
||||||
|
"age": 28,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Manutentionnaire MÉTIER",
|
||||||
|
"faction_label": "Célestopol ORIGINE Manutentionnaire MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 4,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 1,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 4,
|
||||||
|
"appreciation": 4,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 4,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 0,
|
||||||
|
"merv_tech": 1,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "divinatoire",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Digne de confiance (2)",
|
||||||
|
"Robuste (1)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "ELEMIAH COWEN : L’OUVRIER\nElemiah et son frère Rubben travaillèrent toute leur vie comme des forçats dans les usines souterraines \nde Célestopol. Comme des dizaines de milliers d’ouvriers vivant dans des conditions très difficiles, ils \napprirent à se serrer les coudes de manière à soutenir leur communauté. Un jour, un des nombreux acci-\ndents quotidiens liés à un dysfonctionnement d’une machine emporta Rubben et priva Elemiah de deux \ndoigts de sa main gauche. Depuis, l’ouvrier survivant s’est promis de tout faire pour aider les miséreux \nde la ville. Il connaît donc bien la face cachée de Célestopol et en garde un goût amer. Dur à la tâche, \ndu genre taiseux, mais toujours le premier à proposer son aide et son soutien, cet ancien ouvrier d’une \ntrentaine d’années a le cœur tendre. Son torse large, ses sourcils broussailleux et sa moustache travaillée \nimpressionnent souvent. Mais il est surtout connu pour avoir un certain talent pour le tirage des cartes – il \ntombe d’ailleurs encore plus souvent juste depuis son accident –, et reste très apprécié de sa communauté, \nmême s’il travaille aujourd’hui comme manutentionnaire aux galeries Sabline.\nSubjugué par l’architecture démentielle de la cité lunaire et, surtout, par ses automates, il consacre désor-\nmais chaque minute de son temps libre à errer à travers la ville et à s’en émerveiller. Une manière pour lui \nd’expérimenter ce que son frère ne pourra jamais faire.\nANOMALIE\nTarot \ndivinatoire 2\nTechnique\nLors d’un test d’une Spécialisation de Cœur, Elemiah gagne la pos-\nsibilité de relancer les 2d8 2 fois au cours d’un même scénario, \nmais doit conserver le dernier résultat.\nNarratif\nEn tirant les cartes, Elemiah peut apprendre une information sur \nune personne concernant son passé, son présent ou son futur. \nL’information reste soumise à interprétation.\nExemples : Elemiah cherche à savoir où sera sa cible le lendemain. Il \nveut connaître l’histoire d’un voisin.\n \n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nDigne de confiance (2)\nRobuste (1)\n"
|
||||||
|
},
|
||||||
|
"Nadeja Danilo": {
|
||||||
|
"age": 35,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Pilote MÉTIER",
|
||||||
|
"faction_label": "Célestopol ORIGINE Pilote MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 2,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 1
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 4,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 2,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télékinésie",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Résiliente (1)",
|
||||||
|
"Tête froide (2)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "NADEJA DANILO : LA PILOTE\nNée à Célestopol de deux parents universitaires, Nadeja ne fut jamais une enfant comme les autres. \nIntrovertie, elle avait du mal à entrer en relation avec les autres. Intriguée par les nombreux livres occu-\npant l’espace familial, elle tourna surtout son esprit vers les étoiles, le lointain. Mars, Cérès, les confins du \nsystème solaire occupaient ses pensées comme une obsession, si bien qu’avec l’âge, elle choisit de devenir \npilote d’aéronef afin de pouvoir caresser l’espoir de rejoindre un jour ces destinations chères à son cœur. \nNadeja intégra l’académie de pilotes de la White Star Line et démontra des aptitudes presque hors norme, à \ntel point que les commandes des vaisseaux semblaient répondre à ses exigences sans qu’elle ait à intervenir. \nLucide, concentrée, apprenant vite, Nadeja décrocha son diplôme sans aucune difficulté et réalisa ainsi la \npremière étape de son rêve.\nC’était avant que la réalité – et la misogynie galopante dans le milieu majoritairement masculin des pilotes \nd’aéronef – ne la rattrape : Nadeja, pourtant bien plus compétente que la plupart de ses collègues, fut sou-\nvent reléguée au poste de copilote. Elle en garde une certaine rancœur et préfère, pour le moment, travailler \npour l’entreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. \nEn réalité, elle ne supporte pas qu’on lui manque de respect.\nANOMALIE\nTélékinésie 2\nTechnique\nLors d’un test d’une Spécialisation de Corps, Nadeja peut relancer \nles 2d8 2 fois au cours d’un même scénario, mais doit conserver le \ndernier résultat.\nNarratif\nDans un rayon de 8 mètres, Nadeja peut déplacer un petit objet \nléger et sans attaches par la pensée sur 4 mètres (n’importe quelle \ndirection) pendant 2 tours.\nExemples : Nadeja peut déplacer une cuillère pour la faire tomber \nd’une table. Elle peut faire léviter un jeu de tarot.\n \n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nRésiliente (1)\nTête froide (2)\n"
|
||||||
|
},
|
||||||
|
"Maribel Vargas": {
|
||||||
|
"age": 25,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Mécanicienne MÉTIER",
|
||||||
|
"faction_label": "Mexique ORIGINE Mécanicienne MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 2,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 3,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 4,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "morts",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Déterminée (1)",
|
||||||
|
"Sagace (2)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "MARIBEL VARGAS : LA SCIENTIFIQUE\nAncienne mécanicienne ayant travaillé notamment sur les lignes de chemin de fer reliant Célestopol à la \nstation du Pôle Nord.\nMaribel Vargas fut longtemps bridée dans son évolution de carrière à cause de son origine mexicaine et de \nson genre. Or, malgré son jeune âge (vingt-cinq ans), Maribel est une experte dans l’ingénierie de pointe, \nspécialement dans l’utilisation du fameux sélénium occupant les canaux de la ville. Ses parents, aux revenus \nmodestes, firent beaucoup de sacrifices pour lui permettre d’étudier à l’université de Célestopol, dont elle \nest d’ailleurs sortie major de promotion. Pourtant, personne n’avait souhaité lui donner sa chance avant \nErnest, qui tenait à avoir dans son agence une personne capable de réparer Polyphème, mais aussi de com-\nprendre les complexités de la technologie lunaire.\nMaribel subit les moqueries amusées du reste de son équipe, car elle a tendance à parler seule, surtout \nquand elle répare ou examine un mécanisme, quel qu’il soit. Par ailleurs, c’est une véritable amatrice de \npeinture, qui connaît très bien les allées du musée des Beaux-Arts.\nANOMALIE\nCommunication \navec les morts 2\nTechnique\nLors du test d’une Spécialisation d’Esprit, Maribel peut relancer \nles 2d8 2 fois au cours d’un même scénario, mais doit conserver le \ndernier résultat.\nNarratif\nMaribel entre en contact avec l’esprit d’un défunt. Elle peut lui \nposer une question fermée (réponse par oui ou non).\nExemples : Maribel interroge la victime d’un meurtre. Elle consulte \nl’esprit d’un aïeul.\n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nDéterminée (1)\nSagace (2)\n"
|
||||||
|
},
|
||||||
|
"Wiktoria Razny": {
|
||||||
|
"age": 39,
|
||||||
|
"origine": "JOUEUR",
|
||||||
|
"metier": "Soldate MÉTIER",
|
||||||
|
"faction_label": "Pologne ORIGINE Soldate MÉTIER",
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 2,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 4,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 3,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 2,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 1,
|
||||||
|
"merv_tech": 1,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Illusion",
|
||||||
|
"niveau": 2
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Affable (1)",
|
||||||
|
"Grande (1)",
|
||||||
|
"Expérience militaire (1)",
|
||||||
|
"ATTRIBUTS"
|
||||||
|
],
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"_bio_text_raw": "WIKTORIA RAZNY : LA VÉTÉRANE\nWiktoria Raźny était soldate durant la Seconde Guerre de Crimée.\nCette Polonaise de presque quarante ans aujourd’hui prit les armes pour défendre sa patrie en tant que \nconscrite. Blessée à l’œil, qu’elle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort \ndans l’estime et la reconnaissance que son sacrifice aurait dû lui apporter. Au contraire, son handicap et \nsa dégaine dégingandée lui valurent un certain rejet de ses compatriotes, ce qui la poussa, par dégoût, à \ns’éloigner autant que possible de la Pologne. Et pour cela, quoi de mieux que d’aller sur la Lune ? Sur place, \nelle rencontra Ernest, avec qui elle eut une aventure. Leurs points communs étaient multiples, il faut dire. \nDevenus bons amis, ils commencèrent à travailler ensemble quand le vétéran recruta l’ancienne soldate \ndans son agence du Lys blanc.\nAvec l’âge et le recul, Wiktoria assume parfaitement son handicap et porte un œil de verre. Elle explore les \nsoirées mondaines qu’elle apprécie tant et durant lesquelles elle se fait fort de collecter nombre d’informa-\ntions utiles à l’agence, mêlant ainsi l’utile à l’agréable.\nANOMALIE\nIllusion 2 \nTechnique\nLors d’un test de Coercition, d’Échauffourée, d’Effacement ou de \nTraque, Wiktoria peut relancer les 2d8 2 fois au cours d’un même \nscénario, mais doit conserver le dernier résultat.\nNarratif\nWiktoria peut générer une petite illusion mineure (visuelle, audi-\ntive, olfactive, etc., au choix) sans détail ou précision pendant \n1 minute.\nExemples : Wiktoria peut faire entendre le bruit d’un chat qui miaule \nou d’un livre qui tombe. Elle peut faire apparaître un éclat métallique \nou une ombre fugace. Elle peut créer une odeur de pluie ou de fumée.\n",
|
||||||
|
"_asp_text_raw": " \nBLESSURES\nASPECTS\nATTRIBUTS\nENTREGENT\nFORTUNE\nRÊVE\nVISION\nFACTIONS\n Agence Pinkerton\n Police secrète du duc\n Okhrana\n Luna NovaTek\n Société théosophique OTO\n Syndicats clandestins\n Vorovskoy Mir\n Cour des merveilles\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\n-1\n0\n1\n2\n3\n-2\n4\n-3\n-4\nNIVEAU\nMALUS\nDURÉE\nAnodin\nAucun\n1 min\nNégligeable\nAucun\n1 min\nDérisoire\n−1\n10 min\nSuperficiel\n−1\n10 min\nLéger\n−2\n30 min\nModéré\n−2\n30 min\nGrave\n−3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nAffable (1)\nGrande (1)\nExpérience militaire (1)\n"
|
||||||
|
}
|
||||||
|
}
|
||||||
669
pretires_v3.json
Normal file
@@ -0,0 +1,669 @@
|
|||||||
|
{
|
||||||
|
"Niels Bielke": {
|
||||||
|
"name": "Niels Bielke",
|
||||||
|
"concept": "L’ARTISTE MAUDIT",
|
||||||
|
"age": 38,
|
||||||
|
"origine": "Suède",
|
||||||
|
"metier": "Acteur",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 4,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 2
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 3,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 4,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 3,
|
||||||
|
"merv_tech": 0,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 1
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Suggestion",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation d’Âme, Niels peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Niels est en mesure d’influer sur la prise de décision d’une per- sonne en lui parlant à voix haute et en la fixant dans les yeux. Cette décision doit avoir un impact immédiat.",
|
||||||
|
"exemples": "Un garde choisit finalement de laisser passer Niels. Un prisonnier accepte de lui donner son nom, etc.",
|
||||||
|
"note": "Ce pouvoir fonctionne également sur les automates sophistiqués de 4e et 5e générations."
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Charismatique (2)",
|
||||||
|
"Sensible (1)"
|
||||||
|
],
|
||||||
|
"background": "NIELS BIELKE : L’ARTISTE MAUDIT Niels Bielke connut une carrière fulgurante en jouant sur les planches de tous les théâtres réputés de Suède. Lassé par son succès, il quitta la Terre pour conquérir la Lune. Quelle déception de perdre son statut de vedette ! En effet, la concurrence est rude à Célestopol, où la culture sous toutes ses formes est richement célébrée, notamment à travers les dépenses pha- raoniques du duc Nikolaï. Niels pensait pouvoir se tailler la part du lion, mais c’est son ego qui se retrouva taillé en pièce. Il s’obstina pendant plusieurs années, voyant toutes les portes se fermer devant lui petit à petit. Sombrant dans le mépris de lui-même et l’alcool conjointement, Niels ne connut son salut que grâce à l’intervention d’Ernest, qui sauva littéralement la vie de l’artiste maudit sur le point de se jeter dans le sélénium. Depuis, Niels tente de payer sa dette en servant de son mieux comme agent au sein de l’équipe du Lys blanc et en respectant sa parole de ne plus toucher à l’alcool. Niels porte les stigmates d’un homme ayant commis des abus – en particulier un tic nerveux dont il n’arrive pas à se débarrasser. Malgré ce désagrément et une allure en apparence négligée, il conserve un charisme et une aura certains. Niels approche de la quarantaine.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Polyphème": {
|
||||||
|
"name": "Polyphème",
|
||||||
|
"concept": "LE CHRONIQUEUR",
|
||||||
|
"age": null,
|
||||||
|
"origine": "Inconnue",
|
||||||
|
"metier": "Assistant-archiviste",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 3,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 4,
|
||||||
|
"merv_tech": 3,
|
||||||
|
"raisonnement": 3,
|
||||||
|
"traitement": 0
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Voyage astral",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’Appréciation, de Merveilleux technologique, de Traitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "L’esprit de Polpyphème quitte son enveloppe corporelle et se déplace de 8 mètres par tour pendant 4 tours, dans n’importe quelle direction. De cette manière, l’esprit est invisible et peut ignorer tous les obstacles. Ses sens restent toutefois les mêmes.",
|
||||||
|
"exemples": "Polyphème accède aux toits d’une maison ou il peut aller en repérage dans la pièce voisine. Si un éboulis bloque le passage d’un tunnel, Polyphème peut voir sur quelle distance et s’il y a des survivants.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Difficile à lire (2)",
|
||||||
|
"Étrangeté (2)",
|
||||||
|
"Mémoire eidétique (2)",
|
||||||
|
"Vision aiguisée (1)"
|
||||||
|
],
|
||||||
|
"background": "POLYPHÈME : LE CHRONIQUEUR Automate de 4e génération émancipé par Ernest après que le Français le retrouva dans un piteux état au fond d’une impasse. L’attention du vétéran fut attirée par l’être artificiel alors qu’un groupe d’étudiants sortaient hilares de la ruelle sombre. L’automate avait manifestement été passé à tabac. Après plusieurs semaines durant lesquelles personne n’en revendiqua la propriété, Ernest prit sur lui de payer ses réparations. Malgré sa remise en état de marche, l’automate semblait ne pas conserver de souvenir de sa « vie » passée. C’est ainsi qu’il entra au service d’Ernest en tant qu’assistant-archiviste au sein de l’agence du Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, l’automate le plus célèbre de la Cité, l’archiviste est désormais la propriété d’Ernest. Dans les faits, l’automate est un membre à part entière de l’agence, parfaitement intégré au sein de son équipe. Malgré tout, depuis son agression, Polyphème se plaint de ne pas avoir le « bon visage », ce dont il peut parfois faire une obsession.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Sèdami Alassane": {
|
||||||
|
"name": "Sèdami Alassane",
|
||||||
|
"concept": "LA DIPLOMATE",
|
||||||
|
"age": 58,
|
||||||
|
"origine": "Dahomey",
|
||||||
|
"metier": "Guerrière / diplomate",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 4,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 2,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 1,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 4,
|
||||||
|
"faveur": 3,
|
||||||
|
"echauffouree": 3,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 0,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télépathie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’Appréciation, d’Attraction, d’Échauffourée ou de Faveur, Sèdami peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Sèdami est capable de percevoir les pensées superficielles d’un tiers. De cette manière, elle peut comprendre l’état émotionnel d’une per- sonne, voire capter une image ou un mot (à l’appréciation du narra- teur) dans son esprit, simplement en l’observant.",
|
||||||
|
"exemples": "Sèdami suspecte une tentative de meurtre et perçoit un flacon de cyanure dans l’esprit d’un domestique. Malgré un faciès contenu, elle saisit qu’un magistrat est en fait terrorisé.",
|
||||||
|
"note": "Ce pouvoir fonctionne également sur les automates sophistiqués de 4e et 5e générations."
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Comportementaliste (1)",
|
||||||
|
"Stratège (2)"
|
||||||
|
],
|
||||||
|
"background": "SÈDAMI ALASSANE : LA DIPLOMATE Formée au sein du redoutable bataillon des Mino, ces guerrières d’élite du royaume de Dahomey, Sèdami s’illustra au combat mais également en stratégie, ce qui lui permit rapidement de devenir officière parmi les « amazones du Dahomey », comme on les surnomme souvent. Toutefois, son esprit militaire cohabitait toujours avec une certaine rêverie tournée vers la Lune et sa ville utopique, Célestopol. Longtemps, elle espéra secrètement parcourir ses rues, obser- ver ses canaux, ressentir son ambiance slave unique… Possédant une intelligence interpersonnelle très développée, Sèdami devint alors diplomate et fut à plusieurs reprises assignée à des missions protocolaires sur le continent africain puis en Europe et au Moyen-Orient. Il y a cinq ans, elle eut l’occa- sion d’exaucer son rêve en tant que conseillère du roi Béhanzin au cours d’une visite de courtoisie au duc Nikolaï, à Célestopol. Totalement subjuguée par la cité sélène et marquée dans son âme par le sélénium, Sèdami ne l’a plus jamais quittée, abandonnant son rôle de diplomate du Dahomey. Quoique son Afrique natale lui manque sou- vent, elle ne reviendra pas sur sa décision de vivre désormais sur la Lune. Sèdami est une femme d’âge mûr, confiante en ses capacités, avec un esprit très ouvert.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Bao Wang": {
|
||||||
|
"name": "Bao Wang",
|
||||||
|
"concept": "L’ESCROC",
|
||||||
|
"age": 32,
|
||||||
|
"origine": "Chine",
|
||||||
|
"metier": "Videur",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 4,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 2,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 4,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 4,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 0,
|
||||||
|
"appreciation": 2,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 1,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 0,
|
||||||
|
"merv_tech": 2,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Entropie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Bao peut relancer le dé de la Lune 1 fois au cours d’un même scénario et choisir de conserver le résultat qu’il préfère (cette faculté ne fonctionne pas pour les tests de chance).",
|
||||||
|
"narratif": "Bao peut influer sur le hasard de manière mineure.",
|
||||||
|
"exemples": "En jouant au poker, Bao récupère une bonne main à la distribution. Le feu passe au vert alors qu’il tourne au coin de la rue.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Aime le jeu (1)",
|
||||||
|
"Belle gueule (2)"
|
||||||
|
],
|
||||||
|
"background": "BAO WANG : L’ESCROC Ancien employé du casino flottant La Libellule, où il officiait comme videur. Après une adolescence de petite frappe dans les faubourgs de Shanghai, il parvint à s’introduire dans un obus-traversier pour rejoindre Célestopol, autant attiré par les perspectives offertes par la cité lunaire que par le besoin de se faire oublier des services de police de sa ville natale. Problème : Bao répugne à se battre et préfère largement la finesse à la violence. De son ancienne vie, il conserve un goût prononcé pour le jeu et la gent féminine. Par ailleurs, Bao a également un certain pen- chant pour les cabarets clandestins, dans lesquels il aime à se travestir à l’occasion. C’est dans l’un de ces lieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de l’agence de détectives du Lys blanc. Le vétéran sut voir un certain potentiel chez Bao et les deux hommes sympathisèrent. Bao, passable- ment désœuvré et fauché, accepta, sans trop y croire, d’intégrer l’agence en tant que détective. Son sens de la débrouillardise et son passé houleux parfois bien utile lui octroient des compétences uniques et font désormais de lui un agent indispensable. Le jeune homme s’investit d’ailleurs sincèrement dans son travail. Toujours tiré à quatre épingles, Bao est reconnu parmi ses coéquipiers comme le plus nonchalant du groupe.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Elemiah Cowen": {
|
||||||
|
"name": "Elemiah Cowen",
|
||||||
|
"concept": "L’OUVRIER",
|
||||||
|
"age": 28,
|
||||||
|
"origine": "Célestopol",
|
||||||
|
"metier": "Manutentionnaire",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 4,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 1,
|
||||||
|
"fortune": 1,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 1
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 0,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 4,
|
||||||
|
"appreciation": 4,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 4,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 0,
|
||||||
|
"merv_tech": 1,
|
||||||
|
"raisonnement": 1,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Tarot divinatoire",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation de Cœur, Elemiah gagne la pos- sibilité de relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "En tirant les cartes, Elemiah peut apprendre une information sur une personne concernant son passé, son présent ou son futur. L’information reste soumise à interprétation.",
|
||||||
|
"exemples": "Elemiah cherche à savoir où sera sa cible le lendemain. Il veut connaître l’histoire d’un voisin.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Digne de confiance (2)",
|
||||||
|
"Robuste (1)"
|
||||||
|
],
|
||||||
|
"background": "ELEMIAH COWEN : L’OUVRIER Elemiah et son frère Rubben travaillèrent toute leur vie comme des forçats dans les usines souterraines de Célestopol. Comme des dizaines de milliers d’ouvriers vivant dans des conditions très difficiles, ils apprirent à se serrer les coudes de manière à soutenir leur communauté. Un jour, un des nombreux acci- dents quotidiens liés à un dysfonctionnement d’une machine emporta Rubben et priva Elemiah de deux doigts de sa main gauche. Depuis, l’ouvrier survivant s’est promis de tout faire pour aider les miséreux de la ville. Il connaît donc bien la face cachée de Célestopol et en garde un goût amer. Dur à la tâche, du genre taiseux, mais toujours le premier à proposer son aide et son soutien, cet ancien ouvrier d’une trentaine d’années a le cœur tendre. Son torse large, ses sourcils broussailleux et sa moustache travaillée impressionnent souvent. Mais il est surtout connu pour avoir un certain talent pour le tirage des cartes – il tombe d’ailleurs encore plus souvent juste depuis son accident –, et reste très apprécié de sa communauté, même s’il travaille aujourd’hui comme manutentionnaire aux galeries Sabline. Subjugué par l’architecture démentielle de la cité lunaire et, surtout, par ses automates, il consacre désor- mais chaque minute de son temps libre à errer à travers la ville et à s’en émerveiller. Une manière pour lui d’expérimenter ce que son frère ne pourra jamais faire.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Nadeja Danilo": {
|
||||||
|
"name": "Nadeja Danilo",
|
||||||
|
"concept": "LA PILOTE",
|
||||||
|
"age": 35,
|
||||||
|
"origine": "Célestopol",
|
||||||
|
"metier": "Pilote",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 2,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 1,
|
||||||
|
"vision": 2
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 2,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 4,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 0,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 2,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Télékinésie",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test d’une Spécialisation de Corps, Nadeja peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Dans un rayon de 8 mètres, Nadeja peut déplacer un petit objet léger et sans attaches par la pensée sur 4 mètres (n’importe quelle direction) pendant 2 tours.",
|
||||||
|
"exemples": "Nadeja peut déplacer une cuillère pour la faire tomber d’une table. Elle peut faire léviter un jeu de tarot.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Résiliente (1)",
|
||||||
|
"Tête froide (2)"
|
||||||
|
],
|
||||||
|
"background": "NADEJA DANILO : LA PILOTE Née à Célestopol de deux parents universitaires, Nadeja ne fut jamais une enfant comme les autres. Introvertie, elle avait du mal à entrer en relation avec les autres. Intriguée par les nombreux livres occu- pant l’espace familial, elle tourna surtout son esprit vers les étoiles, le lointain. Mars, Cérès, les confins du système solaire occupaient ses pensées comme une obsession, si bien qu’avec l’âge, elle choisit de devenir pilote d’aéronef afin de pouvoir caresser l’espoir de rejoindre un jour ces destinations chères à son cœur. Nadeja intégra l’académie de pilotes de la White Star Line et démontra des aptitudes presque hors norme, à tel point que les commandes des vaisseaux semblaient répondre à ses exigences sans qu’elle ait à intervenir. Lucide, concentrée, apprenant vite, Nadeja décrocha son diplôme sans aucune difficulté et réalisa ainsi la première étape de son rêve. C’était avant que la réalité – et la misogynie galopante dans le milieu majoritairement masculin des pilotes d’aéronef – ne la rattrape : Nadeja, pourtant bien plus compétente que la plupart de ses collègues, fut sou- vent reléguée au poste de copilote. Elle en garde une certaine rancœur et préfère, pour le moment, travailler pour l’entreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. En réalité, elle ne supporte pas qu’on lui manque de respect.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Maribel Vargas": {
|
||||||
|
"name": "Maribel Vargas",
|
||||||
|
"concept": "LA SCIENTIFIQUE",
|
||||||
|
"age": 25,
|
||||||
|
"origine": "Mexique",
|
||||||
|
"metier": "Mécanicienne",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 0,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 2,
|
||||||
|
"esprit": 2
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 0,
|
||||||
|
"fortune": 0,
|
||||||
|
"reve": 2,
|
||||||
|
"vision": 2
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 2,
|
||||||
|
"attraction": 0,
|
||||||
|
"coercition": 0,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 0,
|
||||||
|
"effacement": 2,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 2,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 3,
|
||||||
|
"inspiration": 0,
|
||||||
|
"traque": 2,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 4,
|
||||||
|
"raisonnement": 2,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Communication avec les morts",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors du test d’une Spécialisation d’Esprit, Maribel peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Maribel entre en contact avec l’esprit d’un défunt. Elle peut lui poser une question fermée (réponse par oui ou non).",
|
||||||
|
"exemples": "Maribel interroge la victime d’un meurtre. Elle consulte l’esprit d’un aïeul.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Déterminée (1)",
|
||||||
|
"Sagace (2)"
|
||||||
|
],
|
||||||
|
"background": "MARIBEL VARGAS : LA SCIENTIFIQUE Ancienne mécanicienne ayant travaillé notamment sur les lignes de chemin de fer reliant Célestopol à la station du Pôle Nord. Maribel Vargas fut longtemps bridée dans son évolution de carrière à cause de son origine mexicaine et de son genre. Or, malgré son jeune âge (vingt-cinq ans), Maribel est une experte dans l’ingénierie de pointe, spécialement dans l’utilisation du fameux sélénium occupant les canaux de la ville. Ses parents, aux revenus modestes, firent beaucoup de sacrifices pour lui permettre d’étudier à l’université de Célestopol, dont elle est d’ailleurs sortie major de promotion. Pourtant, personne n’avait souhaité lui donner sa chance avant Ernest, qui tenait à avoir dans son agence une personne capable de réparer Polyphème, mais aussi de com- prendre les complexités de la technologie lunaire. Maribel subit les moqueries amusées du reste de son équipe, car elle a tendance à parler seule, surtout quand elle répare ou examine un mécanisme, quel qu’il soit. Par ailleurs, c’est une véritable amatrice de peinture, qui connaît très bien les allées du musée des Beaux-Arts.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
},
|
||||||
|
"Wiktoria Razny": {
|
||||||
|
"name": "Wiktoria Razny",
|
||||||
|
"concept": "LA VÉTÉRANE",
|
||||||
|
"age": 39,
|
||||||
|
"origine": "Pologne",
|
||||||
|
"metier": "Soldate",
|
||||||
|
"faction_appartenance": null,
|
||||||
|
"resistances": {
|
||||||
|
"ame": 2,
|
||||||
|
"corps": 2,
|
||||||
|
"coeur": 0,
|
||||||
|
"esprit": 0
|
||||||
|
},
|
||||||
|
"attributs": {
|
||||||
|
"entregent": 2,
|
||||||
|
"fortune": 2,
|
||||||
|
"reve": 0,
|
||||||
|
"vision": 0
|
||||||
|
},
|
||||||
|
"skills": {
|
||||||
|
"artifice": 0,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 2,
|
||||||
|
"faveur": 2,
|
||||||
|
"echauffouree": 4,
|
||||||
|
"effacement": 1,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 3,
|
||||||
|
"appreciation": 3,
|
||||||
|
"arts": 0,
|
||||||
|
"inspiration": 2,
|
||||||
|
"traque": 3,
|
||||||
|
"instruction": 1,
|
||||||
|
"merv_tech": 1,
|
||||||
|
"raisonnement": 0,
|
||||||
|
"traitement": 2
|
||||||
|
},
|
||||||
|
"raffinement_template": {
|
||||||
|
"artifice": 5,
|
||||||
|
"attraction": 2,
|
||||||
|
"coercition": 3,
|
||||||
|
"faveur": 6,
|
||||||
|
"echauffouree": 6,
|
||||||
|
"effacement": 3,
|
||||||
|
"mobilite": 2,
|
||||||
|
"prouesse": 5,
|
||||||
|
"appreciation": 6,
|
||||||
|
"arts": 2,
|
||||||
|
"inspiration": 3,
|
||||||
|
"traque": 5,
|
||||||
|
"instruction": 2,
|
||||||
|
"merv_tech": 6,
|
||||||
|
"raisonnement": 5,
|
||||||
|
"traitement": 3
|
||||||
|
},
|
||||||
|
"factions": {
|
||||||
|
"pinkerton": 0,
|
||||||
|
"police_duc": 0,
|
||||||
|
"okhrana": 0,
|
||||||
|
"luna_novatek": 0,
|
||||||
|
"oto": 0,
|
||||||
|
"syndicats": 0,
|
||||||
|
"vorovskoy": 0,
|
||||||
|
"cour_merveilles": 0
|
||||||
|
},
|
||||||
|
"anomalie": {
|
||||||
|
"nom": "Illusion",
|
||||||
|
"niveau": 2,
|
||||||
|
"technique": "Lors d’un test de Coercition, d’Échauffourée, d’Effacement ou de Traque, Wiktoria peut relancer les 2d8 2 fois au cours d’un même scénario, mais doit conserver le dernier résultat.",
|
||||||
|
"narratif": "Wiktoria peut générer une petite illusion mineure (visuelle, audi- tive, olfactive, etc., au choix) sans détail ou précision pendant 1 minute.",
|
||||||
|
"exemples": "Wiktoria peut faire entendre le bruit d’un chat qui miaule ou d’un livre qui tombe. Elle peut faire apparaître un éclat métallique ou une ombre fugace. Elle peut créer une odeur de pluie ou de fumée.",
|
||||||
|
"note": null
|
||||||
|
},
|
||||||
|
"aspects": [
|
||||||
|
"Affable (1)",
|
||||||
|
"Grande (1)",
|
||||||
|
"Expérience militaire (1)"
|
||||||
|
],
|
||||||
|
"background": "WIKTORIA RAZNY : LA VÉTÉRANE Wiktoria Raźny était soldate durant la Seconde Guerre de Crimée. Cette Polonaise de presque quarante ans aujourd’hui prit les armes pour défendre sa patrie en tant que conscrite. Blessée à l’œil, qu’elle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort dans l’estime et la reconnaissance que son sacrifice aurait dû lui apporter. Au contraire, son handicap et sa dégaine dégingandée lui valurent un certain rejet de ses compatriotes, ce qui la poussa, par dégoût, à s’éloigner autant que possible de la Pologne. Et pour cela, quoi de mieux que d’aller sur la Lune ? Sur place, elle rencontra Ernest, avec qui elle eut une aventure. Leurs points communs étaient multiples, il faut dire. Devenus bons amis, ils commencèrent à travailler ensemble quand le vétéran recruta l’ancienne soldate dans son agence du Lys blanc. Avec l’âge et le recul, Wiktoria assume parfaitement son handicap et porte un œil de verre. Elle explore les soirées mondaines qu’elle apprécie tant et durant lesquelles elle se fait fort de collecter nombre d’informa- tions utiles à l’agence, mêlant ainsi l’utile à l’agréable.",
|
||||||
|
"description_physique": null,
|
||||||
|
"description_psychologique": null,
|
||||||
|
"weapons": [],
|
||||||
|
"equipment": []
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
renders/aspects-page-12.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-16.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-20.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-24.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-28.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-32.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-4.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/aspects-page-8.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/debug_ENTREGENT.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
renders/debug_FORTUNE.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
renders/debug_REVE.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
renders/debug_VISION.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
renders/debug_aspects_left.png
Normal file
|
After Width: | Height: | Size: 171 KiB |
BIN
renders/debug_attribut.png
Normal file
|
After Width: | Height: | Size: 111 KiB |
BIN
renders/debug_attribut_enlarged.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
BIN
renders/page-11.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/page-15.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/page-19.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/page-23.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
BIN
renders/page-27.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
renders/page-3.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
renders/page-31.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
BIN
renders/page-7.png
Normal file
|
After Width: | Height: | Size: 2.0 MiB |
791
snapshot-current.txt
Normal file
@@ -0,0 +1,791 @@
|
|||||||
|
uid=8_0 RootWebArea "Foundry Virtual Tabletop" url="https://localhost:31000/game"
|
||||||
|
uid=8_1 tab "Outils de token" selectable
|
||||||
|
uid=8_2 tab "Outils de tuile" selectable
|
||||||
|
uid=8_3 tab "Outils de dessin" selectable
|
||||||
|
uid=8_4 tab "Outils de mur" selectable
|
||||||
|
uid=8_5 tab "Outils de lumière" selectable
|
||||||
|
uid=8_6 tab "Outils de son d’ambiance" selectable
|
||||||
|
uid=8_7 tab "Outils de région" selectable
|
||||||
|
uid=8_8 tab "Notes" selectable
|
||||||
|
uid=8_9 button "Sélection de tokens" pressed
|
||||||
|
uid=8_10 button "Sélection de cibles"
|
||||||
|
uid=8_11 button "Règle"
|
||||||
|
uid=8_12 button "Déplacement sans contrainte"
|
||||||
|
uid=8_13 StaticText "Gamemaster [MJ]"
|
||||||
|
uid=8_24 StaticText ""
|
||||||
|
uid=8_14 StaticText "Latence"
|
||||||
|
uid=8_15 StaticText " "
|
||||||
|
uid=9_0 StaticText "1ms"
|
||||||
|
uid=8_17 StaticText "IPS"
|
||||||
|
uid=8_18 StaticText " "
|
||||||
|
uid=10_0 StaticText "55"
|
||||||
|
uid=8_20 button
|
||||||
|
uid=8_21 navigation
|
||||||
|
uid=8_22 StaticText "Accueil Celestopol 1922"
|
||||||
|
uid=8_23 StaticText "G"
|
||||||
|
uid=8_24 StaticText ""
|
||||||
|
uid=8_25 generic roledescription="Barre de raccourcis"
|
||||||
|
uid=8_26 button "Couper le son"
|
||||||
|
uid=8_27 button "Menu principal"
|
||||||
|
uid=8_28 button "Emplacement vide"
|
||||||
|
uid=8_29 button "Emplacement vide"
|
||||||
|
uid=8_30 button "Emplacement vide"
|
||||||
|
uid=8_31 button "Emplacement vide"
|
||||||
|
uid=8_32 button "Emplacement vide"
|
||||||
|
uid=8_33 button "Emplacement vide"
|
||||||
|
uid=8_34 button "Emplacement vide"
|
||||||
|
uid=8_35 button "Emplacement vide"
|
||||||
|
uid=8_36 button "Emplacement vide"
|
||||||
|
uid=8_37 button "Emplacement vide"
|
||||||
|
uid=8_38 navigation
|
||||||
|
uid=8_39 button "Page suivante"
|
||||||
|
uid=8_40 StaticText "1"
|
||||||
|
uid=8_41 button "Page précédente"
|
||||||
|
uid=8_42 button "Verrouiller la barre de raccourcis"
|
||||||
|
uid=8_43 button "Effacer la barre de raccourcis"
|
||||||
|
uid=8_44 generic value="
|
||||||
|
"
|
||||||
|
uid=8_45 paragraph
|
||||||
|
uid=8_46 LineBreak "
|
||||||
|
"
|
||||||
|
uid=8_24 StaticText "Entrer un message"
|
||||||
|
uid=8_47 button "Public en tant qu'utilisateur" pressed
|
||||||
|
uid=8_48 button "Privé pour les maîtres de jeu"
|
||||||
|
uid=8_49 button "Aveugle pour les maîtres de jeu"
|
||||||
|
uid=8_50 button "Seulement pour soi-même"
|
||||||
|
uid=8_51 button "Public en tant que personnage"
|
||||||
|
uid=8_52 tab "Messages du tchat" selectable
|
||||||
|
uid=8_53 tab "Rencontres de combat" selectable
|
||||||
|
uid=8_54 tab "Scènes" selectable
|
||||||
|
uid=8_55 tab "Objets plaçables" selectable
|
||||||
|
uid=8_56 tab "Acteurs" selectable
|
||||||
|
uid=8_57 tab "Objets" selectable
|
||||||
|
uid=8_58 tab "Journaux" selectable
|
||||||
|
uid=8_59 tab "Tables aléatoires" selectable
|
||||||
|
uid=8_60 tab "Jeux de cartes" selectable
|
||||||
|
uid=8_61 tab "Macros" selectable
|
||||||
|
uid=8_62 tab "Playlists" selectable
|
||||||
|
uid=8_63 tab "Compendiums" selectable
|
||||||
|
uid=8_64 tab "Paramètres de la partie" selectable
|
||||||
|
uid=8_65 button "Agrandir"
|
||||||
|
uid=8_66 heading "Foundry Virtual Tabletop" level="4"
|
||||||
|
uid=10_1 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_68 StaticText "À: Gamemaster"
|
||||||
|
uid=8_69 heading "Pour commencer" level="3"
|
||||||
|
uid=8_70 StaticText "Il semble que ce soit un nouveau monde. Pour commencer, vous devez d’abord ajouter les joueurs supplémentaires attendus via le menu "
|
||||||
|
uid=8_71 StaticText "Configuration des Joueurs"
|
||||||
|
uid=8_72 StaticText ". Ensuite vous pourrez créer des "
|
||||||
|
uid=8_73 StaticText "Acteurs"
|
||||||
|
uid=8_74 StaticText " pour eux, ainsi que tout autre personnage important que vous devez représenter. Les cartes et autres visuels peuvent être configurés à l’aide des "
|
||||||
|
uid=8_75 StaticText "Scènes"
|
||||||
|
uid=8_76 StaticText ", et les documents, notes et autres informations peuvent être créés dans des "
|
||||||
|
uid=8_77 StaticText "journaux"
|
||||||
|
uid=8_78 StaticText "."
|
||||||
|
uid=8_79 StaticText "N’oubliez pas d’explorer tous les onglets disponibles dans cette barre latérale, et pour plus d’informations, vous pouvez consulter la série "
|
||||||
|
uid=8_80 link "Gamemaster Tutorial" url="https://foundryvtt.com/article/tutorial/"
|
||||||
|
uid=8_81 StaticText "Gamemaster Tutorial"
|
||||||
|
uid=8_82 StaticText " (en Anglais) dans la "
|
||||||
|
uid=8_83 link "Base de connaissances" url="https://foundryvtt.com/kb/"
|
||||||
|
uid=8_84 StaticText "Base de connaissances"
|
||||||
|
uid=8_85 StaticText "."
|
||||||
|
uid=8_86 StaticText " Ce message peut être extrait en cliquant dessus avec le bouton droit de la souris, vous pouvez également extraire tout l’onglet de chat en cliquant avec le bouton droit de la souris sur l’icône de la bulle de dialogue (menu du haut). Cette dernière méthode (clic droit sur les icones du menu) permet de la même manière de faire apparaître n’importe quel autre onglet de la barre latérale dans une fenêtre indépendante."
|
||||||
|
uid=8_87 heading "Foundry Virtual Tabletop" level="4"
|
||||||
|
uid=10_2 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_89 StaticText "À: Gamemaster"
|
||||||
|
uid=8_90 heading "Inviter vos joueurs" level="3"
|
||||||
|
uid=8_91 StaticText "Lorsque tout est configuré et que vous êtes prêt à inviter vos joueurs, vous pouvez leur envoyer un lien vers votre monde depuis le "
|
||||||
|
uid=8_92 StaticText "Liens d’invitation"
|
||||||
|
uid=8_93 StaticText "."
|
||||||
|
uid=8_94 StaticText "Si la boîte de dialogue « Liens d’invitation » indique que votre connexion est fermée, vous devrez peut-être configurer la redirection de port. Vous trouverez des instructions à ce sujet sur le site officiel : "
|
||||||
|
uid=8_95 link "Port Forwarding Guide" url="https://foundryvtt.com/article/port-forwarding/"
|
||||||
|
uid=8_96 StaticText "Port Forwarding Guide"
|
||||||
|
uid=8_97 StaticText " (en Anglais) ou sur le wiki en Français : "
|
||||||
|
uid=8_98 link "Impossible de se connecter à distance" url="https://foundryvtt.wiki/fr/pour-commencer/pbcnx/"
|
||||||
|
uid=8_99 StaticText "Impossible de se connecter à distance"
|
||||||
|
uid=8_100 StaticText ". Si vous avez toujours besoin d’aide, vous pouvez également chercher du support : Sur le Discord officiel "
|
||||||
|
uid=8_101 StaticText "Anglais"
|
||||||
|
uid=8_102 StaticText " : postez un message dans "
|
||||||
|
uid=8_103 link "#install-and-connection" url="https://discord.com/channels/170995199584108546/689889940590690323"
|
||||||
|
uid=8_104 StaticText "#install-and-connection"
|
||||||
|
uid=8_105 StaticText " pour les problèmes d’invitation, "
|
||||||
|
uid=8_106 link "#troubleshooting" url="https://discord.com/channels/170995199584108546/486930822465716249"
|
||||||
|
uid=8_107 StaticText "#troubleshooting"
|
||||||
|
uid=8_108 StaticText " pour les problèmes généraux avec le logiciel, ou "
|
||||||
|
uid=8_109 link "#core-how-to" url="https://discord.com/channels/170995199584108546/713259405667205193"
|
||||||
|
uid=8_110 StaticText "#core-how-to"
|
||||||
|
uid=8_111 StaticText " pour une aide plus générique sur Foundry VTT. Sur le serveur Discord "
|
||||||
|
uid=8_112 StaticText "Francophone"
|
||||||
|
uid=8_113 StaticText " de FoundryVTT : "
|
||||||
|
uid=8_114 link "La Fonderie" url="https://discord.gg/pPSDNJk"
|
||||||
|
uid=8_115 StaticText "La Fonderie"
|
||||||
|
uid=8_116 StaticText "."
|
||||||
|
uid=8_117 StaticText " Ce message peut être extrait en cliquant dessus avec le bouton droit de la souris, vous pouvez également extraire tout l’onglet de chat en cliquant avec le bouton droit de la souris sur l’icône de la bulle de dialogue (menu du haut). Cette dernière méthode (clic droit sur les icones du menu) permet de la même manière de faire apparaître n’importe quel autre onglet de la barre latérale dans une fenêtre indépendante."
|
||||||
|
uid=8_118 heading "Gamemaster" level="4"
|
||||||
|
uid=10_3 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_120 StaticText "✦"
|
||||||
|
uid=8_121 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_122 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_123 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_124 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_125 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_126 StaticText "."
|
||||||
|
uid=8_127 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_128 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_129 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_130 heading "Gamemaster" level="4"
|
||||||
|
uid=10_4 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_132 StaticText "Âme › Artifice"
|
||||||
|
uid=8_133 image "Protagoniste" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||||
|
uid=8_134 StaticText "Protagoniste"
|
||||||
|
uid=8_135 StaticText "Âme"
|
||||||
|
uid=8_136 StaticText " › "
|
||||||
|
uid=8_137 StaticText "Artifice"
|
||||||
|
uid=8_138 StaticText "4"
|
||||||
|
uid=8_139 StaticText "6"
|
||||||
|
uid=8_140 StaticText "FORMULE :"
|
||||||
|
uid=8_141 StaticText "2d8"
|
||||||
|
uid=8_142 StaticText "="
|
||||||
|
uid=8_143 StaticText "10"
|
||||||
|
uid=8_144 StaticText "="
|
||||||
|
uid=8_145 StaticText "10"
|
||||||
|
uid=8_146 StaticText "VS"
|
||||||
|
uid=8_147 StaticText "Seuil : 11"
|
||||||
|
uid=8_148 StaticText "(11)"
|
||||||
|
uid=8_149 StaticText "-1"
|
||||||
|
uid=8_150 StaticText "✖"
|
||||||
|
uid=8_151 StaticText "ÉCHEC"
|
||||||
|
uid=8_152 heading "Gamemaster" level="4"
|
||||||
|
uid=10_5 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_154 StaticText "✦"
|
||||||
|
uid=8_155 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_156 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_157 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_158 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_159 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_160 StaticText "."
|
||||||
|
uid=8_161 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_162 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_163 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_164 heading "Gamemaster" level="4"
|
||||||
|
uid=10_6 StaticText "Il y a 1j 22h"
|
||||||
|
uid=8_166 StaticText "Esprit › Instruction"
|
||||||
|
uid=8_167 image "Protagoniste" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||||
|
uid=8_168 StaticText "Protagoniste"
|
||||||
|
uid=8_169 StaticText "Esprit"
|
||||||
|
uid=8_170 StaticText " › "
|
||||||
|
uid=8_171 StaticText "Instruction"
|
||||||
|
uid=8_172 StaticText "8"
|
||||||
|
uid=8_173 StaticText "8"
|
||||||
|
uid=8_174 StaticText "FORMULE :"
|
||||||
|
uid=8_175 StaticText "2d8"
|
||||||
|
uid=8_176 StaticText "="
|
||||||
|
uid=8_177 StaticText "16"
|
||||||
|
uid=8_178 StaticText "="
|
||||||
|
uid=8_179 StaticText "16"
|
||||||
|
uid=8_180 StaticText "VS"
|
||||||
|
uid=8_181 StaticText "Seuil : 11"
|
||||||
|
uid=8_182 StaticText "(11)"
|
||||||
|
uid=8_183 StaticText "+5"
|
||||||
|
uid=8_184 StaticText "✦"
|
||||||
|
uid=8_185 StaticText "SUCCÈS"
|
||||||
|
uid=8_186 heading "Gamemaster" level="4"
|
||||||
|
uid=10_7 StaticText "Il y a 1j 21h"
|
||||||
|
uid=8_188 StaticText "✦"
|
||||||
|
uid=8_189 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_190 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_191 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_192 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_193 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_194 StaticText "."
|
||||||
|
uid=8_195 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_196 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_197 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_198 heading "Gamemaster" level="4"
|
||||||
|
uid=10_8 StaticText "Il y a 2h 53s"
|
||||||
|
uid=8_200 StaticText "✦"
|
||||||
|
uid=8_201 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_202 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_203 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_204 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_205 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_206 StaticText "."
|
||||||
|
uid=8_207 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_208 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_209 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_210 heading "Gamemaster" level="4"
|
||||||
|
uid=10_9 StaticText "Il y a 43min 19s"
|
||||||
|
uid=8_212 StaticText "✦"
|
||||||
|
uid=8_213 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_214 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_215 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_216 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_217 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_218 StaticText "."
|
||||||
|
uid=8_219 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_220 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_221 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_222 heading "Gamemaster" level="4"
|
||||||
|
uid=10_10 StaticText "Il y a 39min 53s"
|
||||||
|
uid=8_224 StaticText "✦"
|
||||||
|
uid=8_225 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_226 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_227 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_228 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_229 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_230 StaticText "."
|
||||||
|
uid=8_231 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_232 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_233 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_234 heading "Gamemaster" level="4"
|
||||||
|
uid=10_11 StaticText "Il y a 22min 25s"
|
||||||
|
uid=8_236 StaticText "✦"
|
||||||
|
uid=8_237 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_238 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_239 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_240 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_241 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_242 StaticText "."
|
||||||
|
uid=8_243 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_244 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_245 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_246 heading "Elemiah Cowen" level="4"
|
||||||
|
uid=10_12 StaticText "Il y a 18min 38s"
|
||||||
|
uid=8_248 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||||
|
uid=8_249 StaticText "Elemiah Cowen"
|
||||||
|
uid=8_250 StaticText "⚡ Initiative"
|
||||||
|
uid=8_251 StaticText "⚡"
|
||||||
|
uid=8_252 StaticText "10"
|
||||||
|
uid=8_253 StaticText "4 + 2 (Mobilité) + 4 (Inspiration)"
|
||||||
|
uid=8_254 heading "PNJ01" level="4"
|
||||||
|
uid=10_13 StaticText "Il y a 18min 37s"
|
||||||
|
uid=8_256 image "PNJ01" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||||
|
uid=8_257 StaticText "PNJ01"
|
||||||
|
uid=8_258 StaticText "⚡ Initiative"
|
||||||
|
uid=8_259 StaticText "⚡"
|
||||||
|
uid=8_260 StaticText "6"
|
||||||
|
uid=8_261 StaticText "Corps : 6"
|
||||||
|
uid=8_262 heading "Gamemaster" level="4"
|
||||||
|
uid=10_14 StaticText "Il y a 17min 4s"
|
||||||
|
uid=8_264 StaticText "Corps › Échauffourée"
|
||||||
|
uid=8_265 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||||
|
uid=8_266 StaticText "Elemiah Cowen"
|
||||||
|
uid=8_267 StaticText "⚔"
|
||||||
|
uid=8_268 StaticText "Attaque à main nue"
|
||||||
|
uid=8_269 StaticText "Corps"
|
||||||
|
uid=8_270 StaticText " › "
|
||||||
|
uid=8_271 StaticText "Échauffourée"
|
||||||
|
uid=8_272 StaticText "1"
|
||||||
|
uid=8_273 StaticText "8"
|
||||||
|
uid=8_274 StaticText "FORMULE :"
|
||||||
|
uid=8_275 StaticText "2d8"
|
||||||
|
uid=8_276 StaticText "="
|
||||||
|
uid=8_277 StaticText "9"
|
||||||
|
uid=8_278 StaticText "+"
|
||||||
|
uid=8_279 StaticText "2"
|
||||||
|
uid=8_280 StaticText "="
|
||||||
|
uid=8_281 StaticText "11"
|
||||||
|
uid=8_282 StaticText "VS"
|
||||||
|
uid=8_283 StaticText "Corps du PNJ : 6"
|
||||||
|
uid=8_284 StaticText "+5"
|
||||||
|
uid=8_285 StaticText "✦"
|
||||||
|
uid=8_286 StaticText "SUCCÈS"
|
||||||
|
uid=8_287 StaticText "Attaque réussie — cible touchée"
|
||||||
|
uid=8_288 StaticText "DÉGÂTS INFLIGÉS"
|
||||||
|
uid=8_289 StaticText "1"
|
||||||
|
uid=8_290 StaticText "blessure(s)"
|
||||||
|
uid=8_291 StaticText "Cible :"
|
||||||
|
uid=8_292 StaticText " PNJ01"
|
||||||
|
uid=8_293 StaticText "Protection d'armure :"
|
||||||
|
uid=8_294 StaticText " −0"
|
||||||
|
uid=8_295 StaticText "Blessures après armure :"
|
||||||
|
uid=8_296 StaticText " 1"
|
||||||
|
uid=8_297 button "Appliquer les blessures"
|
||||||
|
uid=8_298 heading "Gamemaster" level="4"
|
||||||
|
uid=10_15 StaticText "Il y a 16min 5s"
|
||||||
|
uid=8_300 StaticText "Corps › Mobilité"
|
||||||
|
uid=8_301 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||||
|
uid=8_302 StaticText "Elemiah Cowen"
|
||||||
|
uid=8_303 StaticText "⚔"
|
||||||
|
uid=8_304 StaticText "Arc"
|
||||||
|
uid=8_305 StaticText "+1"
|
||||||
|
uid=8_306 StaticText "Corps"
|
||||||
|
uid=8_307 StaticText " › "
|
||||||
|
uid=8_308 StaticText "Mobilité"
|
||||||
|
uid=8_309 StaticText "7"
|
||||||
|
uid=8_310 StaticText "7"
|
||||||
|
uid=8_311 StaticText "FORMULE :"
|
||||||
|
uid=8_312 StaticText "2d8"
|
||||||
|
uid=8_313 StaticText "="
|
||||||
|
uid=8_314 StaticText "14"
|
||||||
|
uid=8_315 StaticText "+"
|
||||||
|
uid=8_316 StaticText "2"
|
||||||
|
uid=8_317 StaticText "="
|
||||||
|
uid=8_318 StaticText "16"
|
||||||
|
uid=8_319 StaticText "VS"
|
||||||
|
uid=8_320 StaticText "Corps du PNJ : 6"
|
||||||
|
uid=8_321 StaticText "★"
|
||||||
|
uid=8_322 StaticText "RÉUSSITE AUTOMATIQUE"
|
||||||
|
uid=8_323 heading "Gamemaster" level="4"
|
||||||
|
uid=10_16 StaticText "Il y a 15min 19s"
|
||||||
|
uid=8_325 StaticText "Corps › Attaquer"
|
||||||
|
uid=8_326 image "PNJ01" url="https://localhost:31000/icons/svg/mystery-man.svg"
|
||||||
|
uid=8_327 StaticText "PNJ01"
|
||||||
|
uid=8_328 StaticText "⚔"
|
||||||
|
uid=8_329 StaticText "Arc"
|
||||||
|
uid=8_330 StaticText "+1"
|
||||||
|
uid=8_331 StaticText "Corps"
|
||||||
|
uid=8_332 StaticText " › "
|
||||||
|
uid=8_333 StaticText "Attaquer"
|
||||||
|
uid=8_334 StaticText "2"
|
||||||
|
uid=8_335 StaticText "1"
|
||||||
|
uid=8_336 StaticText "FORMULE :"
|
||||||
|
uid=8_337 StaticText "2d8"
|
||||||
|
uid=8_338 StaticText "="
|
||||||
|
uid=8_339 StaticText "3"
|
||||||
|
uid=8_340 StaticText "+"
|
||||||
|
uid=8_341 StaticText "6"
|
||||||
|
uid=8_342 StaticText "="
|
||||||
|
uid=8_343 StaticText "9"
|
||||||
|
uid=8_344 StaticText "VS"
|
||||||
|
uid=8_345 StaticText "Corps du PNJ : 2"
|
||||||
|
uid=8_346 StaticText "★"
|
||||||
|
uid=8_347 StaticText "RÉUSSITE AUTOMATIQUE"
|
||||||
|
uid=8_348 StaticText "DÉGÂTS INFLIGÉS"
|
||||||
|
uid=8_349 StaticText "2"
|
||||||
|
uid=8_350 StaticText "blessure(s)"
|
||||||
|
uid=8_351 StaticText "Cible :"
|
||||||
|
uid=8_352 StaticText " Elemiah Cowen"
|
||||||
|
uid=8_353 StaticText "Protection d'armure :"
|
||||||
|
uid=8_354 StaticText " −0"
|
||||||
|
uid=8_355 StaticText "Blessures après armure :"
|
||||||
|
uid=8_356 StaticText " 2"
|
||||||
|
uid=8_357 button "Appliquer les blessures"
|
||||||
|
uid=8_358 heading "Gamemaster" level="4"
|
||||||
|
uid=10_17 StaticText "Il y a 13min"
|
||||||
|
uid=8_360 StaticText "✦"
|
||||||
|
uid=8_361 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_362 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_363 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_364 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_365 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_366 StaticText "."
|
||||||
|
uid=8_367 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_368 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_369 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_370 heading "Gamemaster" level="4"
|
||||||
|
uid=10_18 StaticText "Il y a 11min 14s"
|
||||||
|
uid=8_372 StaticText "✦"
|
||||||
|
uid=8_373 StaticText "BIENVENUE DANS CÉLESTOPOL 1922"
|
||||||
|
uid=8_374 StaticText "Bienvenue dans le système FoundryVTT de Célestopol 1922."
|
||||||
|
uid=8_375 StaticText "AIDE DE JEU"
|
||||||
|
uid=8_376 StaticText "Une aide de jeu est disponible dans le compendium : "
|
||||||
|
uid=8_377 StaticText "Aide — Utiliser le système Célestopol 1922"
|
||||||
|
uid=8_378 StaticText "."
|
||||||
|
uid=8_379 StaticText "LIVRE DE BASE"
|
||||||
|
uid=8_380 link "Voir le livre de base sur le site d’Antre-Monde Éditions" url="https://antre-monde.com/produit/celestopol-1922-le-jeu-de-role-livre-de-base/"
|
||||||
|
uid=8_381 StaticText "Voir le livre de base sur le site d’Antre-Monde Éditions"
|
||||||
|
uid=8_382 heading "Elemiah Cowen" level="4"
|
||||||
|
uid=10_19 StaticText "Il y a 11min 4s"
|
||||||
|
uid=8_384 StaticText "Corps › Échauffourée"
|
||||||
|
uid=8_385 image "Elemiah Cowen" url="https://localhost:31000/systems/fvtt-celestopol/assets/tokens/elemia.webp"
|
||||||
|
uid=8_386 StaticText "Elemiah Cowen"
|
||||||
|
uid=8_387 StaticText "⚔"
|
||||||
|
uid=8_388 StaticText "Attaque à main nue"
|
||||||
|
uid=8_389 StaticText "Corps"
|
||||||
|
uid=8_390 StaticText " › "
|
||||||
|
uid=8_391 StaticText "Échauffourée"
|
||||||
|
uid=8_392 StaticText "2"
|
||||||
|
uid=8_393 StaticText "3"
|
||||||
|
uid=8_394 StaticText "FORMULE :"
|
||||||
|
uid=8_395 StaticText "2d8"
|
||||||
|
uid=8_396 StaticText "="
|
||||||
|
uid=8_397 StaticText "5"
|
||||||
|
uid=8_398 StaticText "+"
|
||||||
|
uid=8_399 StaticText "2"
|
||||||
|
uid=8_400 StaticText "="
|
||||||
|
uid=8_401 StaticText "7"
|
||||||
|
uid=8_402 StaticText "VS"
|
||||||
|
uid=8_403 StaticText "Corps du PNJ : 6"
|
||||||
|
uid=8_404 StaticText "+1"
|
||||||
|
uid=8_405 StaticText "✦"
|
||||||
|
uid=8_406 StaticText "SUCCÈS"
|
||||||
|
uid=8_407 StaticText "Attaque réussie — cible touchée"
|
||||||
|
uid=8_408 StaticText "DÉGÂTS INFLIGÉS"
|
||||||
|
uid=8_409 StaticText "1"
|
||||||
|
uid=8_410 StaticText "blessure(s)"
|
||||||
|
uid=8_411 StaticText "Aucune cible de la scène active disponible pour appliquer les blessures."
|
||||||
|
uid=8_412 dialog
|
||||||
|
uid=8_413 banner
|
||||||
|
uid=8_414 heading "Corps › Attaquer" level="1"
|
||||||
|
uid=8_415 button "Basculer les contrôles"
|
||||||
|
uid=8_416 button "Fermer la fenêtre"
|
||||||
|
uid=8_417 StaticText "PNJ01"
|
||||||
|
uid=8_418 StaticText "⚔"
|
||||||
|
uid=8_419 StaticText "Arme"
|
||||||
|
uid=8_420 StaticText "+1"
|
||||||
|
uid=8_421 StaticText "Corps"
|
||||||
|
uid=8_422 StaticText " › "
|
||||||
|
uid=8_423 StaticText "Attaquer"
|
||||||
|
uid=8_424 StaticText "2d8"
|
||||||
|
uid=8_425 StaticText "+"
|
||||||
|
uid=8_426 StaticText "6"
|
||||||
|
uid=8_427 StaticText "CIBLE"
|
||||||
|
uid=8_428 combobox "CIBLE CIBLE CIBLE CIBLE CIBLE" expandable haspopup="menu" value="— Saisir manuellement —"
|
||||||
|
uid=8_429 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||||
|
uid=8_430 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||||
|
uid=8_431 StaticText "CORPS DU PNJ"
|
||||||
|
uid=8_432 spinbutton "CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ CORPS DU PNJ" value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||||
|
uid=8_433 StaticText "MODIFICATEUR"
|
||||||
|
uid=8_434 combobox "MODIFICATEUR MODIFICATEUR MODIFICATEUR MODIFICATEUR MODIFICATEUR" expandable haspopup="menu" value="Malaisé (0)"
|
||||||
|
uid=8_435 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||||
|
uid=8_436 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||||
|
uid=8_437 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||||
|
uid=8_438 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||||
|
uid=8_439 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||||
|
uid=8_440 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||||
|
uid=8_441 StaticText "ASPECT"
|
||||||
|
uid=8_442 combobox "ASPECT ASPECT ASPECT ASPECT ASPECT" expandable haspopup="menu" value="0"
|
||||||
|
uid=8_443 option "-4" selectable value="-4"
|
||||||
|
uid=8_444 option "-3" selectable value="-3"
|
||||||
|
uid=8_445 option "-2" selectable value="-2"
|
||||||
|
uid=8_446 option "-1" selectable value="-1"
|
||||||
|
uid=8_447 option "0" selectable selected value="0"
|
||||||
|
uid=8_448 option "+1" selectable value="+1"
|
||||||
|
uid=8_449 option "+2" selectable value="+2"
|
||||||
|
uid=8_450 option "+3" selectable value="+3"
|
||||||
|
uid=8_451 option "+4" selectable value="+4"
|
||||||
|
uid=8_452 checkbox "🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune 🌑 Lancer le Dé de la Lune"
|
||||||
|
uid=8_453 StaticText "🌑"
|
||||||
|
uid=8_454 StaticText "Lancer le Dé de la Lune"
|
||||||
|
uid=8_455 checkbox "✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide ✦ Utiliser le Destin 3d8 au lieu de 2d8 Jauge destin vide" disableable disabled
|
||||||
|
uid=8_456 StaticText "✦"
|
||||||
|
uid=8_457 StaticText "Utiliser le Destin"
|
||||||
|
uid=8_458 StaticText "3d8 au lieu de 2d8"
|
||||||
|
uid=8_459 StaticText "Jauge destin vide"
|
||||||
|
uid=8_460 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||||
|
uid=8_461 combobox "MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS MODIFICATEURS SITUATIONNELS" expandable haspopup="menu" value="0"
|
||||||
|
uid=8_462 option "-8" selectable value="-8"
|
||||||
|
uid=8_463 option "-7" selectable value="-7"
|
||||||
|
uid=8_464 option "-6" selectable value="-6"
|
||||||
|
uid=8_465 option "-5" selectable value="-5"
|
||||||
|
uid=8_466 option "-4" selectable value="-4"
|
||||||
|
uid=8_467 option "-3" selectable value="-3"
|
||||||
|
uid=8_468 option "-2" selectable value="-2"
|
||||||
|
uid=8_469 option "-1" selectable value="-1"
|
||||||
|
uid=8_470 option "0" selectable selected value="0"
|
||||||
|
uid=8_471 option "+1" selectable value="+1"
|
||||||
|
uid=8_472 option "+2" selectable value="+2"
|
||||||
|
uid=8_473 option "+3" selectable value="+3"
|
||||||
|
uid=8_474 option "+4" selectable value="+4"
|
||||||
|
uid=8_475 option "+5" selectable value="+5"
|
||||||
|
uid=8_476 option "+6" selectable value="+6"
|
||||||
|
uid=8_477 option "+7" selectable value="+7"
|
||||||
|
uid=8_478 option "+8" selectable value="+8"
|
||||||
|
uid=8_479 StaticText "VISIBILITÉ"
|
||||||
|
uid=8_480 combobox "VISIBILITÉ VISIBILITÉ VISIBILITÉ VISIBILITÉ VISIBILITÉ" expandable haspopup="menu" value="Public"
|
||||||
|
uid=8_481 option "Public" selectable selected value="Public"
|
||||||
|
uid=8_482 option "MJ uniquement" selectable value="MJ uniquement"
|
||||||
|
uid=8_483 option "Secret (moi)" selectable value="Secret (moi)"
|
||||||
|
uid=8_484 StaticText "FORMULE"
|
||||||
|
uid=8_485 StaticText "2d8 + 6"
|
||||||
|
uid=8_486 button "Lancer !"
|
||||||
|
uid=9_21 dialog
|
||||||
|
uid=9_22 banner
|
||||||
|
uid=9_23 heading "Corps › Attaquer" level="1"
|
||||||
|
uid=9_24 button "Basculer les contrôles"
|
||||||
|
uid=9_25 button "Fermer la fenêtre"
|
||||||
|
uid=9_26 StaticText "PNJ01"
|
||||||
|
uid=9_27 StaticText "⚔"
|
||||||
|
uid=9_28 StaticText "Arme"
|
||||||
|
uid=9_29 StaticText "+1"
|
||||||
|
uid=9_30 StaticText "Corps"
|
||||||
|
uid=9_31 StaticText " › "
|
||||||
|
uid=9_32 StaticText "Attaquer"
|
||||||
|
uid=9_33 StaticText "2d8"
|
||||||
|
uid=9_34 StaticText "+"
|
||||||
|
uid=9_35 StaticText "6"
|
||||||
|
uid=9_36 StaticText "CIBLE"
|
||||||
|
uid=9_37 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||||
|
uid=9_38 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||||
|
uid=9_39 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||||
|
uid=9_40 StaticText "CORPS DU PNJ"
|
||||||
|
uid=9_41 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||||
|
uid=9_42 StaticText "MODIFICATEUR"
|
||||||
|
uid=9_43 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||||
|
uid=9_44 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||||
|
uid=9_45 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||||
|
uid=9_46 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||||
|
uid=9_47 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||||
|
uid=9_48 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||||
|
uid=9_49 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||||
|
uid=9_50 StaticText "ASPECT"
|
||||||
|
uid=9_51 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_52 option "-4" selectable value="-4"
|
||||||
|
uid=9_53 option "-3" selectable value="-3"
|
||||||
|
uid=9_54 option "-2" selectable value="-2"
|
||||||
|
uid=9_55 option "-1" selectable value="-1"
|
||||||
|
uid=9_56 option "0" selectable selected value="0"
|
||||||
|
uid=9_57 option "+1" selectable value="+1"
|
||||||
|
uid=9_58 option "+2" selectable value="+2"
|
||||||
|
uid=9_59 option "+3" selectable value="+3"
|
||||||
|
uid=9_60 option "+4" selectable value="+4"
|
||||||
|
uid=9_61 checkbox
|
||||||
|
uid=9_62 StaticText "🌑"
|
||||||
|
uid=9_63 StaticText "Lancer le Dé de la Lune"
|
||||||
|
uid=9_64 checkbox disableable disabled
|
||||||
|
uid=9_65 StaticText "✦"
|
||||||
|
uid=9_66 StaticText "Utiliser le Destin"
|
||||||
|
uid=9_67 StaticText "3d8 au lieu de 2d8"
|
||||||
|
uid=9_68 StaticText "Jauge destin vide"
|
||||||
|
uid=9_69 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||||
|
uid=9_70 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_71 option "-8" selectable value="-8"
|
||||||
|
uid=9_72 option "-7" selectable value="-7"
|
||||||
|
uid=9_73 option "-6" selectable value="-6"
|
||||||
|
uid=9_74 option "-5" selectable value="-5"
|
||||||
|
uid=9_75 option "-4" selectable value="-4"
|
||||||
|
uid=9_76 option "-3" selectable value="-3"
|
||||||
|
uid=9_77 option "-2" selectable value="-2"
|
||||||
|
uid=9_78 option "-1" selectable value="-1"
|
||||||
|
uid=9_79 option "0" selectable selected value="0"
|
||||||
|
uid=9_80 option "+1" selectable value="+1"
|
||||||
|
uid=9_81 option "+2" selectable value="+2"
|
||||||
|
uid=9_82 option "+3" selectable value="+3"
|
||||||
|
uid=9_83 option "+4" selectable value="+4"
|
||||||
|
uid=9_84 option "+5" selectable value="+5"
|
||||||
|
uid=9_85 option "+6" selectable value="+6"
|
||||||
|
uid=9_86 option "+7" selectable value="+7"
|
||||||
|
uid=9_87 option "+8" selectable value="+8"
|
||||||
|
uid=9_88 StaticText "VISIBILITÉ"
|
||||||
|
uid=9_89 combobox expandable haspopup="menu" value="Public"
|
||||||
|
uid=9_90 option "Public" selectable selected value="Public"
|
||||||
|
uid=9_91 option "MJ uniquement" selectable value="MJ uniquement"
|
||||||
|
uid=9_92 option "Secret (moi)" selectable value="Secret (moi)"
|
||||||
|
uid=9_93 StaticText "FORMULE"
|
||||||
|
uid=9_94 StaticText "2d8 + 6"
|
||||||
|
uid=9_95 button "Lancer !"
|
||||||
|
uid=9_96 dialog
|
||||||
|
uid=9_97 banner
|
||||||
|
uid=9_98 heading "Corps › Attaquer" level="1"
|
||||||
|
uid=9_99 button "Basculer les contrôles"
|
||||||
|
uid=9_100 button "Fermer la fenêtre"
|
||||||
|
uid=9_101 StaticText "PNJ01"
|
||||||
|
uid=9_102 StaticText "⚔"
|
||||||
|
uid=9_103 StaticText "Arme"
|
||||||
|
uid=9_104 StaticText "+1"
|
||||||
|
uid=9_105 StaticText "Corps"
|
||||||
|
uid=9_106 StaticText " › "
|
||||||
|
uid=9_107 StaticText "Attaquer"
|
||||||
|
uid=9_108 StaticText "2d8"
|
||||||
|
uid=9_109 StaticText "+"
|
||||||
|
uid=9_110 StaticText "6"
|
||||||
|
uid=9_111 StaticText "CIBLE"
|
||||||
|
uid=9_112 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||||
|
uid=9_113 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||||
|
uid=9_114 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||||
|
uid=9_115 StaticText "CORPS DU PNJ"
|
||||||
|
uid=9_116 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||||
|
uid=9_117 StaticText "MODIFICATEUR"
|
||||||
|
uid=9_118 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||||
|
uid=9_119 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||||
|
uid=9_120 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||||
|
uid=9_121 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||||
|
uid=9_122 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||||
|
uid=9_123 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||||
|
uid=9_124 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||||
|
uid=9_125 StaticText "ASPECT"
|
||||||
|
uid=9_126 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_127 option "-4" selectable value="-4"
|
||||||
|
uid=9_128 option "-3" selectable value="-3"
|
||||||
|
uid=9_129 option "-2" selectable value="-2"
|
||||||
|
uid=9_130 option "-1" selectable value="-1"
|
||||||
|
uid=9_131 option "0" selectable selected value="0"
|
||||||
|
uid=9_132 option "+1" selectable value="+1"
|
||||||
|
uid=9_133 option "+2" selectable value="+2"
|
||||||
|
uid=9_134 option "+3" selectable value="+3"
|
||||||
|
uid=9_135 option "+4" selectable value="+4"
|
||||||
|
uid=9_136 checkbox
|
||||||
|
uid=9_137 StaticText "🌑"
|
||||||
|
uid=9_138 StaticText "Lancer le Dé de la Lune"
|
||||||
|
uid=9_139 checkbox disableable disabled
|
||||||
|
uid=9_140 StaticText "✦"
|
||||||
|
uid=9_141 StaticText "Utiliser le Destin"
|
||||||
|
uid=9_142 StaticText "3d8 au lieu de 2d8"
|
||||||
|
uid=9_143 StaticText "Jauge destin vide"
|
||||||
|
uid=9_144 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||||
|
uid=9_145 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_146 option "-8" selectable value="-8"
|
||||||
|
uid=9_147 option "-7" selectable value="-7"
|
||||||
|
uid=9_148 option "-6" selectable value="-6"
|
||||||
|
uid=9_149 option "-5" selectable value="-5"
|
||||||
|
uid=9_150 option "-4" selectable value="-4"
|
||||||
|
uid=9_151 option "-3" selectable value="-3"
|
||||||
|
uid=9_152 option "-2" selectable value="-2"
|
||||||
|
uid=9_153 option "-1" selectable value="-1"
|
||||||
|
uid=9_154 option "0" selectable selected value="0"
|
||||||
|
uid=9_155 option "+1" selectable value="+1"
|
||||||
|
uid=9_156 option "+2" selectable value="+2"
|
||||||
|
uid=9_157 option "+3" selectable value="+3"
|
||||||
|
uid=9_158 option "+4" selectable value="+4"
|
||||||
|
uid=9_159 option "+5" selectable value="+5"
|
||||||
|
uid=9_160 option "+6" selectable value="+6"
|
||||||
|
uid=9_161 option "+7" selectable value="+7"
|
||||||
|
uid=9_162 option "+8" selectable value="+8"
|
||||||
|
uid=9_163 StaticText "VISIBILITÉ"
|
||||||
|
uid=9_164 combobox expandable haspopup="menu" value="Public"
|
||||||
|
uid=9_165 option "Public" selectable selected value="Public"
|
||||||
|
uid=9_166 option "MJ uniquement" selectable value="MJ uniquement"
|
||||||
|
uid=9_167 option "Secret (moi)" selectable value="Secret (moi)"
|
||||||
|
uid=9_168 StaticText "FORMULE"
|
||||||
|
uid=9_169 StaticText "2d8 + 6"
|
||||||
|
uid=9_170 button "Lancer !"
|
||||||
|
uid=9_171 dialog
|
||||||
|
uid=9_172 banner
|
||||||
|
uid=9_173 heading "Corps › Attaquer" level="1"
|
||||||
|
uid=9_174 button "Basculer les contrôles"
|
||||||
|
uid=9_175 button "Fermer la fenêtre"
|
||||||
|
uid=9_176 StaticText "PNJ01"
|
||||||
|
uid=9_177 StaticText "⚔"
|
||||||
|
uid=9_178 StaticText "Arme"
|
||||||
|
uid=9_179 StaticText "+1"
|
||||||
|
uid=9_180 StaticText "Corps"
|
||||||
|
uid=9_181 StaticText " › "
|
||||||
|
uid=9_182 StaticText "Attaquer"
|
||||||
|
uid=9_183 StaticText "2d8"
|
||||||
|
uid=9_184 StaticText "+"
|
||||||
|
uid=9_185 StaticText "6"
|
||||||
|
uid=9_186 StaticText "CIBLE"
|
||||||
|
uid=9_187 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||||
|
uid=9_188 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||||
|
uid=9_189 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||||
|
uid=9_190 StaticText "CORPS DU PNJ"
|
||||||
|
uid=9_191 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||||
|
uid=9_192 StaticText "MODIFICATEUR"
|
||||||
|
uid=9_193 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||||
|
uid=9_194 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||||
|
uid=9_195 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||||
|
uid=9_196 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||||
|
uid=9_197 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||||
|
uid=9_198 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||||
|
uid=9_199 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||||
|
uid=9_200 StaticText "ASPECT"
|
||||||
|
uid=9_201 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_202 option "-4" selectable value="-4"
|
||||||
|
uid=9_203 option "-3" selectable value="-3"
|
||||||
|
uid=9_204 option "-2" selectable value="-2"
|
||||||
|
uid=9_205 option "-1" selectable value="-1"
|
||||||
|
uid=9_206 option "0" selectable selected value="0"
|
||||||
|
uid=9_207 option "+1" selectable value="+1"
|
||||||
|
uid=9_208 option "+2" selectable value="+2"
|
||||||
|
uid=9_209 option "+3" selectable value="+3"
|
||||||
|
uid=9_210 option "+4" selectable value="+4"
|
||||||
|
uid=9_211 checkbox
|
||||||
|
uid=9_212 StaticText "🌑"
|
||||||
|
uid=9_213 StaticText "Lancer le Dé de la Lune"
|
||||||
|
uid=9_214 checkbox disableable disabled
|
||||||
|
uid=9_215 StaticText "✦"
|
||||||
|
uid=9_216 StaticText "Utiliser le Destin"
|
||||||
|
uid=9_217 StaticText "3d8 au lieu de 2d8"
|
||||||
|
uid=9_218 StaticText "Jauge destin vide"
|
||||||
|
uid=9_219 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||||
|
uid=9_220 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_221 option "-8" selectable value="-8"
|
||||||
|
uid=9_222 option "-7" selectable value="-7"
|
||||||
|
uid=9_223 option "-6" selectable value="-6"
|
||||||
|
uid=9_224 option "-5" selectable value="-5"
|
||||||
|
uid=9_225 option "-4" selectable value="-4"
|
||||||
|
uid=9_226 option "-3" selectable value="-3"
|
||||||
|
uid=9_227 option "-2" selectable value="-2"
|
||||||
|
uid=9_228 option "-1" selectable value="-1"
|
||||||
|
uid=9_229 option "0" selectable selected value="0"
|
||||||
|
uid=9_230 option "+1" selectable value="+1"
|
||||||
|
uid=9_231 option "+2" selectable value="+2"
|
||||||
|
uid=9_232 option "+3" selectable value="+3"
|
||||||
|
uid=9_233 option "+4" selectable value="+4"
|
||||||
|
uid=9_234 option "+5" selectable value="+5"
|
||||||
|
uid=9_235 option "+6" selectable value="+6"
|
||||||
|
uid=9_236 option "+7" selectable value="+7"
|
||||||
|
uid=9_237 option "+8" selectable value="+8"
|
||||||
|
uid=9_238 StaticText "VISIBILITÉ"
|
||||||
|
uid=9_239 combobox expandable haspopup="menu" value="Public"
|
||||||
|
uid=9_240 option "Public" selectable selected value="Public"
|
||||||
|
uid=9_241 option "MJ uniquement" selectable value="MJ uniquement"
|
||||||
|
uid=9_242 option "Secret (moi)" selectable value="Secret (moi)"
|
||||||
|
uid=9_243 StaticText "FORMULE"
|
||||||
|
uid=9_244 StaticText "2d8 + 6"
|
||||||
|
uid=9_245 button "Lancer !"
|
||||||
|
uid=9_246 dialog
|
||||||
|
uid=9_247 banner
|
||||||
|
uid=9_248 heading "Corps › Attaquer" level="1"
|
||||||
|
uid=9_249 button "Basculer les contrôles"
|
||||||
|
uid=9_250 button "Fermer la fenêtre"
|
||||||
|
uid=9_251 StaticText "PNJ01"
|
||||||
|
uid=9_252 StaticText "⚔"
|
||||||
|
uid=9_253 StaticText "Arme"
|
||||||
|
uid=9_254 StaticText "+1"
|
||||||
|
uid=9_255 StaticText "Corps"
|
||||||
|
uid=9_256 StaticText " › "
|
||||||
|
uid=9_257 StaticText "Attaquer"
|
||||||
|
uid=9_258 StaticText "2d8"
|
||||||
|
uid=9_259 StaticText "+"
|
||||||
|
uid=9_260 StaticText "6"
|
||||||
|
uid=9_261 StaticText "CIBLE"
|
||||||
|
uid=9_262 combobox expandable haspopup="menu" value="— Saisir manuellement —"
|
||||||
|
uid=9_263 option "— Saisir manuellement —" selectable selected value="— Saisir manuellement —"
|
||||||
|
uid=9_264 option "Elemiah Cowen" selectable value="Elemiah Cowen"
|
||||||
|
uid=9_265 StaticText "CORPS DU PNJ"
|
||||||
|
uid=9_266 spinbutton value="7" valuemax="30" valuemin="1" valuetext="7"
|
||||||
|
uid=9_267 StaticText "MODIFICATEUR"
|
||||||
|
uid=9_268 combobox expandable haspopup="menu" value="Malaisé (0)"
|
||||||
|
uid=9_269 option "Évident — Réussite automatique" selectable value="Évident — Réussite automatique"
|
||||||
|
uid=9_270 option "Malaisé (0)" selectable selected value="Malaisé (0)"
|
||||||
|
uid=9_271 option "Difficile (−2)" selectable value="Difficile (−2)"
|
||||||
|
uid=9_272 option "Très difficile (−4)" selectable value="Très difficile (−4)"
|
||||||
|
uid=9_273 option "Extrêmement difficile (−6)" selectable value="Extrêmement difficile (−6)"
|
||||||
|
uid=9_274 option "Incroyablement difficile (−8)" selectable value="Incroyablement difficile (−8)"
|
||||||
|
uid=9_275 StaticText "ASPECT"
|
||||||
|
uid=9_276 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_277 option "-4" selectable value="-4"
|
||||||
|
uid=9_278 option "-3" selectable value="-3"
|
||||||
|
uid=9_279 option "-2" selectable value="-2"
|
||||||
|
uid=9_280 option "-1" selectable value="-1"
|
||||||
|
uid=9_281 option "0" selectable selected value="0"
|
||||||
|
uid=9_282 option "+1" selectable value="+1"
|
||||||
|
uid=9_283 option "+2" selectable value="+2"
|
||||||
|
uid=9_284 option "+3" selectable value="+3"
|
||||||
|
uid=9_285 option "+4" selectable value="+4"
|
||||||
|
uid=9_286 checkbox
|
||||||
|
uid=9_287 StaticText "🌑"
|
||||||
|
uid=9_288 StaticText "Lancer le Dé de la Lune"
|
||||||
|
uid=9_289 checkbox disableable disabled
|
||||||
|
uid=9_290 StaticText "✦"
|
||||||
|
uid=9_291 StaticText "Utiliser le Destin"
|
||||||
|
uid=9_292 StaticText "3d8 au lieu de 2d8"
|
||||||
|
uid=9_293 StaticText "Jauge destin vide"
|
||||||
|
uid=9_294 StaticText "MODIFICATEURS SITUATIONNELS"
|
||||||
|
uid=9_295 combobox expandable haspopup="menu" value="0"
|
||||||
|
uid=9_296 option "-8" selectable value="-8"
|
||||||
|
uid=9_297 option "-7" selectable value="-7"
|
||||||
|
uid=9_298 option "-6" selectable value="-6"
|
||||||
|
uid=9_299 option "-5" selectable value="-5"
|
||||||
|
uid=9_300 option "-4" selectable value="-4"
|
||||||
|
uid=9_301 option "-3" selectable value="-3"
|
||||||
|
uid=9_302 option "-2" selectable value="-2"
|
||||||
|
uid=9_303 option "-1" selectable value="-1"
|
||||||
|
uid=9_304 option "0" selectable selected value="0"
|
||||||
|
uid=9_305 option "+1" selectable value="+1"
|
||||||
|
uid=9_306 option "+2" selectable value="+2"
|
||||||
|
uid=9_307 option "+3" selectable value="+3"
|
||||||
|
uid=9_308 option "+4" selectable value="+4"
|
||||||
|
uid=9_309 option "+5" selectable value="+5"
|
||||||
|
uid=9_310 option "+6" selectable value="+6"
|
||||||
|
uid=9_311 option "+7" selectable value="+7"
|
||||||
|
uid=9_312 option "+8" selectable value="+8"
|
||||||
|
uid=9_313 StaticText "VISIBILITÉ"
|
||||||
|
uid=9_314 combobox expandable haspopup="menu" value="Public"
|
||||||
|
uid=9_315 option "Public" selectable selected value="Public"
|
||||||
|
uid=9_316 option "MJ uniquement" selectable value="MJ uniquement"
|
||||||
|
uid=9_317 option "Secret (moi)" selectable value="Secret (moi)"
|
||||||
|
uid=9_318 StaticText "FORMULE"
|
||||||
|
uid=9_319 StaticText "2d8 + 6"
|
||||||
|
uid=9_320 button "Lancer !" focusable focused
|
||||||
@@ -608,6 +608,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Onglet Équipement
|
// Onglet Équipement
|
||||||
|
.tab.combat,
|
||||||
.tab.equipement {
|
.tab.equipement {
|
||||||
.equip-section {
|
.equip-section {
|
||||||
margin-bottom: 14px;
|
margin-bottom: 14px;
|
||||||
@@ -666,6 +667,22 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.base-combat-row {
|
||||||
|
.base-action-icon {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 6px;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
background: rgba(12,76,12,0.1);
|
||||||
|
border: 1px solid rgba(12,76,12,0.25);
|
||||||
|
color: var(--cel-green);
|
||||||
|
font-size: 1rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.equip-empty {
|
.equip-empty {
|
||||||
font-size: 0.85em;
|
font-size: 0.85em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
@@ -675,11 +692,115 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tab.biography {
|
||||||
|
.biography-layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, 1fr) 230px;
|
||||||
|
gap: 16px;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-main {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-panel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
.section-header { .cel-section-header(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-preview {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 8px;
|
||||||
|
min-height: 360px;
|
||||||
|
background: rgba(12,76,12,0.08);
|
||||||
|
border: 1px solid rgba(122,92,32,0.25);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: inset 0 0 0 1px rgba(255,255,255,0.18);
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-image {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 520px;
|
||||||
|
aspect-ratio: 2 / 3;
|
||||||
|
object-fit: contain;
|
||||||
|
object-position: top center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-empty {
|
||||||
|
padding: 14px;
|
||||||
|
color: var(--cel-border);
|
||||||
|
font-size: 0.82em;
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-field {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
file-picker {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
file-picker input[type="text"] {
|
||||||
|
.cel-input-std();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-actions {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-send {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border: 1px solid rgba(122,92,32,0.35);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: linear-gradient(180deg, rgba(255,255,255,0.82), rgba(233,223,201,0.95));
|
||||||
|
color: var(--cel-green);
|
||||||
|
font-size: 0.82em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: var(--cel-orange);
|
||||||
|
color: var(--cel-orange);
|
||||||
|
background: linear-gradient(180deg, rgba(255,255,255,0.96), rgba(240,229,209,1));
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: default;
|
||||||
|
color: var(--cel-border);
|
||||||
|
border-color: rgba(122,92,32,0.2);
|
||||||
|
background: rgba(220,210,188,0.45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-hint {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.78em;
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--cel-border);
|
||||||
|
}
|
||||||
|
|
||||||
.biography-section, .notes-section {
|
.biography-section, .notes-section {
|
||||||
margin-bottom: 12px;
|
margin-bottom: 12px;
|
||||||
.section-header { .cel-section-header(); }
|
.section-header { .cel-section-header(); }
|
||||||
.enriched-html { font-size: 0.9em; line-height: 1.6; }
|
.enriched-html { font-size: 0.9em; line-height: 1.6; }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ── Section Expérience (onglet Biographie) ──────────────────────────────
|
// ── Section Expérience (onglet Biographie) ──────────────────────────────
|
||||||
.xp-section {
|
.xp-section {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
--cel-border: #7a5c20; // bordure dorée
|
--cel-border: #7a5c20; // bordure dorée
|
||||||
--cel-accent: #6b1e28; // bordeaux profond (échecs, accents)
|
--cel-accent: #6b1e28; // bordeaux profond (échecs, accents)
|
||||||
|
--cel-text: #2f2413; // texte de corps sur fond clair (parchemin)
|
||||||
|
|
||||||
--cel-shadow: rgba(10,15,10,0.5);
|
--cel-shadow: rgba(10,15,10,0.5);
|
||||||
|
|
||||||
@@ -57,14 +58,14 @@
|
|||||||
background-image: url("../assets/ui/fond_cadrille.jpg");
|
background-image: url("../assets/ui/fond_cadrille.jpg");
|
||||||
background-blend-mode: soft-light;
|
background-blend-mode: soft-light;
|
||||||
background-size: auto;
|
background-size: auto;
|
||||||
padding: 10px 12px 10px 10px;
|
padding: 8px 12px 8px 10px;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
border-bottom: 3px solid var(--cel-orange);
|
border-bottom: 3px solid var(--cel-orange);
|
||||||
box-shadow: 0 3px 0 0 rgba(196,154,26,0.25);
|
box-shadow: 0 3px 0 0 rgba(196,154,26,0.25);
|
||||||
|
|
||||||
.actor-portrait {
|
.actor-portrait {
|
||||||
width: 84px;
|
width: 97px;
|
||||||
height: 84px;
|
height: 97px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
border: 2px solid var(--cel-orange);
|
border: 2px solid var(--cel-orange);
|
||||||
box-shadow: inset 0 0 6px rgba(196,154,26,0.4), 0 0 4px rgba(0,0,0,0.5);
|
box-shadow: inset 0 0 6px rgba(196,154,26,0.4), 0 0 4px rgba(0,0,0,0.5);
|
||||||
|
|||||||
107
styles/npc.less
@@ -346,6 +346,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tab.combat,
|
||||||
.tab.equipement {
|
.tab.equipement {
|
||||||
.equip-section {
|
.equip-section {
|
||||||
margin-bottom: 14px;
|
margin-bottom: 14px;
|
||||||
@@ -418,6 +419,112 @@
|
|||||||
.section-header { .cel-section-header(); }
|
.section-header { .cel-section-header(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tab.biographie {
|
||||||
|
.biography-layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: minmax(0, 1fr) 220px;
|
||||||
|
gap: 16px;
|
||||||
|
align-items: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-main {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-panel {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8px;
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
.cel-section-header();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-preview {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 8px;
|
||||||
|
min-height: 340px;
|
||||||
|
background: rgba(12,76,12,0.08);
|
||||||
|
border: 1px solid rgba(122,92,32,0.25);
|
||||||
|
border-radius: 6px;
|
||||||
|
box-shadow: inset 0 0 0 1px rgba(255,255,255,0.18);
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-image {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
max-height: 500px;
|
||||||
|
aspect-ratio: 2 / 3;
|
||||||
|
object-fit: contain;
|
||||||
|
object-position: top center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-empty {
|
||||||
|
padding: 14px;
|
||||||
|
color: var(--cel-border);
|
||||||
|
font-size: 0.82em;
|
||||||
|
font-style: italic;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-field {
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
file-picker {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
file-picker input[type="text"] {
|
||||||
|
.cel-input-std();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-actions {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-send {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 6px;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border: 1px solid rgba(122,92,32,0.35);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: linear-gradient(180deg, rgba(255,255,255,0.82), rgba(233,223,201,0.95));
|
||||||
|
color: var(--cel-green);
|
||||||
|
font-size: 0.82em;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
border-color: var(--cel-orange);
|
||||||
|
color: var(--cel-orange);
|
||||||
|
background: linear-gradient(180deg, rgba(255,255,255,0.96), rgba(240,229,209,1));
|
||||||
|
}
|
||||||
|
|
||||||
|
&:disabled {
|
||||||
|
opacity: 0.5;
|
||||||
|
cursor: default;
|
||||||
|
color: var(--cel-border);
|
||||||
|
border-color: rgba(122,92,32,0.2);
|
||||||
|
background: rgba(220,210,188,0.45);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.biography-portrait-hint {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.78em;
|
||||||
|
font-style: italic;
|
||||||
|
color: var(--cel-border);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.description-section, .notes-section {
|
.description-section, .notes-section {
|
||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
.enriched-html { font-size: 0.9em; line-height: 1.6; }
|
.enriched-html { font-size: 0.9em; line-height: 1.6; }
|
||||||
|
|||||||
394
styles/roll.less
@@ -30,7 +30,7 @@
|
|||||||
.roll-actor {
|
.roll-actor {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
color: var(--cel-orange-light, #ddb84a);
|
color: var(--cel-orange-light, #ddb84a);
|
||||||
font-size: 0.78em;
|
font-size: 0.82em;
|
||||||
letter-spacing: 0.07em;
|
letter-spacing: 0.07em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
.roll-skill-line {
|
.roll-skill-line {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.25em;
|
font-size: 1.31em;
|
||||||
color: var(--cel-cream, #f0e8d4);
|
color: var(--cel-cream, #f0e8d4);
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
|
|
||||||
@@ -58,24 +58,24 @@
|
|||||||
justify-content: center;
|
justify-content: center;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
font-size: 0.82em;
|
font-size: 0.86em;
|
||||||
color: var(--cel-cream, #f0e8d4);
|
color: var(--cel-cream, #f0e8d4);
|
||||||
|
|
||||||
.dval, .nb-dice {
|
.dval, .nb-dice {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.7em;
|
font-size: 1.78em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
.dlabel { font-size: 0.78em; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.75; }
|
.dlabel { font-size: 0.82em; text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.75; }
|
||||||
.dminus { color: #f0a0a0; font-weight: bold; }
|
.dminus { color: #f0a0a0; font-weight: bold; }
|
||||||
.deq { opacity: 0.55; }
|
.deq { opacity: 0.55; }
|
||||||
.ddice { color: var(--cel-orange, #e07b00); }
|
.ddice { color: var(--cel-orange, #e07b00); }
|
||||||
}
|
}
|
||||||
|
|
||||||
.wound-info {
|
.wound-info {
|
||||||
font-size: 0.73em;
|
font-size: 0.77em;
|
||||||
color: #f0a0a0;
|
color: #f0a0a0;
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
@@ -117,17 +117,17 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 0.65em;
|
font-size: 0.68em;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.moon-icon { font-size: 1.2em; flex-shrink: 0; }
|
.moon-icon { font-size: 1.26em; flex-shrink: 0; }
|
||||||
|
|
||||||
.moon-text {
|
.moon-text {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.88em;
|
font-size: 0.92em;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
|
|
||||||
label {
|
label {
|
||||||
flex: 0 0 110px;
|
flex: 0 0 110px;
|
||||||
font-size: 0.78em;
|
font-size: 0.82em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
@@ -165,8 +165,8 @@
|
|||||||
padding: 3px 7px;
|
padding: 3px 7px;
|
||||||
background: rgba(255,255,255,0.85);
|
background: rgba(255,255,255,0.85);
|
||||||
font-family: inherit;
|
font-family: inherit;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
color: #333;
|
color: var(--cel-text, #2f2413);
|
||||||
|
|
||||||
&:focus { outline: 1px solid var(--cel-orange, #e07b00); }
|
&:focus { outline: 1px solid var(--cel-orange, #e07b00); }
|
||||||
}
|
}
|
||||||
@@ -233,7 +233,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 0.65em;
|
font-size: 0.68em;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.destin-icon {
|
.destin-icon {
|
||||||
font-size: 1.1em;
|
font-size: 1.16em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
@@ -252,20 +252,20 @@
|
|||||||
|
|
||||||
.destin-main {
|
.destin-main {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.destin-bonus {
|
.destin-bonus {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.destin-count {
|
.destin-count {
|
||||||
font-size: 0.75em;
|
font-size: 0.79em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
background: rgba(196,154,26,0.2);
|
background: rgba(196,154,26,0.2);
|
||||||
@@ -275,7 +275,7 @@
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|
||||||
&.no-destin {
|
&.no-destin {
|
||||||
color: #888;
|
color: rgba(0,0,0,0.45);
|
||||||
background: rgba(0,0,0,0.05);
|
background: rgba(0,0,0,0.05);
|
||||||
border-color: rgba(0,0,0,0.1);
|
border-color: rgba(0,0,0,0.1);
|
||||||
}
|
}
|
||||||
@@ -283,7 +283,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-visibility label { color: #888; }
|
.form-visibility label { color: rgba(0,0,0,0.45); }
|
||||||
|
|
||||||
.form-faction-aspect select {
|
.form-faction-aspect select {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 0.75em;
|
font-size: 0.79em;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -338,19 +338,19 @@
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
.puiser-main {
|
.puiser-main {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
color: var(--cel-accent, #6b1e28);
|
color: var(--cel-accent, #6b1e28);
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
.puiser-sub {
|
.puiser-sub {
|
||||||
font-size: 0.7em;
|
font-size: 0.73em;
|
||||||
color: #888;
|
color: rgba(0,0,0,0.45);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.puiser-cost {
|
.puiser-cost {
|
||||||
font-size: 0.8em;
|
font-size: 0.84em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--cel-accent, #6b1e28);
|
color: var(--cel-accent, #6b1e28);
|
||||||
background: rgba(107,30,40,0.1);
|
background: rgba(107,30,40,0.1);
|
||||||
@@ -398,14 +398,14 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
font-size: 0.6em;
|
font-size: 0.63em;
|
||||||
color: white;
|
color: white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.fortune-icon {
|
.fortune-icon {
|
||||||
font-size: 1.1em;
|
font-size: 1.16em;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
@@ -414,19 +414,19 @@
|
|||||||
flex: 1;
|
flex: 1;
|
||||||
.fortune-main {
|
.fortune-main {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
.fortune-bonus {
|
.fortune-bonus {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.fortune-badge {
|
.fortune-badge {
|
||||||
font-size: 0.8em;
|
font-size: 0.84em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
background: rgba(12,76,12,0.12);
|
background: rgba(12,76,12,0.12);
|
||||||
@@ -450,7 +450,7 @@
|
|||||||
gap: 10px;
|
gap: 10px;
|
||||||
|
|
||||||
.preview-label {
|
.preview-label {
|
||||||
font-size: 0.7em;
|
font-size: 0.73em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.07em;
|
letter-spacing: 0.07em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
@@ -459,7 +459,7 @@
|
|||||||
|
|
||||||
.preview-formula {
|
.preview-formula {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.6em;
|
font-size: 1.68em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
@@ -469,6 +469,90 @@
|
|||||||
|
|
||||||
// ─── Chat message ─────────────────────────────────────────────────────────────
|
// ─── Chat message ─────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// ── Contreparties dé de lune (partagé : chat-roll + moon-standalone-card) ──
|
||||||
|
.celestopol.chat-roll,
|
||||||
|
.celestopol-roll.moon-standalone-card {
|
||||||
|
.moon-effect-actions {
|
||||||
|
padding: 6px 10px 8px;
|
||||||
|
border-top: 2px solid rgba(122,92,32,0.18);
|
||||||
|
background: rgba(12,76,12,0.04);
|
||||||
|
border-radius: 0 0 3px 3px;
|
||||||
|
|
||||||
|
.moon-effect-label {
|
||||||
|
display: block;
|
||||||
|
font-family: var(--cel-font-title);
|
||||||
|
font-size: 0.76em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: var(--cel-border, #7a5c20);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.07em;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moon-effect-buttons {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 5px;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moon-effect-btn {
|
||||||
|
font-family: var(--cel-font-title);
|
||||||
|
font-size: 0.82em;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 4px 11px;
|
||||||
|
border-radius: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: filter 0.12s, opacity 0.12s;
|
||||||
|
line-height: 1.4;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
// Positif par défaut : vert jade / or
|
||||||
|
background: var(--cel-green, #1b3828);
|
||||||
|
color: var(--cel-orange-light, #ddb84a);
|
||||||
|
border: 1px solid rgba(196,154,26,0.35);
|
||||||
|
|
||||||
|
&:hover:not(:disabled) { filter: brightness(1.18); }
|
||||||
|
&:disabled { opacity: 0.55; cursor: not-allowed; }
|
||||||
|
|
||||||
|
&.moon-effect-negative {
|
||||||
|
background: var(--cel-accent, #6b1e28);
|
||||||
|
color: var(--cel-cream, #f0e8d4);
|
||||||
|
border-color: rgba(139,30,46,0.4);
|
||||||
|
&:hover:not(:disabled) { filter: brightness(1.12); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.moon-effect-narrative {
|
||||||
|
font-size: 0.76em;
|
||||||
|
color: var(--cel-border, #7a5c20);
|
||||||
|
font-style: italic;
|
||||||
|
align-self: center;
|
||||||
|
padding-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.moon-effect-applied-status {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 4px;
|
||||||
|
margin-top: 6px;
|
||||||
|
font-size: 0.8em;
|
||||||
|
font-family: var(--cel-font-title);
|
||||||
|
font-style: italic;
|
||||||
|
padding: 3px 9px;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: var(--cel-green, #1b3828);
|
||||||
|
background: rgba(12,76,12,0.09);
|
||||||
|
border: 1px solid rgba(12,76,12,0.22);
|
||||||
|
|
||||||
|
&.is-negative {
|
||||||
|
color: var(--cel-accent, #6b1e28);
|
||||||
|
background: rgba(107,30,40,0.09);
|
||||||
|
border-color: rgba(107,30,40,0.25);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.celestopol.chat-roll {
|
.celestopol.chat-roll {
|
||||||
border: 1px solid var(--cel-border, #7a5c20);
|
border: 1px solid var(--cel-border, #7a5c20);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
@@ -506,16 +590,16 @@
|
|||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
font-size: 0.92em;
|
font-size: 0.97em;
|
||||||
}
|
}
|
||||||
.skill-info {
|
.skill-info {
|
||||||
color: var(--cel-cream, #f0e8d4);
|
color: var(--cel-cream, #f0e8d4);
|
||||||
font-size: 0.77em;
|
font-size: 0.81em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
.stat-lbl { color: var(--cel-orange-light, #ddb84a); }
|
.stat-lbl { color: var(--cel-orange-light, #ddb84a); }
|
||||||
.sep { margin: 0 2px; opacity: 0.5; }
|
.sep { margin: 0 2px; opacity: 0.5; }
|
||||||
}
|
}
|
||||||
.wound-info { font-size: 0.7em; color: #f0a0a0; }
|
.wound-info { font-size: 0.73em; color: #f0a0a0; }
|
||||||
}
|
}
|
||||||
|
|
||||||
.moon-badge { display: none; }
|
.moon-badge { display: none; }
|
||||||
@@ -540,10 +624,10 @@
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: white;
|
background: white;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.05em;
|
font-size: 1.1em;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
box-shadow: 1px 1px 2px rgba(0,0,0,0.12);
|
box-shadow: 1px 1px 2px rgba(0,0,0,0.12);
|
||||||
color: #222;
|
color: var(--cel-text, #2f2413);
|
||||||
|
|
||||||
&.max {
|
&.max {
|
||||||
background: var(--cel-green, #0c4c0c);
|
background: var(--cel-green, #0c4c0c);
|
||||||
@@ -569,15 +653,15 @@
|
|||||||
padding: 5px 10px 4px;
|
padding: 5px 10px 4px;
|
||||||
background: var(--cel-cream, #f0e8d4);
|
background: var(--cel-cream, #f0e8d4);
|
||||||
border-top: 1px solid rgba(122,92,32,0.2);
|
border-top: 1px solid rgba(122,92,32,0.2);
|
||||||
font-size: 0.83em;
|
font-size: 0.87em;
|
||||||
color: #555;
|
color: #555;
|
||||||
|
|
||||||
.fl-label { color: #999; font-size: 0.88em; text-transform: uppercase; letter-spacing: 0.04em; margin-right: 2px; }
|
.fl-label { color: rgba(0,0,0,0.4); font-size: 0.92em; text-transform: uppercase; letter-spacing: 0.04em; margin-right: 2px; }
|
||||||
.fl-ndice { color: var(--cel-green, #0c4c0c); font-weight: bold; }
|
.fl-ndice { color: var(--cel-green, #0c4c0c); font-weight: bold; }
|
||||||
.fl-sum { font-weight: bold; color: #333; }
|
.fl-sum { font-weight: bold; color: var(--cel-text, #2f2413); }
|
||||||
.fl-total {
|
.fl-total {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.5em;
|
font-size: 1.58em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
@@ -588,8 +672,8 @@
|
|||||||
.fl-asp { color: var(--cel-orange, #e07b00); font-weight: bold; }
|
.fl-asp { color: var(--cel-orange, #e07b00); font-weight: bold; }
|
||||||
.fl-faction { color: var(--cel-green, #0c4c0c); font-weight: bold; }
|
.fl-faction { color: var(--cel-green, #0c4c0c); font-weight: bold; }
|
||||||
.fl-sep { font-weight: bold; color: var(--cel-border, #7a5c20); margin: 0 2px; }
|
.fl-sep { font-weight: bold; color: var(--cel-border, #7a5c20); margin: 0 2px; }
|
||||||
.fl-eq { color: #aaa; }
|
.fl-eq { color: rgba(0,0,0,0.35); }
|
||||||
.fl-op { color: #aaa; }
|
.fl-op { color: rgba(0,0,0,0.35); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Seuil et marge ──
|
// ── Seuil et marge ──
|
||||||
@@ -600,22 +684,22 @@
|
|||||||
padding: 5px 12px 6px;
|
padding: 5px 12px 6px;
|
||||||
background: var(--cel-cream, #f0e8d4);
|
background: var(--cel-cream, #f0e8d4);
|
||||||
border-top: 1px solid rgba(122,92,32,0.2);
|
border-top: 1px solid rgba(122,92,32,0.2);
|
||||||
font-size: 0.82em;
|
font-size: 0.86em;
|
||||||
|
|
||||||
.vs-wrap {
|
.vs-wrap {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
}
|
}
|
||||||
.vs-label { color: #aaa; text-transform: uppercase; font-size: 0.8em; }
|
.vs-label { color: rgba(0,0,0,0.35); text-transform: uppercase; font-size: 0.84em; }
|
||||||
.diff-label{ font-style: italic; color: var(--cel-green, #0c4c0c); }
|
.diff-label{ font-style: italic; color: var(--cel-green, #0c4c0c); }
|
||||||
.diff-val { color: #888; }
|
.diff-val { color: rgba(0,0,0,0.45); }
|
||||||
|
|
||||||
.margin-badge {
|
.margin-badge {
|
||||||
padding: 2px 10px;
|
padding: 2px 10px;
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.05em;
|
font-size: 1.1em;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
|
|
||||||
@@ -635,7 +719,7 @@
|
|||||||
// ── Destin utilisé ──
|
// ── Destin utilisé ──
|
||||||
.used-info {
|
.used-info {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 0.77em;
|
font-size: 0.81em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
padding: 3px 8px;
|
padding: 3px 8px;
|
||||||
background: rgba(196,154,26,0.1);
|
background: rgba(196,154,26,0.1);
|
||||||
@@ -673,7 +757,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.damage-header {
|
.damage-header {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.08em;
|
letter-spacing: 0.08em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
@@ -690,13 +774,13 @@
|
|||||||
|
|
||||||
.damage-value {
|
.damage-value {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.9em;
|
font-size: 1.99em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
}
|
}
|
||||||
|
|
||||||
.damage-unit {
|
.damage-unit {
|
||||||
font-size: 0.82em;
|
font-size: 0.86em;
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
@@ -704,7 +788,7 @@
|
|||||||
.damage-breakdown,
|
.damage-breakdown,
|
||||||
.damage-note {
|
.damage-note {
|
||||||
margin-top: 6px;
|
margin-top: 6px;
|
||||||
font-size: 0.76em;
|
font-size: 0.8em;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
color: #5c4630;
|
color: #5c4630;
|
||||||
}
|
}
|
||||||
@@ -730,7 +814,7 @@
|
|||||||
background: var(--cel-green, #0c4c0c);
|
background: var(--cel-green, #0c4c0c);
|
||||||
color: var(--cel-orange-light, #ddb84a);
|
color: var(--cel-orange-light, #ddb84a);
|
||||||
padding: 4px 10px;
|
padding: 4px 10px;
|
||||||
font-size: 0.78em;
|
font-size: 0.82em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
|
||||||
@@ -745,7 +829,7 @@
|
|||||||
margin-top: 8px;
|
margin-top: 8px;
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
font-size: 0.76em;
|
font-size: 0.8em;
|
||||||
line-height: 1.4;
|
line-height: 1.4;
|
||||||
|
|
||||||
&.is-applied {
|
&.is-applied {
|
||||||
@@ -774,7 +858,7 @@
|
|||||||
background: rgba(12,76,12,0.1);
|
background: rgba(12,76,12,0.1);
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Résultat dé de lune ──
|
// ── Résultat dé de lune ──
|
||||||
@@ -787,7 +871,7 @@
|
|||||||
font-family: var(--cel-font-body, serif);
|
font-family: var(--cel-font-body, serif);
|
||||||
|
|
||||||
.moon-die-face {
|
.moon-die-face {
|
||||||
font-size: 1.8em;
|
font-size: 1.89em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
@@ -800,7 +884,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.moon-die-phase {
|
.moon-die-phase {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
opacity: 0.75;
|
opacity: 0.75;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
@@ -815,7 +899,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.moon-die-desc {
|
.moon-die-desc {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
opacity: 0.85;
|
opacity: 0.85;
|
||||||
line-height: 1.3;
|
line-height: 1.3;
|
||||||
@@ -852,13 +936,13 @@
|
|||||||
border-top: 2px solid rgba(0,0,0,0.1);
|
border-top: 2px solid rgba(0,0,0,0.1);
|
||||||
|
|
||||||
.result-icon {
|
.result-icon {
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
opacity: 0.85;
|
opacity: 0.85;
|
||||||
letter-spacing: 0.15em;
|
letter-spacing: 0.15em;
|
||||||
}
|
}
|
||||||
.result-label { font-size: 1.2em; line-height: 1.2; }
|
.result-label { font-size: 1.26em; line-height: 1.2; }
|
||||||
.result-desc {
|
.result-desc {
|
||||||
font-size: 0.65em;
|
font-size: 0.68em;
|
||||||
letter-spacing: 0.08em;
|
letter-spacing: 0.08em;
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
@@ -919,22 +1003,22 @@
|
|||||||
|
|
||||||
.welcome-mark {
|
.welcome-mark {
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-size: 1.05em;
|
font-size: 1.1em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-title {
|
.welcome-title {
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-size: 0.98em;
|
font-size: 1.03em;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
.welcome-body {
|
.welcome-body {
|
||||||
padding: 9px 11px 10px;
|
padding: 9px 11px 10px;
|
||||||
color: #3f3623;
|
color: var(--cel-text, #2f2413);
|
||||||
font-size: 0.84em;
|
font-size: 0.88em;
|
||||||
line-height: 1.45;
|
line-height: 1.45;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@@ -954,7 +1038,7 @@
|
|||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
@@ -977,6 +1061,73 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chat-message .cel-portrait-message {
|
||||||
|
border: 1px solid var(--cel-border, #7a5c20);
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
background: linear-gradient(180deg, rgba(255,248,232,0.98), rgba(240,229,209,0.95));
|
||||||
|
font-family: var(--cel-font-body, "Palatino Linotype", serif);
|
||||||
|
|
||||||
|
.portrait-message-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 7px 10px;
|
||||||
|
background: var(--cel-green, #0c4c0c);
|
||||||
|
background-image: url("../assets/ui/fond_cadrille.jpg");
|
||||||
|
background-blend-mode: soft-light;
|
||||||
|
border-bottom: 2px solid var(--cel-orange, #e07b00);
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-mark {
|
||||||
|
color: var(--cel-orange, #e07b00);
|
||||||
|
font-size: 1.1em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-title {
|
||||||
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
|
color: var(--cel-orange, #e07b00);
|
||||||
|
font-size: 1.03em;
|
||||||
|
letter-spacing: 0.05em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-body {
|
||||||
|
padding: 9px 11px 10px;
|
||||||
|
color: var(--cel-text, #2f2413);
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-name {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: var(--cel-green, #0c4c0c);
|
||||||
|
font-size: 0.88em;
|
||||||
|
font-weight: bold;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-frame {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 6px;
|
||||||
|
border: 1px solid rgba(122,92,32,0.2);
|
||||||
|
border-radius: 4px;
|
||||||
|
background: rgba(255,255,255,0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.portrait-message-image {
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 240px;
|
||||||
|
max-height: 420px;
|
||||||
|
aspect-ratio: 2 / 3;
|
||||||
|
object-fit: contain;
|
||||||
|
object-position: top center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.application.faction-aspect-dialog {
|
.application.faction-aspect-dialog {
|
||||||
width: min(540px, 92vw);
|
width: min(540px, 92vw);
|
||||||
}
|
}
|
||||||
@@ -1033,7 +1184,7 @@
|
|||||||
&:hover {
|
&:hover {
|
||||||
border-color: var(--cel-orange, #e07b00);
|
border-color: var(--cel-orange, #e07b00);
|
||||||
background: linear-gradient(180deg, rgba(224,123,0,0.18), rgba(224,123,0,0.06));
|
background: linear-gradient(180deg, rgba(224,123,0,0.18), rgba(224,123,0,0.06));
|
||||||
color: #7a3e00;
|
color: var(--cel-border, #7a5c20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1057,7 +1208,7 @@
|
|||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
font-size: 0.88em;
|
font-size: 0.92em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-points {
|
.faction-aspect-points {
|
||||||
@@ -1065,7 +1216,7 @@
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
font-size: 0.8em;
|
font-size: 0.84em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-point-card {
|
.faction-aspect-point-card {
|
||||||
@@ -1079,7 +1230,7 @@
|
|||||||
border: 1px solid rgba(122,92,32,0.18);
|
border: 1px solid rgba(122,92,32,0.18);
|
||||||
|
|
||||||
strong {
|
strong {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
@@ -1088,14 +1239,14 @@
|
|||||||
em {
|
em {
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 1.05em;
|
font-size: 1.1em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-source-line {
|
.faction-aspect-source-line {
|
||||||
font-size: 0.78em;
|
font-size: 0.82em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1104,8 +1255,8 @@
|
|||||||
border-left: 3px solid #b84a2e;
|
border-left: 3px solid #b84a2e;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: rgba(184, 74, 46, 0.08);
|
background: rgba(184, 74, 46, 0.08);
|
||||||
color: #8b3e2b;
|
color: var(--cel-accent, #6b1e28);
|
||||||
font-size: 0.8em;
|
font-size: 0.84em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-tag-list,
|
.faction-aspect-tag-list,
|
||||||
@@ -1123,7 +1274,7 @@
|
|||||||
background: rgba(12, 76, 12, 0.08);
|
background: rgba(12, 76, 12, 0.08);
|
||||||
border: 1px solid rgba(12, 76, 12, 0.18);
|
border: 1px solid rgba(12, 76, 12, 0.18);
|
||||||
color: var(--cel-green, #0c4c0c);
|
color: var(--cel-green, #0c4c0c);
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1137,7 +1288,7 @@
|
|||||||
label {
|
label {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
font-size: 0.68em;
|
font-size: 0.71em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
color: var(--cel-border, #7a5c20);
|
color: var(--cel-border, #7a5c20);
|
||||||
@@ -1152,13 +1303,13 @@
|
|||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 2px 6px;
|
padding: 2px 6px;
|
||||||
background: rgba(255,255,255,0.9);
|
background: rgba(255,255,255,0.9);
|
||||||
font-size: 0.78em;
|
font-size: 0.82em;
|
||||||
color: #2f2413;
|
color: var(--cel-text, #2f2413);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
|
|
||||||
select option {
|
select option {
|
||||||
color: #2f2413;
|
color: var(--cel-text, #2f2413);
|
||||||
background: #fffaf0;
|
background: #fffaf0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1184,7 +1335,7 @@
|
|||||||
background: rgba(224,123,0,0.12);
|
background: rgba(224,123,0,0.12);
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
cursor: help;
|
cursor: help;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
@@ -1206,7 +1357,7 @@
|
|||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
font-size: 0.82em;
|
font-size: 0.86em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1214,7 +1365,7 @@
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 4px;
|
gap: 4px;
|
||||||
font-size: 0.74em;
|
font-size: 0.78em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-active-list {
|
.faction-aspect-active-list {
|
||||||
@@ -1231,8 +1382,8 @@
|
|||||||
padding: 3px 6px;
|
padding: 3px 6px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: rgba(255,255,255,0.7);
|
background: rgba(255,255,255,0.7);
|
||||||
color: #2f2413;
|
color: var(--cel-text, #2f2413);
|
||||||
font-size: 0.76em;
|
font-size: 0.8em;
|
||||||
|
|
||||||
&.is-relevant {
|
&.is-relevant {
|
||||||
border-left: 3px solid var(--cel-green, #0c4c0c);
|
border-left: 3px solid var(--cel-green, #0c4c0c);
|
||||||
@@ -1240,20 +1391,20 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-active-name {
|
.faction-aspect-active-name {
|
||||||
color: #2f2413;
|
color: var(--cel-text, #2f2413);
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-active-value {
|
.faction-aspect-active-value {
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
font-size: 0.92em;
|
font-size: 0.97em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-empty {
|
.faction-aspect-empty {
|
||||||
color: #666;
|
color: rgba(0,0,0,0.5);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
font-size: 0.74em;
|
font-size: 0.78em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.faction-aspect-remove-block {
|
.faction-aspect-remove-block {
|
||||||
@@ -1282,7 +1433,7 @@
|
|||||||
border-left: 3px solid #c0392b;
|
border-left: 3px solid #c0392b;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
color: #f0c0c0;
|
color: #f0c0c0;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
.wound-icon { font-size: 1em; }
|
.wound-icon { font-size: 1em; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1291,7 +1442,7 @@
|
|||||||
.celestopol.chat-roll {
|
.celestopol.chat-roll {
|
||||||
.roll-result-banner.tie {
|
.roll-result-banner.tie {
|
||||||
background: #3a2e1a;
|
background: #3a2e1a;
|
||||||
color: #d4b870;
|
color: var(--cel-orange-light, #ddb84a);
|
||||||
border-top: 2px solid #7a6230;
|
border-top: 2px solid #7a6230;
|
||||||
border-bottom: 2px solid #7a6230;
|
border-bottom: 2px solid #7a6230;
|
||||||
text-shadow: 0 1px 2px rgba(0,0,0,0.6);
|
text-shadow: 0 1px 2px rgba(0,0,0,0.6);
|
||||||
@@ -1302,12 +1453,12 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.3em;
|
gap: 0.3em;
|
||||||
margin-bottom: 1px;
|
margin-bottom: 1px;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
.weapon-icon-small { font-size: 0.9em; }
|
.weapon-icon-small { font-size: 0.95em; }
|
||||||
.weapon-degats-small {
|
.weapon-degats-small {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #f0c060;
|
color: var(--cel-border, #7a5c20);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1319,20 +1470,20 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 0.4em;
|
gap: 0.4em;
|
||||||
margin-bottom: 2px;
|
margin-bottom: 2px;
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
.weapon-icon { font-size: 1em; }
|
.weapon-icon { font-size: 1em; }
|
||||||
.weapon-degats {
|
.weapon-degats {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #f0c060;
|
color: var(--cel-border, #7a5c20);
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-corps-pnj {
|
.form-corps-pnj {
|
||||||
.corps-pnj-input {
|
.corps-pnj-input {
|
||||||
width: 70px;
|
width: 70px;
|
||||||
font-size: 1.1em;
|
font-size: 1.16em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
@@ -1353,7 +1504,7 @@
|
|||||||
label {
|
label {
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
@@ -1368,7 +1519,7 @@
|
|||||||
border: 1px solid rgba(196, 154, 26, 0.5);
|
border: 1px solid rgba(196, 154, 26, 0.5);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 2px 4px;
|
padding: 2px 4px;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
max-width: 200px;
|
max-width: 200px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1384,7 +1535,7 @@
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 6px;
|
gap: 6px;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-size: 0.88em;
|
font-size: 0.92em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
|
|
||||||
i { opacity: 0.8; }
|
i { opacity: 0.8; }
|
||||||
@@ -1398,14 +1549,14 @@
|
|||||||
padding: 4px 8px;
|
padding: 4px 8px;
|
||||||
|
|
||||||
label {
|
label {
|
||||||
color: #e08060;
|
color: var(--cel-accent, #6b1e28);
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 5px;
|
gap: 5px;
|
||||||
|
|
||||||
i { color: #e08060; }
|
i { color: var(--cel-accent, #6b1e28); }
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
@@ -1415,13 +1566,13 @@
|
|||||||
border: 1px solid rgba(200, 100, 60, 0.4);
|
border: 1px solid rgba(200, 100, 60, 0.4);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 2px 4px;
|
padding: 2px 4px;
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-threshold-fixed {
|
.form-threshold-fixed {
|
||||||
.threshold-value {
|
.threshold-value {
|
||||||
font-size: 1.2em;
|
font-size: 1.26em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
@@ -1447,7 +1598,7 @@
|
|||||||
input[type="checkbox"] { flex-shrink: 0; }
|
input[type="checkbox"] { flex-shrink: 0; }
|
||||||
|
|
||||||
.opposition-icon {
|
.opposition-icon {
|
||||||
font-size: 1.2em;
|
font-size: 1.26em;
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1458,13 +1609,13 @@
|
|||||||
|
|
||||||
.opposition-main {
|
.opposition-main {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 0.9em;
|
font-size: 0.95em;
|
||||||
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
font-family: var(--cel-font-title, "CopaseticNF", serif);
|
||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
}
|
}
|
||||||
|
|
||||||
.opposition-sub {
|
.opposition-sub {
|
||||||
font-size: 0.75em;
|
font-size: 0.79em;
|
||||||
opacity: 0.7;
|
opacity: 0.7;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
@@ -1508,7 +1659,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.moon-standalone-actor {
|
.moon-standalone-actor {
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
color: var(--cel-text, #333);
|
color: var(--cel-text, #333);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
@@ -1537,21 +1688,21 @@
|
|||||||
|
|
||||||
.moon-standalone-phase {
|
.moon-standalone-phase {
|
||||||
font-family: var(--cel-font-title);
|
font-family: var(--cel-font-title);
|
||||||
font-size: 0.95em;
|
font-size: 1.0em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: var(--cel-text, #333);
|
color: var(--cel-text, #333);
|
||||||
}
|
}
|
||||||
|
|
||||||
.moon-standalone-value {
|
.moon-standalone-value {
|
||||||
font-size: 0.8em;
|
font-size: 0.84em;
|
||||||
color: var(--cel-text-light, #666);
|
color: var(--cel-text-light, #666);
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.moon-triomphe { border-left-color: var(--cel-green, #0c4c0c); }
|
&.moon-triomphe { border-left-color: var(--cel-green, #0c4c0c); }
|
||||||
&.moon-brio { border-left-color: var(--cel-border, #7a5c20); }
|
&.moon-brio { border-left-color: var(--cel-border, #7a5c20); }
|
||||||
&.moon-contrecoup { border-left-color: #c07800; }
|
&.moon-contrecoup { border-left-color: var(--cel-orange, #c49a1a); }
|
||||||
&.moon-catastrophe{ border-left-color: #8b1e2e; }
|
&.moon-catastrophe{ border-left-color: var(--cel-accent, #6b1e28); }
|
||||||
}
|
}
|
||||||
|
|
||||||
.moon-interpret-row {
|
.moon-interpret-row {
|
||||||
@@ -1560,15 +1711,15 @@
|
|||||||
gap: 8px;
|
gap: 8px;
|
||||||
|
|
||||||
.moon-interpret-label {
|
.moon-interpret-label {
|
||||||
font-size: 0.72em;
|
font-size: 0.76em;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.07em;
|
letter-spacing: 0.07em;
|
||||||
color: #888;
|
color: rgba(0,0,0,0.45);
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.moon-fortune {
|
.moon-fortune {
|
||||||
font-size: 0.85em;
|
font-size: 0.89em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: 1px 8px;
|
padding: 1px 8px;
|
||||||
@@ -1581,7 +1732,7 @@
|
|||||||
|
|
||||||
&.mauvaise-fortune {
|
&.mauvaise-fortune {
|
||||||
background: rgba(139, 30, 46, 0.1);
|
background: rgba(139, 30, 46, 0.1);
|
||||||
color: #8b1e2e;
|
color: var(--cel-accent, #6b1e28);
|
||||||
border: 1px solid rgba(139,30,46,0.3);
|
border: 1px solid rgba(139,30,46,0.3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1592,6 +1743,7 @@
|
|||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
padding: 6px 8px;
|
padding: 6px 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Message d'initiative ──────────────────────────────────────────────────────
|
// ── Message d'initiative ──────────────────────────────────────────────────────
|
||||||
@@ -1631,11 +1783,11 @@
|
|||||||
color: var(--cel-orange, #e07b00);
|
color: var(--cel-orange, #e07b00);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
font-size: 0.92em;
|
font-size: 0.97em;
|
||||||
}
|
}
|
||||||
.skill-info {
|
.skill-info {
|
||||||
color: var(--cel-cream, #f0e8d4);
|
color: var(--cel-cream, #f0e8d4);
|
||||||
font-size: 0.77em;
|
font-size: 0.81em;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1663,19 +1815,19 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.initiative-icon {
|
.initiative-icon {
|
||||||
font-size: 1.1em;
|
font-size: 1.16em;
|
||||||
opacity: 0.9;
|
opacity: 0.9;
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.initiative-score {
|
.initiative-score {
|
||||||
font-size: 2.4em;
|
font-size: 2.52em;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.initiative-detail {
|
.initiative-detail {
|
||||||
font-size: 0.65em;
|
font-size: 0.68em;
|
||||||
opacity: 0.75;
|
opacity: 0.75;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
font-family: var(--cel-font-body, serif);
|
font-family: var(--cel-font-body, serif);
|
||||||
|
|||||||
@@ -98,6 +98,13 @@
|
|||||||
"path": "packs-system/anomalies",
|
"path": "packs-system/anomalies",
|
||||||
"type": "Item"
|
"type": "Item"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "pretires",
|
||||||
|
"label": "Célestopol 1922 — Prétirés",
|
||||||
|
"system": "fvtt-celestopol",
|
||||||
|
"path": "packs-system/pretires",
|
||||||
|
"type": "Actor"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "aides-de-jeu",
|
"name": "aides-de-jeu",
|
||||||
"label": "Célestopol 1922 — Aides de jeu",
|
"label": "Célestopol 1922 — Aides de jeu",
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<div class="tab biography {{tab.cssClass}}" data-group="sheet" data-tab="biography">
|
<div class="tab biography {{tab.cssClass}}" data-group="sheet" data-tab="biography">
|
||||||
|
<div class="biography-layout">
|
||||||
|
<div class="biography-main">
|
||||||
{{!-- Description Physique --}}
|
{{!-- Description Physique --}}
|
||||||
<div class="biography-section">
|
<div class="biography-section">
|
||||||
<div class="section-header">{{localize "CELESTOPOL.Actor.descriptionPhysique"}}</div>
|
<div class="section-header">{{localize "CELESTOPOL.Actor.descriptionPhysique"}}</div>
|
||||||
@@ -12,6 +13,12 @@
|
|||||||
{{formInput systemFields.descriptionPsychologique enriched=enrichedDescriptionPsychologique value=system.descriptionPsychologique name="system.descriptionPsychologique" toggled=true}}
|
{{formInput systemFields.descriptionPsychologique enriched=enrichedDescriptionPsychologique value=system.descriptionPsychologique name="system.descriptionPsychologique" toggled=true}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{!-- Historique --}}
|
||||||
|
<div class="biography-section">
|
||||||
|
<div class="section-header">{{localize "CELESTOPOL.Actor.historique"}}</div>
|
||||||
|
{{formInput systemFields.historique enriched=enrichedHistorique value=system.historique name="system.historique" toggled=true}}
|
||||||
|
</div>
|
||||||
|
|
||||||
{{!-- Notes --}}
|
{{!-- Notes --}}
|
||||||
<div class="notes-section">
|
<div class="notes-section">
|
||||||
<div class="section-header">{{localize "CELESTOPOL.Actor.notes"}}</div>
|
<div class="section-header">{{localize "CELESTOPOL.Actor.notes"}}</div>
|
||||||
@@ -88,5 +95,28 @@
|
|||||||
</table>
|
</table>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<aside class="biography-portrait-panel">
|
||||||
|
<div class="section-header">{{localize "CELESTOPOL.Actor.portraitImage"}}</div>
|
||||||
|
<div class="biography-portrait-preview">
|
||||||
|
{{#if hasBiographyPortrait}}
|
||||||
|
<img src="{{biographyPortrait}}" alt="{{actor.name}}" class="biography-portrait-image">
|
||||||
|
{{else}}
|
||||||
|
<div class="biography-portrait-empty">{{localize "CELESTOPOL.Actor.portraitImageEmpty"}}</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
<div class="biography-portrait-actions">
|
||||||
|
<button type="button" class="biography-portrait-send" data-action="sendBiographyPortrait" {{#unless hasBiographyPortrait}}disabled{{/unless}}>
|
||||||
|
<i class="fa-solid fa-image"></i> {{localize "CELESTOPOL.Actor.sendPortraitToChat"}}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{{#if isEditMode}}
|
||||||
|
<div class="biography-portrait-field">
|
||||||
|
<file-picker type="image" name="system.portraitImage" value="{{system.portraitImage}}"></file-picker>
|
||||||
|
</div>
|
||||||
|
<p class="biography-portrait-hint">{{localize "CELESTOPOL.Actor.portraitImageHint"}}</p>
|
||||||
|
{{/if}}
|
||||||
|
</aside>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
90
templates/character-combat.hbs
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<div class="tab combat {{tab.cssClass}}" data-group="sheet" data-tab="combat">
|
||||||
|
|
||||||
|
<div class="equip-section combat-actions-section">
|
||||||
|
<div class="section-header">
|
||||||
|
<i class="fas fa-burst"></i>
|
||||||
|
<span>{{localize "CELESTOPOL.Combat.baseActions"}}</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-row base-combat-row">
|
||||||
|
<div class="base-action-icon"><i class="fas fa-hand-fist"></i></div>
|
||||||
|
<span class="item-name">{{localize "CELESTOPOL.Combat.unarmedAttack"}}</span>
|
||||||
|
<span class="item-tag type">{{localize "CELESTOPOL.Weapon.typeMelee"}}</span>
|
||||||
|
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} 0</span>
|
||||||
|
<div class="item-controls">
|
||||||
|
{{#unless isEditMode}}
|
||||||
|
<a data-action="unarmedAttack" title="{{localize 'CELESTOPOL.Combat.unarmedAttack'}}"><i class="fas fa-khanda"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="item-row base-combat-row">
|
||||||
|
<div class="base-action-icon"><i class="fas fa-person-running"></i></div>
|
||||||
|
<span class="item-name">{{localize "CELESTOPOL.Combat.baseRangedDefense"}}</span>
|
||||||
|
<span class="item-tag type">{{localize "CELESTOPOL.Combat.rangedDefenseTag"}}</span>
|
||||||
|
<span class="item-tag dmg">{{localize "CELESTOPOL.Skill.mobilite"}}</span>
|
||||||
|
<div class="item-controls">
|
||||||
|
{{#unless isEditMode}}
|
||||||
|
<a data-action="baseRangedDefense" title="{{localize 'CELESTOPOL.Combat.baseRangedDefense'}}"><i class="fas fa-shield-halved"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="equip-section">
|
||||||
|
<div class="section-header">
|
||||||
|
<i class="fas fa-khanda"></i>
|
||||||
|
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
||||||
|
{{#if isEditMode}}
|
||||||
|
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#each weapons as |item|}}
|
||||||
|
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||||
|
<img src="{{item.img}}" class="item-icon">
|
||||||
|
<span class="item-name">{{item.name}}</span>
|
||||||
|
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
||||||
|
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
||||||
|
<div class="item-controls">
|
||||||
|
{{#unless ../isEditMode}}
|
||||||
|
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
||||||
|
{{/unless}}
|
||||||
|
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||||
|
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="equip-section">
|
||||||
|
<div class="section-header">
|
||||||
|
<i class="fas fa-shield-halved"></i>
|
||||||
|
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
||||||
|
{{#if isEditMode}}
|
||||||
|
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
{{#each armures as |item|}}
|
||||||
|
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
||||||
|
<img src="{{item.img}}" class="item-icon">
|
||||||
|
<span class="item-name">{{item.name}}</span>
|
||||||
|
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
||||||
|
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
||||||
|
<div class="item-controls">
|
||||||
|
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
||||||
|
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"
|
||||||
|
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}">
|
||||||
|
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
||||||
|
</a>
|
||||||
|
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
||||||
|
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
||||||
|
{{/each}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -1,67 +1,4 @@
|
|||||||
<div class="tab equipement {{tab.cssClass}}" data-group="sheet" data-tab="equipement">
|
<div class="tab equipement {{tab.cssClass}}" data-group="sheet" data-tab="equipement">
|
||||||
|
|
||||||
{{!-- ── Armes ─────────────────────────────────────────────────────────── --}}
|
|
||||||
<div class="equip-section">
|
|
||||||
<div class="section-header">
|
|
||||||
<i class="fas fa-khanda"></i>
|
|
||||||
<span>{{localize "CELESTOPOL.Item.weapons"}}</span>
|
|
||||||
{{#if isEditMode}}
|
|
||||||
<a data-action="createWeapon" title="{{localize 'CELESTOPOL.Item.newWeapon'}}"><i class="fas fa-plus"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{#each weapons as |item|}}
|
|
||||||
<div class="item-row weapon" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
|
||||||
<img src="{{item.img}}" class="item-icon">
|
|
||||||
<span class="item-name">{{item.name}}</span>
|
|
||||||
<span class="item-tag type">{{#if (eq item.system.type "melee")}}{{localize "CELESTOPOL.Weapon.typeMelee"}}{{else}}{{localize "CELESTOPOL.Weapon.typeDistance"}}{{/if}}</span>
|
|
||||||
<span class="item-tag dmg">{{localize "CELESTOPOL.Weapon.degats"}} {{item.system.degats}}</span>
|
|
||||||
<div class="item-controls">
|
|
||||||
{{#unless ../isEditMode}}
|
|
||||||
<a data-action="attack" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.attack'}}"><i class="fas fa-khanda"></i></a>
|
|
||||||
{{#if (eq item.system.type "distance")}}
|
|
||||||
<a data-action="rangedDefense" data-item-id="{{item.id}}" title="{{localize 'CELESTOPOL.Combat.rangedDefenseTitle'}}"><i class="fas fa-shield-halved"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
{{/unless}}
|
|
||||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
|
||||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{else}}
|
|
||||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noWeapons"}}</p>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{!-- ── Armures ───────────────────────────────────────────────────────── --}}
|
|
||||||
<div class="equip-section">
|
|
||||||
<div class="section-header">
|
|
||||||
<i class="fas fa-shield-halved"></i>
|
|
||||||
<span>{{localize "CELESTOPOL.Item.armures"}}</span>
|
|
||||||
{{#if isEditMode}}
|
|
||||||
<a data-action="createArmure" title="{{localize 'CELESTOPOL.Item.newArmure'}}"><i class="fas fa-plus"></i></a>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
{{#each armures as |item|}}
|
|
||||||
<div class="item-row armure {{#if item.system.equipped}}is-equipped{{/if}}" data-item-id="{{item.id}}" data-item-uuid="{{item.uuid}}" data-drag="true">
|
|
||||||
<img src="{{item.img}}" class="item-icon">
|
|
||||||
<span class="item-name">{{item.name}}</span>
|
|
||||||
<span class="item-tag prot"><i class="fas fa-shield"></i> {{item.system.protection}}</span>
|
|
||||||
{{#if item.system.protection}}<span class="item-tag malus">−{{item.system.protection}} {{localize "CELESTOPOL.Armure.malus"}}</span>{{/if}}
|
|
||||||
<div class="item-controls">
|
|
||||||
<a data-action="toggleArmure" data-item-uuid="{{item.uuid}}"
|
|
||||||
class="equip-toggle {{#if item.system.equipped}}equipped{{/if}}"
|
|
||||||
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}">
|
|
||||||
<i class="fas fa-shield{{#unless item.system.equipped}}-halved{{/unless}}"></i>
|
|
||||||
</a>
|
|
||||||
<a data-action="edit" data-item-uuid="{{item.uuid}}"><i class="fas fa-edit"></i></a>
|
|
||||||
{{#if ../isEditMode}}<a data-action="delete" data-item-uuid="{{item.uuid}}"><i class="fas fa-trash"></i></a>{{/if}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{else}}
|
|
||||||
<p class="equip-empty">{{localize "CELESTOPOL.Item.noArmures"}}</p>
|
|
||||||
{{/each}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{!-- ── Équipements ──────────────────────────────────────────────────── --}}
|
|
||||||
<div class="equip-section">
|
<div class="equip-section">
|
||||||
<div class="section-header">
|
<div class="section-header">
|
||||||
<i class="fas fa-briefcase"></i>
|
<i class="fas fa-briefcase"></i>
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
</span>
|
</span>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
<span class="skill-info">
|
<span class="skill-info">
|
||||||
{{#if statLabel}}<span class="stat-lbl">{{statLabel}}</span><span class="sep"> › </span>{{/if}}
|
{{#if statLabel}}<span class="stat-lbl">{{localize statLabel}}</span><span class="sep"> › </span>{{/if}}
|
||||||
<span class="skill-lbl">{{skillLabel}}</span>
|
<span class="skill-lbl">{{localize skillLabel}}</span>
|
||||||
</span>
|
</span>
|
||||||
{{#if woundLabel}}<span class="wound-info">⚠ {{woundLabel}}</span>{{/if}}
|
{{#if woundLabel}}<span class="wound-info">⚠ {{woundLabel}}</span>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{!-- Résultat du Dé de la Lune (narratif) --}}
|
{{!-- Résultat du Dé de la Lune (narratif + choix de contrepartie) --}}
|
||||||
{{#if hasMoonDie}}
|
{{#if hasMoonDie}}
|
||||||
<div class="moon-die-result {{moonResultClass}}">
|
<div class="moon-die-result {{moonResultClass}}">
|
||||||
<span class="moon-die-face">{{moonFaceSymbol}}</span>
|
<span class="moon-die-face">{{moonFaceSymbol}}</span>
|
||||||
@@ -132,6 +132,27 @@
|
|||||||
<span class="moon-die-desc">{{moonResultDesc}}</span>
|
<span class="moon-die-desc">{{moonResultDesc}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{{#if moonActorIsCharacter}}
|
||||||
|
<div class="moon-effect-actions" data-moon-actor-id="{{moonActorId}}" data-moon-actor-uuid="{{moonActorUuid}}">
|
||||||
|
<span class="moon-effect-label">{{localize "CELESTOPOL.Moon.applyChoose"}}</span>
|
||||||
|
<div class="moon-effect-buttons">
|
||||||
|
{{#if (eq moonResultTypeId "triomphe")}}
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="regain-anomaly">{{localize "CELESTOPOL.Moon.effectRegainAnomaly"}}</button>
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="lose-spleen">{{localize "CELESTOPOL.Moon.effectLoseSpleen"}}</button>
|
||||||
|
{{else if (eq moonResultTypeId "brio")}}
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="gain-destin">{{localize "CELESTOPOL.Moon.effectGainDestin"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{else if (eq moonResultTypeId "contrecoup")}}
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-destin">{{localize "CELESTOPOL.Moon.effectLoseDestin"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{else if (eq moonResultTypeId "catastrophe")}}
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-anomaly">{{localize "CELESTOPOL.Moon.effectLoseAnomaly"}}</button>
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="gain-spleen">{{localize "CELESTOPOL.Moon.effectGainSpleen"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
||||||
{{!-- Bandeau résultat --}}
|
{{!-- Bandeau résultat --}}
|
||||||
@@ -162,7 +183,7 @@
|
|||||||
<span class="result-label">{{localize "CELESTOPOL.Roll.failure"}}</span>
|
<span class="result-label">{{localize "CELESTOPOL.Roll.failure"}}</span>
|
||||||
{{#if isCombat}}
|
{{#if isCombat}}
|
||||||
{{#if (eq weaponType "melee")}}
|
{{#if (eq weaponType "melee")}}
|
||||||
<span class="result-desc">{{localize "CELESTOPOL.Combat.failureHit"}}</span>
|
{{#unless isNpcAttack}}<span class="result-desc">{{localize "CELESTOPOL.Combat.failureHit"}}</span>{{/unless}}
|
||||||
{{else if isRangedDefense}}
|
{{else if isRangedDefense}}
|
||||||
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseFailure"}}</span>
|
<span class="result-desc">{{localize "CELESTOPOL.Combat.rangedDefenseFailure"}}</span>
|
||||||
{{else}}
|
{{else}}
|
||||||
@@ -183,23 +204,23 @@
|
|||||||
{{#if hasVariableDamage}}
|
{{#if hasVariableDamage}}
|
||||||
<div class="damage-note">{{localize "CELESTOPOL.Combat.damageManual"}}</div>
|
<div class="damage-note">{{localize "CELESTOPOL.Combat.damageManual"}}</div>
|
||||||
{{else}}
|
{{else}}
|
||||||
{{#if targetActorId}}
|
{{#if targetActorUuid}}
|
||||||
<div class="damage-breakdown">
|
<div class="damage-breakdown">
|
||||||
<div><strong>{{localize "CELESTOPOL.Combat.targetLabel"}} :</strong> {{targetActorName}}</div>
|
<div><strong>{{localize "CELESTOPOL.Combat.targetLabel"}} :</strong> {{targetActorName}}</div>
|
||||||
<div><strong>{{localize "CELESTOPOL.Combat.damageArmorReduction"}} :</strong> −{{selectedTargetProtection}}</div>
|
<div><strong>{{localize "CELESTOPOL.Combat.damageArmorReduction"}} :</strong> −{{selectedTargetProtection}}</div>
|
||||||
<div><strong>{{localize "CELESTOPOL.Combat.damageApplied"}} :</strong> {{selectedTargetAppliedWounds}}</div>
|
<div><strong>{{localize "CELESTOPOL.Combat.damageApplied"}} :</strong> {{selectedTargetAppliedWounds}}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="weapon-damage-actions">
|
<div class="weapon-damage-actions">
|
||||||
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-actor-id="{{targetActorId}}" data-incoming-wounds="{{incomingWounds}}">
|
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-actor-id="{{targetActorId}}" data-actor-uuid="{{targetActorUuid}}" data-incoming-wounds="{{incomingWounds}}">
|
||||||
{{localize "CELESTOPOL.Combat.applyDamage"}}
|
{{localize "CELESTOPOL.Combat.applyDamage"}}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
{{else if availableTargets.length}}
|
{{else if availableTargets.length}}
|
||||||
<div class="weapon-damage-actions">
|
<div class="weapon-damage-actions">
|
||||||
<select name="targetActorId">
|
<select name="targetActorUuid">
|
||||||
<option value="">{{localize "CELESTOPOL.Combat.targetAuto"}}</option>
|
<option value="">{{localize "CELESTOPOL.Combat.targetAuto"}}</option>
|
||||||
{{#each availableTargets as |target|}}
|
{{#each availableTargets as |target|}}
|
||||||
<option value="{{target.id}}" {{#if target.selected}}selected{{/if}}>{{target.name}}</option>
|
<option value="{{target.uuid}}" data-actor-id="{{target.id}}" {{#if target.selected}}selected{{/if}}>{{target.name}}</option>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</select>
|
</select>
|
||||||
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-incoming-wounds="{{incomingWounds}}">
|
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-incoming-wounds="{{incomingWounds}}">
|
||||||
|
|||||||
@@ -36,4 +36,27 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{{!-- Choix de la contrepartie --}}
|
||||||
|
{{#if moonActorIsCharacter}}
|
||||||
|
<div class="moon-effect-actions" data-moon-actor-id="{{moonActorId}}" data-moon-actor-uuid="{{moonActorUuid}}">
|
||||||
|
<span class="moon-effect-label">{{localize "CELESTOPOL.Moon.applyChoose"}}</span>
|
||||||
|
<div class="moon-effect-buttons">
|
||||||
|
{{#if (eq moonResultTypeId "triomphe")}}
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="regain-anomaly">{{localize "CELESTOPOL.Moon.effectRegainAnomaly"}}</button>
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="lose-spleen">{{localize "CELESTOPOL.Moon.effectLoseSpleen"}}</button>
|
||||||
|
{{else if (eq moonResultTypeId "brio")}}
|
||||||
|
<button type="button" class="moon-effect-btn" data-action="apply-moon-effect" data-effect="gain-destin">{{localize "CELESTOPOL.Moon.effectGainDestin"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{else if (eq moonResultTypeId "contrecoup")}}
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-destin">{{localize "CELESTOPOL.Moon.effectLoseDestin"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{else if (eq moonResultTypeId "catastrophe")}}
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="lose-anomaly">{{localize "CELESTOPOL.Moon.effectLoseAnomaly"}}</button>
|
||||||
|
<button type="button" class="moon-effect-btn moon-effect-negative" data-action="apply-moon-effect" data-effect="gain-spleen">{{localize "CELESTOPOL.Moon.effectGainSpleen"}}</button>
|
||||||
|
<span class="moon-effect-narrative">{{localize "CELESTOPOL.Moon.effectNarrativeOnly"}}</span>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||