7 Commits

Author SHA1 Message Date
63c0153860 FIx v13/v14
Some checks failed
Release Creation / build (release) Failing after 1m17s
2026-04-14 00:56:25 +02:00
8bfbdedf43 Upgrade compat 2026-04-13 17:33:06 +02:00
6d2fca9fc2 Cleanup 2026-04-13 16:34:38 +02:00
b26ce2f114 Diverses corrections autour du combat 2026-04-13 16:23:31 +02:00
8b75a15e3f Diverses corrections autour du combat
Some checks failed
Release Creation / build (release) Failing after 1m5s
2026-04-13 15:55:40 +02:00
d69144f506 Corrections diverses autout du combat 2026-04-13 14:19:24 +02:00
44cc07db73 Portraits et corrections sur valeurs des PNJ
Some checks failed
Release Creation / build (release) Failing after 1m24s
2026-04-12 11:52:17 +02:00
102 changed files with 5908 additions and 463 deletions

View File

@@ -68,4 +68,4 @@ jobs:
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'
compatibility-minimum: '13'
compatibility-verified: '13'
compatibility-verified: '14'

View File

@@ -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
View File

@@ -13,3 +13,4 @@ css/*.css
# Règles (PDFs privés)
__regles/
*.pdf
.github/

View 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": "Lescroc",
"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 lagence 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 quil préfère.</p><p>Cette capacité ne sapplique 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": {}
}

View 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": "Louvrier",
"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 dune trentaine dannées, Elemiah impressionne par son torse large, ses sourcils broussailleux, sa moustache travaillée et labsence de deux doigts à la main gauche.</p>",
"descriptionPsychologique": "<p>Après la mort de son frère Rubben dans un accident industriel, Elemiah sest juré de soutenir les miséreux de Célestopol.</p><p>Taiseux mais profondément solidaire, il sémerveille désormais de larchitecture 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": {}
}

View 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 lallure vive et appliquée de celles qui pensent plus vite quelles ne parlent.</p>",
"descriptionPsychologique": "<p>Mécanicienne brillante et major de promotion de luniversité de Célestopol, Maribel sest spécialisée dans lingé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 dErnest, 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": {}
}

View 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 dabord limage dune femme sérieuse et farouche, toujours parfaitement concentrée.</p>",
"descriptionPsychologique": "<p>Née à Célestopol dans une famille duniversitaires, Nadeja sest 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": {}
}

View 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": "LArtiste 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 lalcool.</p><p>Sauvé par Ernest alors quil é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 à lalcool.</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": {}
}

View 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 dune impasse, Polyphème a été réparé puis intégré à lagence 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 labsence 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": {}
}

View 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 dun esprit très ouvert.</p>",
"descriptionPsychologique": "<p>Ancienne officière des Mino du Dahomey, Sèdami sest illustrée au combat comme en stratégie avant de devenir diplomate.</p><p>Fascinée par Célestopol lors dune 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": {}
}

View 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 dErnest 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": {}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
assets/tokens/bao.webp.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
assets/tokens/elemia.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
assets/tokens/maribel.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
assets/tokens/nadeja.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
assets/tokens/sedami.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

BIN
assets/tokens/wiktoria.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

BIN
debug_aspects_left.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 770 KiB

BIN
debug_attributs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
debug_attributs2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 KiB

BIN
debug_blessures.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 324 KiB

154
extract_pretires.py Normal file
View 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")

View File

@@ -40,6 +40,7 @@ import {
const DAMAGE_APPLICATION_FLAG = "damageApplication"
const FACTION_ASPECT_STATE_SETTING = "factionAspectState"
const PREGENS_IMPORTED_SETTING = "pregensImported"
const WELCOME_SCENE_IMPORTED_SETTING = "welcomeSceneImported"
/* ─── Init hook ──────────────────────────────────────────────────────────── */
@@ -179,7 +180,9 @@ Hooks.once("ready", async () => {
if (game.user.isGM) {
_migrateObsoleteItems()
_migrateIntegerTracks()
_setupAnomaliesFolder()
_migrateBiographyFields()
await _setupAnomaliesFolder()
await _setupPregensFolder()
await _setupWelcomeScene()
}
@@ -271,6 +274,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 ─────────────────────────────────────────────────── */
function _registerHandlebarsHelpers() {
@@ -347,6 +375,12 @@ function _registerSettings() {
type: Boolean,
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, {
scope: "world",
config: false,
@@ -428,6 +462,34 @@ async function _setupWelcomeScene() {
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 ───────────────────────────────────────────────────── */
function _preloadTemplates() {
@@ -510,8 +572,10 @@ async function _onApplyWeaponDamageClick(event, message) {
const button = event.currentTarget
const card = button.closest(".celestopol.chat-roll")
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorId"]')
const actorId = button.dataset.actorId || select?.value || ""
const select = button.closest(".weapon-damage-actions")?.querySelector('select[name="targetActorUuid"]')
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 currentState = _getDamageApplicationState(message)
@@ -520,7 +584,7 @@ async function _onApplyWeaponDamageClick(event, message) {
return
}
if (!actorId) {
if (!actorUuid && !actorId) {
ui.notifications.warn(game.i18n.localize("CELESTOPOL.Combat.selectCharacterFirst"))
return
}
@@ -531,14 +595,15 @@ async function _onApplyWeaponDamageClick(event, message) {
button.disabled = true
await _requestWeaponDamageApplication({
actorId,
actorUuid,
incomingWounds,
chatMessageId: message?.id ?? null,
})
}
async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMessageId = null }) {
async function _requestWeaponDamageApplication({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
if (game.user.isGM) {
return _applyWeaponDamage({ actorId, incomingWounds, chatMessageId })
return _applyWeaponDamage({ actorId, actorUuid, incomingWounds, chatMessageId })
}
if (!game.socket) return
@@ -546,6 +611,7 @@ async function _requestWeaponDamageApplication({ actorId, incomingWounds, chatMe
game.socket.emit(`system.${SYSTEM_ID}`, {
type: "applyWeaponDamage",
actorId,
actorUuid,
incomingWounds,
chatMessageId,
})
@@ -583,7 +649,7 @@ function _setDamageStatus(root, { text, cssClass = "" }) {
function _renderPendingWeaponDamageState(root) {
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) {
button.disabled = true
button.textContent = game.i18n.localize("CELESTOPOL.Combat.damageApplying")
@@ -597,7 +663,7 @@ function _renderPendingWeaponDamageState(root) {
function _renderWeaponDamageState(message, root) {
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)
if (!state?.applied) {
@@ -639,8 +705,8 @@ async function _markChatMessageDamageApplied(chatMessageId, data) {
_updateRenderedChatMessageState(message)
}
async function _applyWeaponDamage({ actorId, incomingWounds, chatMessageId = null }) {
const actor = game.actors.get(actorId)
async function _applyWeaponDamage({ actorId, actorUuid = null, incomingWounds, chatMessageId = null }) {
const actor = await CelestopolRoll.resolveActor({ actorId, actorUuid })
if (!actor) return null
const message = chatMessageId ? game.messages.get(chatMessageId) : null

View File

@@ -20,6 +20,14 @@
"anomaly": "Anomalie",
"descriptionPhysique": "Description physique",
"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 len-tête de la fiche.",
"portraitImageEmpty": "Aucun portrait biographique distinct nest encore renseigné.",
"portraitImageMissing": "Aucun portrait biographique distinct nest disponible pour cette fiche.",
"sendPortraitToChat": "Envoyer dans le tchat",
"portraitChatTitle": "Portrait",
"notes": "Notes",
"metier": "Métier",
"origine": "Origine",
@@ -194,19 +202,23 @@
"Combat": {
"initiative": "Initiative",
"attack": "Attaquer",
"unarmedAttack": "Attaque à main nue",
"baseActions": "Actions de base",
"baseRangedDefense": "Esquive d'attaque à distance",
"rangedAttack": "Attaque à distance",
"corpsPnj": "Corps du PNJ",
"tie": "ÉGALITÉ",
"tieDesc": "Personne n'est blessé",
"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",
"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é)",
"rangedDefenseTag": "Défense à distance",
"rangedDefenseSuccess": "Attaque esquivée — pas de blessure",
"rangedDefenseFailure": "Touché par le PNJ — 1 blessure",
"rangedDefensePlayerWounded": "Blessure infligée par attaque à distance",
"rangedDefenseFailure": "Touché par le PNJ — dégâts de l'arme appliqués",
"rangedDefensePlayerWounded": "Blessures infligées par attaque à distance",
"targetLabel": "Cible",
"targetAuto": "Saisir manuellement",
"targetCharacterLabel": "Personnage visé",
@@ -240,6 +252,7 @@
"competences": "Domaines",
"blessures": "Jauges",
"factions": "Factions",
"combat": "Combat",
"equipement": "Équipement",
"biography": "Biographie",
"description": "Description",
@@ -413,6 +426,10 @@
"helpFallback": "Célestopol 1922 — Aides de jeu",
"bookLinkLabel": "Voir le livre de base sur le site dAntre-Monde Éditions"
},
"Pregens": {
"folderName": "Prétirés",
"imported": "Célestopol 1922 | Prétirés importés dans le dossier Acteurs."
},
"ChatCard": {
"rollFor": "Jet de {skill} ({stat})"
},

View File

@@ -34,11 +34,14 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
dragDrop: [{ dragSelector: '[data-drag="true"], .rollable', dropSelector: null }],
actions: {
editImage: CelestopolActorSheet.#onEditImage,
sendBiographyPortrait: CelestopolActorSheet.#onSendBiographyPortrait,
toggleSheet: CelestopolActorSheet.#onToggleSheet,
edit: CelestopolActorSheet.#onItemEdit,
delete: CelestopolActorSheet.#onItemDelete,
attack: CelestopolActorSheet.#onAttack,
rangedDefense: CelestopolActorSheet.#onRangedDefense,
unarmedAttack: CelestopolActorSheet.#onUnarmedAttack,
baseRangedDefense: CelestopolActorSheet.#onBaseRangedDefense,
trackBox: CelestopolActorSheet.#onTrackBox,
skillLevel: CelestopolActorSheet.#onSkillLevel,
factionLevel: CelestopolActorSheet.#onFactionLevel,
@@ -136,6 +139,35 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
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() {
const modes = this.constructor.SHEET_MODES
this._sheetMode = this.isEditMode ? modes.PLAY : modes.EDIT
@@ -167,6 +199,16 @@ export default class CelestopolActorSheet extends HandlebarsApplicationMixin(fou
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. */
static #onTrackBox(_event, target) {
if (!this.isEditable) return

View File

@@ -42,6 +42,7 @@ export default class CelestopolCharacterSheet extends CelestopolActorSheet {
competences:{ template: "systems/fvtt-celestopol/templates/character-competences.hbs" },
blessures: { template: "systems/fvtt-celestopol/templates/character-blessures.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" },
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" },
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" },
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" },
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
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":
context.tab = context.tabs.biography
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(
doc.system.descriptionPhysique, { relativeTo: this.document })
context.enrichedDescriptionPsychologique = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
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(
doc.system.notes, { relativeTo: this.document })
break
case "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))
break
}

View File

@@ -35,6 +35,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
tabs: { template: "templates/generic/tab-navigation.hbs" },
competences: { template: "systems/fvtt-celestopol/templates/npc-competences.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" },
biographie: { template: "systems/fvtt-celestopol/templates/npc-biographie.hbs" },
}
@@ -45,6 +46,7 @@ export default class CelestopolNPCSheet extends CelestopolActorSheet {
const tabs = {
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" },
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" },
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 }
)
break
case "combat":
context.tab = context.tabs.combat
break
case "equipement":
context.tab = context.tabs.equipement
break
case "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.system.histoire, { relativeTo: this.document }
)

View File

@@ -78,6 +78,22 @@ export class CelestopolRoll extends Roll {
.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.
* @param {object} options
@@ -298,11 +314,14 @@ export class CelestopolRoll extends Roll {
const useFortune = fortuneValue > 0 && (rollContext.useFortune === true || rollContext.useFortune === "true")
const puiserRessources = rollContext.puiserRessources === true || rollContext.puiserRessources === "true"
const rollMoonDie = rollContext.rollMoonDie === true || rollContext.rollMoonDie === "true"
const selectedCombatTargetId = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
const selectedCombatTarget = selectedCombatTargetId
? availableTargets.find(t => t.id === selectedCombatTargetId) ?? null
const selectedCombatTargetRef = typeof rollContext.targetSelect === "string" ? rollContext.targetSelect : ""
const selectedCombatTarget = selectedCombatTargetRef
? availableTargets.find(t => t.uuid === selectedCombatTargetRef || t.id === selectedCombatTargetRef) ?? null
: null
const resolvedWeaponName = (isRangedDefense && selectedCombatTarget?.weaponName) ? selectedCombatTarget.weaponName : weaponName
const resolvedWeaponDegats = (isRangedDefense && selectedCombatTarget?.weaponDegats) ? selectedCombatTarget.weaponDegats : weaponDegats
const targetActorId = selectedCombatTarget?.id || ""
const targetActorUuid = selectedCombatTarget?.uuid || ""
const targetActorName = selectedCombatTarget?.name || ""
// En résistance : forcer puiser=false, lune=false, fortune=false, destin=false
@@ -352,9 +371,10 @@ export class CelestopolRoll extends Roll {
isCombat,
isRangedDefense,
weaponType,
weaponName,
weaponDegats,
weaponName: resolvedWeaponName,
weaponDegats: resolvedWeaponDegats,
targetActorId,
targetActorUuid,
targetActorName,
availableTargets,
rangedMod: effectiveRangedMod,
@@ -363,7 +383,7 @@ export class CelestopolRoll extends Roll {
puiserRessources: effectivePuiser,
nbDice: (!isResistance && useFortune) ? 1 : nbDice,
formula,
rollMode: rollContext.visibility ?? "publicroll",
rollMode: rollContext.visibility ?? "public",
rollMoonDie: effectiveMoon,
moonDieResult,
moonFace,
@@ -375,7 +395,10 @@ export class CelestopolRoll extends Roll {
roll.computeResult()
// 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") {
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
if (nextLvl <= 8) {
@@ -384,16 +407,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 subit les dégâts de l'arme PNJ
if (isCombat && (weaponType === "melee" || isRangedDefense) && actor && roll.options.resultType === "failure") {
const nextLvl = (actor.system.blessures.lvl ?? 0) + 1
if (nextLvl <= 8) {
const incomingWounds = this.getIncomingWounds(resolvedWeaponDegats)
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 })
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
if (actor) {
@@ -506,12 +538,16 @@ export class CelestopolRoll extends Roll {
const incomingWounds = isWeaponHit ? this.constructor.getIncomingWounds(weaponDegats) : null
const hasVariableDamage = isWeaponHit && incomingWounds === null
const targetActorId = this.options.targetActorId ?? ""
const targetActorUuid = this.options.targetActorUuid ?? ""
const targetActorName = this.options.targetActorName ?? ""
const availableTargets = (this.options.availableTargets ?? []).map(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
? this.constructor.getActorArmorProtection(selectedTargetActor)
: null
@@ -569,6 +605,7 @@ export class CelestopolRoll extends Roll {
weaponType: this.options.weaponType ?? null,
isRangedDefense: this.options.isRangedDefense ?? false,
woundTaken: this.options.woundTaken ?? null,
woundTakenCount: this.options.woundTakenCount ?? null,
situationMod: this.options.situationMod ?? 0,
rangedMod: this.options.rangedMod ?? 0,
hasDamageSummary: isWeaponHit,
@@ -577,6 +614,7 @@ export class CelestopolRoll extends Roll {
hasVariableDamage,
canApplyWeaponDamage: incomingWounds !== null,
targetActorId,
targetActorUuid,
targetActorName,
selectedTargetProtection,
selectedTargetAppliedWounds,
@@ -595,14 +633,45 @@ export class CelestopolRoll extends Roll {
}
/** @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 statLocalized = this.options.statLabel
? game.i18n.localize(this.options.statLabel) : ""
const flavor = statLocalized
? `<strong>${statLocalized} ${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
}
/**
@@ -641,7 +710,7 @@ export class CelestopolRoll extends Roll {
content,
speaker,
rolls: [roll],
style: CONST.CHAT_MESSAGE_STYLES?.ROLL ?? 5,
style: CONST.CHAT_MESSAGE_STYLES.OTHER,
})
}
}

View File

@@ -13,6 +13,8 @@
import { SYSTEM } from "../config/system.mjs"
const WEAPON_DAMAGE_PRIORITY = { "0": 0, "1": 1, "2": 2, X: 3 }
export default class CelestopolCharacter extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
@@ -129,6 +131,8 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
// Description & notes
schema.descriptionPhysique = 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 })
// Données biographiques
@@ -216,6 +220,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
return CelestopolRoll.prompt({
actorId: this.parent.id,
actorUuid: this.parent.uuid,
actorName: this.parent.name,
actorImage: this.parent.img,
statId,
@@ -247,6 +252,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
return CelestopolRoll.prompt({
actorId: this.parent.id,
actorUuid: this.parent.uuid,
actorName: this.parent.name,
actorImage: this.parent.img,
statId,
@@ -268,21 +274,47 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
/**
* 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.
* @returns {Array<{id:string, name:string, corps:number}>}
* @param {object} options
* @param {boolean} [options.onlyRanged=false]
* @param {boolean} [options.fallbackToAll=false]
* @returns {Array<{id:string, uuid:string, name:string, corps:number, weaponName?:string, weaponDegats?:string}>}
*/
_getCombatTargets() {
_getCombatTargets({ onlyRanged = false, fallbackToAll = false } = {}) {
const getBestRangedWeapon = actor => {
const rangedWeapons = actor.itemTypes?.weapon?.filter(item => item.system.type === "distance") ?? []
if (!rangedWeapons.length) return null
return rangedWeapons.reduce((best, item) => {
if (!best) return item
const bestPriority = WEAPON_DAMAGE_PRIORITY[best.system.degats] ?? -1
const itemPriority = WEAPON_DAMAGE_PRIORITY[item.system.degats] ?? -1
if (itemPriority !== bestPriority) return itemPriority > bestPriority ? item : best
return item.name.localeCompare(best.name) < 0 ? item : best
}, null)
}
const toEntry = actor => ({
id: actor.id,
uuid: actor.uuid,
name: actor.name,
corps: actor.system.stats?.corps?.res ?? 0,
...(onlyRanged ? (() => {
const weapon = getBestRangedWeapon(actor)
return weapon ? {
weaponName: weapon.name,
weaponDegats: weapon.system.degats,
} : {}
})() : {}),
})
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 => !onlyRanged || getBestRangedWeapon(t.actor))
.map(t => {
const actor = t.actor
return [actor.id, toEntry(actor)]
return [actor.uuid, toEntry(actor)]
})).values()]
if (!targets.length && onlyRanged && fallbackToAll) return this._getCombatTargets()
return targets
}
/**
@@ -302,6 +334,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
return CelestopolRoll.prompt({
actorId: this.parent.id,
actorUuid: this.parent.uuid,
actorName: this.parent.name,
actorImage: this.parent.img,
statId: "corps",
@@ -324,6 +357,40 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
})
}
/**
* Lance une attaque de mêlée à mains nues.
* @returns {Promise<import("../documents/roll.mjs").CelestopolRoll|null>}
*/
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(),
})
}
/**
* Lance un jet de défense contre une attaque à distance (test Mobilité vs Corps PNJ).
* Succès → esquive réussie.
@@ -340,6 +407,7 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
return CelestopolRoll.prompt({
actorId: this.parent.id,
actorUuid: this.parent.uuid,
actorName: this.parent.name,
actorImage: this.parent.img,
statId: "corps",
@@ -361,4 +429,38 @@ export default class CelestopolCharacter extends foundry.abstract.TypeDataModel
availableTargets: this._getCombatTargets(),
})
}
/**
* 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 }),
})
}
}

View File

@@ -34,7 +34,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
// PNJs : 4 domaines uniquement (pas de sous-compétences)
const domainField = (statId) => new fields.SchemaField({
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 }),
})
@@ -51,6 +51,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
schema.histoire = 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 })
return schema
@@ -111,6 +112,7 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
return CelestopolRoll.prompt({
actorId: this.parent.id,
actorUuid: this.parent.uuid,
actorName: this.parent.name,
actorImage: this.parent.img,
statId,
@@ -126,4 +128,95 @@ export default class CelestopolNPC extends foundry.abstract.TypeDataModel {
async rollResistance(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(),
})
}
}

View File

@@ -1 +1 @@
MANIFEST-000022
MANIFEST-000070

View File

@@ -1,8 +1,8 @@
2026/04/11-15:27:57.620400 7ff3bebfd6c0 Recovering log #20
2026/04/11-15:27:57.630743 7ff3bebfd6c0 Delete type=3 #18
2026/04/11-15:27:57.630810 7ff3bebfd6c0 Delete type=0 #20
2026/04/11-15:29:26.022154 7ff3bdbfb6c0 Level-0 table #25: started
2026/04/11-15:29:26.022184 7ff3bdbfb6c0 Level-0 table #25: 0 bytes OK
2026/04/11-15:29:26.028372 7ff3bdbfb6c0 Delete type=0 #23
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/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/14-00:55:24.427256 7f68497ed6c0 Recovering log #68
2026/04/14-00:55:24.442232 7f68497ed6c0 Delete type=3 #66
2026/04/14-00:55:24.442302 7f68497ed6c0 Delete type=0 #68
2026/04/14-00:56:01.490011 7f6833fff6c0 Level-0 table #73: started
2026/04/14-00:56:01.490050 7f6833fff6c0 Level-0 table #73: 0 bytes OK
2026/04/14-00:56:01.496026 7f6833fff6c0 Delete type=0 #71
2026/04/14-00:56:01.502797 7f6833fff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.513341 7f6833fff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/04/11-15:27:20.564248 7f20edbfe6c0 Recovering log #16
2026/04/11-15:27:20.573933 7f20edbfe6c0 Delete type=3 #14
2026/04/11-15:27:20.573986 7f20edbfe6c0 Delete type=0 #16
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)
2026/04/14-00:42:19.979759 7f68497ed6c0 Recovering log #64
2026/04/14-00:42:19.989860 7f68497ed6c0 Delete type=3 #62
2026/04/14-00:42:19.989918 7f68497ed6c0 Delete type=0 #64
2026/04/14-00:50:27.807116 7f6833fff6c0 Level-0 table #69: started
2026/04/14-00:50:27.807197 7f6833fff6c0 Level-0 table #69: 0 bytes OK
2026/04/14-00:50:27.813335 7f6833fff6c0 Delete type=0 #67
2026/04/14-00:50:27.836261 7f6833fff6c0 Manual compaction at level-0 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)
2026/04/14-00:50:27.836305 7f6833fff6c0 Manual compaction at level-1 from '!journal!eNYstmPK0mMmVJYC' @ 72057594037927935 : 1 .. '!journal.pages!eNYstmPK0mMmVJYC.r9h1ggd3G9hiqYJX' @ 0 : 0; will stop at (end)

View File

@@ -1 +1 @@
MANIFEST-000058
MANIFEST-000122

View File

@@ -1,15 +1,15 @@
2026/04/11-15:27:57.608051 7ff3bf3fe6c0 Recovering log #55
2026/04/11-15:27:57.617618 7ff3bf3fe6c0 Delete type=3 #53
2026/04/11-15:27:57.617668 7ff3bf3fe6c0 Delete type=0 #55
2026/04/11-15:29:26.012403 7ff3bdbfb6c0 Level-0 table #61: started
2026/04/11-15:29:26.015819 7ff3bdbfb6c0 Level-0 table #61: 3524 bytes OK
2026/04/11-15:29:26.022024 7ff3bdbfb6c0 Delete type=0 #59
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/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/11-15:29:26.044420 7ff3bdbfb6c0 Compacting 1@1 + 1@2 files
2026/04/11-15:29:26.047715 7ff3bdbfb6c0 Generated table #62@1: 9 keys, 6617 bytes
2026/04/11-15:29:26.047736 7ff3bdbfb6c0 Compacted 1@1 + 1@2 files => 6617 bytes
2026/04/11-15:29:26.054365 7ff3bdbfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/11-15:29:26.054474 7ff3bdbfb6c0 Delete type=2 #57
2026/04/11-15:29:26.054607 7ff3bdbfb6c0 Delete type=2 #61
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/14-00:55:24.391968 7f6848fec6c0 Recovering log #119
2026/04/14-00:55:24.406978 7f6848fec6c0 Delete type=3 #117
2026/04/14-00:55:24.407044 7f6848fec6c0 Delete type=0 #119
2026/04/14-00:56:01.480723 7f6833fff6c0 Level-0 table #125: started
2026/04/14-00:56:01.483872 7f6833fff6c0 Level-0 table #125: 3524 bytes OK
2026/04/14-00:56:01.489828 7f6833fff6c0 Delete type=0 #123
2026/04/14-00:56:01.502786 7f6833fff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.502828 7f6833fff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 105 : 1
2026/04/14-00:56:01.502835 7f6833fff6c0 Compacting 1@1 + 1@2 files
2026/04/14-00:56:01.506551 7f6833fff6c0 Generated table #126@1: 9 keys, 6617 bytes
2026/04/14-00:56:01.506586 7f6833fff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
2026/04/14-00:56:01.512723 7f6833fff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/14-00:56:01.513072 7f6833fff6c0 Delete type=2 #121
2026/04/14-00:56:01.513274 7f6833fff6c0 Delete type=2 #125
2026/04/14-00:56:01.519560 7f6833fff6c0 Manual compaction at level-1 from '!items!null' @ 105 : 1 .. '!items!null' @ 0 : 0; will stop at (end)

View File

@@ -1,15 +1,15 @@
2026/04/11-15:27:20.551914 7f20ee3ff6c0 Recovering log #50
2026/04/11-15:27:20.562310 7f20ee3ff6c0 Delete type=3 #48
2026/04/11-15:27:20.562396 7f20ee3ff6c0 Delete type=0 #50
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)
2026/04/14-00:42:19.950173 7f684a7ef6c0 Recovering log #114
2026/04/14-00:42:19.961639 7f684a7ef6c0 Delete type=3 #112
2026/04/14-00:42:19.961720 7f684a7ef6c0 Delete type=0 #114
2026/04/14-00:50:27.813444 7f6833fff6c0 Level-0 table #120: started
2026/04/14-00:50:27.816594 7f6833fff6c0 Level-0 table #120: 3524 bytes OK
2026/04/14-00:50:27.823812 7f6833fff6c0 Delete type=0 #118
2026/04/14-00:50:27.836273 7f6833fff6c0 Manual compaction at level-0 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at (end)
2026/04/14-00:50:27.836318 7f6833fff6c0 Manual compaction at level-1 from '!items!anomCommMorts001' @ 72057594037927935 : 1 .. '!items!null' @ 0 : 0; will stop at '!items!null' @ 101 : 1
2026/04/14-00:50:27.836325 7f6833fff6c0 Compacting 1@1 + 1@2 files
2026/04/14-00:50:27.839513 7f6833fff6c0 Generated table #121@1: 9 keys, 6617 bytes
2026/04/14-00:50:27.839549 7f6833fff6c0 Compacted 1@1 + 1@2 files => 6617 bytes
2026/04/14-00:50:27.846476 7f6833fff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/14-00:50:27.846640 7f6833fff6c0 Delete type=2 #116
2026/04/14-00:50:27.846851 7f6833fff6c0 Delete type=2 #120
2026/04/14-00:50:27.853500 7f6833fff6c0 Manual compaction at level-1 from '!items!null' @ 101 : 1 .. '!items!null' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1 @@
MANIFEST-000031

View File

View File

@@ -0,0 +1,8 @@
2026/04/14-00:55:24.409141 7f68497ed6c0 Recovering log #29
2026/04/14-00:55:24.424702 7f68497ed6c0 Delete type=3 #27
2026/04/14-00:55:24.424755 7f68497ed6c0 Delete type=0 #29
2026/04/14-00:56:01.473754 7f6833fff6c0 Level-0 table #34: started
2026/04/14-00:56:01.473797 7f6833fff6c0 Level-0 table #34: 0 bytes OK
2026/04/14-00:56:01.480607 7f6833fff6c0 Delete type=0 #32
2026/04/14-00:56:01.502772 7f6833fff6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
2026/04/14-00:56:01.502817 7f6833fff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)

View File

@@ -0,0 +1,8 @@
2026/04/14-00:42:19.965653 7f684a7ef6c0 Recovering log #25
2026/04/14-00:42:19.975753 7f684a7ef6c0 Delete type=3 #23
2026/04/14-00:42:19.975845 7f684a7ef6c0 Delete type=0 #25
2026/04/14-00:50:27.823985 7f6833fff6c0 Level-0 table #30: started
2026/04/14-00:50:27.824016 7f6833fff6c0 Level-0 table #30: 0 bytes OK
2026/04/14-00:50:27.829926 7f6833fff6c0 Delete type=0 #28
2026/04/14-00:50:27.836282 7f6833fff6c0 Manual compaction at level-0 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)
2026/04/14-00:50:27.846965 7f6833fff6c0 Manual compaction at level-1 from '!actors!6RZ6IzJUHm4dB5Ut' @ 72057594037927935 : 1 .. '!folders!MbFQgPdF6Gtbj5AU' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

View File

@@ -1 +1 @@
MANIFEST-000015
MANIFEST-000070

View File

@@ -1,15 +1,8 @@
2026/04/11-15:27:57.633319 7ff3bf3fe6c0 Recovering log #13
2026/04/11-15:27:57.644646 7ff3bf3fe6c0 Delete type=3 #11
2026/04/11-15:27:57.644712 7ff3bf3fe6c0 Delete type=0 #13
2026/04/11-15:29:26.001386 7ff3bdbfb6c0 Level-0 table #18: started
2026/04/11-15:29:26.005135 7ff3bdbfb6c0 Level-0 table #18: 3095 bytes OK
2026/04/11-15:29:26.012219 7ff3bdbfb6c0 Delete type=0 #16
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/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/11-15:29:26.035018 7ff3bdbfb6c0 Compacting 1@1 + 1@2 files
2026/04/11-15:29:26.038199 7ff3bdbfb6c0 Generated table #19@1: 7 keys, 3095 bytes
2026/04/11-15:29:26.038215 7ff3bdbfb6c0 Compacted 1@1 + 1@2 files => 3095 bytes
2026/04/11-15:29:26.044152 7ff3bdbfb6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2026/04/11-15:29:26.044236 7ff3bdbfb6c0 Delete type=2 #10
2026/04/11-15:29:26.044341 7ff3bdbfb6c0 Delete type=2 #18
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/14-00:55:24.444791 7f684a7ef6c0 Recovering log #68
2026/04/14-00:55:24.460229 7f684a7ef6c0 Delete type=3 #66
2026/04/14-00:55:24.460280 7f684a7ef6c0 Delete type=0 #68
2026/04/14-00:56:01.496164 7f6833fff6c0 Level-0 table #73: started
2026/04/14-00:56:01.496194 7f6833fff6c0 Level-0 table #73: 0 bytes OK
2026/04/14-00:56:01.502678 7f6833fff6c0 Delete type=0 #71
2026/04/14-00:56:01.502807 7f6833fff6c0 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/14-00:56:01.513358 7f6833fff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2026/04/11-15:27:20.576678 7f20ecbfc6c0 Recovering log #8
2026/04/11-15:27:20.586717 7f20ecbfc6c0 Delete type=3 #6
2026/04/11-15:27:20.586780 7f20ecbfc6c0 Delete type=0 #8
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)
2026/04/14-00:42:19.992614 7f684a7ef6c0 Recovering log #64
2026/04/14-00:42:20.003193 7f684a7ef6c0 Delete type=3 #62
2026/04/14-00:42:20.003267 7f684a7ef6c0 Delete type=0 #64
2026/04/14-00:50:27.830098 7f6833fff6c0 Level-0 table #69: started
2026/04/14-00:50:27.830137 7f6833fff6c0 Level-0 table #69: 0 bytes OK
2026/04/14-00:50:27.836136 7f6833fff6c0 Delete type=0 #67
2026/04/14-00:50:27.836294 7f6833fff6c0 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/14-00:50:27.846944 7f6833fff6c0 Manual compaction at level-1 from '!scenes!Jr7lGxYk2RETlXRv' @ 72057594037927935 : 1 .. '!scenes.tokens.delta.items!Jr7lGxYk2RETlXRv.6urwC5SVcou6UOAG.CTg4yBE12iMee1RU.BYT1CrA37R3Og0nu' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

654
pretires_extracted.json Normal file
View File

@@ -0,0 +1,654 @@
[
{
"name": "Niels Bielke",
"concept": "LARTISTE 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 cest son ego qui \nse retrouva taillé en pièce. Il sobstina pendant plusieurs années, voyant toutes les portes se fermer \ndevant lui petit à petit. Sombrant dans le mépris de lui-même et lalcool conjointement, Niels \nne connut son salut que grâce à lintervention dErnest, qui sauva littéralement la vie de lartiste \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 à lalcool. Niels porte les stigmates dun \nhomme ayant commis des abus  en particulier un tic nerveux dont il narrive 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 dun test dune Spécialisation dÂme, Niels peut relancer les\n2d8 2 fois au cours dun même scénario, mais doit conserver le\ndernier résultat.",
"narratif": "Niels est en mesure dinfluer sur la prise de décision dune 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 dune impasse.\nLattention du vétéran fut attirée par lêtre artificiel alors quun groupe détudiants sortaient hilares \nde la ruelle sombre. Lautomate avait manifestement été passé à tabac. Après plusieurs semaines \ndurant lesquelles personne nen revendiqua la propriété, Ernest prit sur lui de payer ses réparations.\nMalgré sa remise en état de marche, lautomate semblait ne pas conserver de souvenir de sa « vie » \npassée. Cest ainsi quil entra au service dErnest en tant quassistant-archiviste au sein de lagence \ndu Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, lautomate le plus célèbre de \nla Cité, larchiviste est désormais la propriété dErnest.\nDans les faits, lautomate est un membre à part entière de lagence, 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 dun test dAppréciation, de Merveilleux technologique, de\nTraitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au\ncours dun même scénario, mais doit conserver le dernier résultat.",
"narratif": "Lesprit de Polpyphème quitte son enveloppe corporelle et se déplace\nde 8 mètres par tour pendant 4 tours, dans nimporte quelle direction.\nDe cette manière, lesprit est invisible et peut ignorer tous les obstacles.\nSes sens restent toutefois les mêmes.\nExemples : Polyphème accède aux toits dune maison ou il peut aller\nen repérage dans la pièce voisine. Si un éboulis bloque le passage dun\ntunnel, Polyphème peut voir sur quelle distance et sil 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 \nsillustra 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 locca-\nsion dexaucer son rêve en tant que conseillère du roi Béhanzin au cours dune 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 la 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 dun test dAppréciation, dAttraction, dÉchauffourée ou de\nFaveur, Sèdami peut relancer les 2d8 2 fois au cours dun même\nscénario, mais doit conserver le dernier résultat.",
"narratif": "Sèdami est capable de percevoir les pensées superficielles dun tiers.\nDe cette manière, elle peut comprendre létat émotionnel dune per-\nsonne, voire capter une image ou un mot (à lappréciation du narra-\nteur) dans son esprit, simplement en lobservant.\nExemples : Sèdami suspecte une tentative de meurtre et perçoit un flacon\nde cyanure dans lesprit dun domestique. Malgré un faciès contenu, elle\nsaisit quun 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": "LESCROC",
"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 à sintroduire 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 à loccasion. Cest dans lun de ces \nlieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de lagence 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, dintégrer lagence 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 sinvestit dailleurs 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 dun même\nscénario et choisir de conserver le résultat quil 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 quil 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": "LOUVRIER",
"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 douvriers 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 dune machine emporta Rubben et priva Elemiah de deux \ndoigts de sa main gauche. Depuis, louvrier survivant sest 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 dune \ntrentaine danné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 dailleurs encore plus souvent juste depuis son accident , et reste très apprécié de sa communauté, \nmême sil travaille aujourdhui comme manutentionnaire aux galeries Sabline.\nSubjugué par larchitecture 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 à sen émerveiller. Une manière pour lui \ndexpérimenter ce que son frère ne pourra jamais faire.",
"anomalie": {
"nom": "Tarot divinatoire",
"niveau": 2,
"technique": "Lors dun test dune Spécialisation de Cœur, Elemiah gagne la pos-\nsibilité de relancer les 2d8 2 fois au cours dun 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.\nLinformation reste soumise à interprétation.\nExemples : Elemiah cherche à savoir où sera sa cible le lendemain. Il\nveut connaître lhistoire dun 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 lespace 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 quavec lâge, elle choisit de devenir \npilote daéronef afin de pouvoir caresser lespoir de rejoindre un jour ces destinations chères à son cœur. \nNadeja intégra lacadé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 quelle 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 \ndaé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 lentreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. \nEn réalité, elle ne supporte pas quon lui manque de respect.",
"anomalie": {
"nom": "Télékinésie",
"niveau": 2,
"technique": "Lors dun test dune Spécialisation de Corps, Nadeja peut relancer\nles 2d8 2 fois au cours dun 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 (nimporte quelle\ndirection) pendant 2 tours.\nExemples : Nadeja peut déplacer une cuillère pour la faire tomber\ndune 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 lingénierie de pointe, \nspécialement dans lutilisation 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 à luniversité de Célestopol, dont elle \nest dailleurs sortie major de promotion. Pourtant, personne navait 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 quil soit. Par ailleurs, cest 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 dune Spécialisation dEsprit, Maribel peut relancer\nles 2d8 2 fois au cours dun même scénario, mais doit conserver le\ndernier résultat.",
"narratif": "Maribel entre en contact avec lesprit dun défunt. Elle peut lui\nposer une question fermée (réponse par oui ou non).\nExemples : Maribel interroge la victime dun meurtre. Elle consulte\nlesprit dun 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 aujourdhui prit les armes pour défendre sa patrie en tant que \nconscrite. Blessée à lœil, quelle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort \ndans lestime 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 daller 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 lancienne 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 quelle apprécie tant et durant lesquelles elle se fait fort de collecter nombre dinforma-\ntions utiles à lagence, mêlant ainsi lutile à lagréable.",
"anomalie": {
"nom": "Illusion",
"niveau": 2,
"technique": "Lors dun test de Coercition, dÉchauffourée, dEffacement ou de\nTraque, Wiktoria peut relancer les 2d8 2 fois au cours dun 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 dun chat qui miaule\nou dun 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
View 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 : LARTISTE 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 cest son ego qui \nse retrouva taillé en pièce. Il sobstina pendant plusieurs années, voyant toutes les portes se fermer \ndevant lui petit à petit. Sombrant dans le mépris de lui-même et lalcool conjointement, Niels \nne connut son salut que grâce à lintervention dErnest, qui sauva littéralement la vie de lartiste \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 à lalcool. Niels porte les stigmates dun \nhomme ayant commis des abus  en particulier un tic nerveux dont il narrive 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 dun test dune Spécialisation dÂme, Niels peut relancer les \n2d8 2 fois au cours dun même scénario, mais doit conserver le \ndernier résultat.\nNarratif\nNiels est en mesure dinfluer sur la prise de décision dune 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 dune impasse.\nLattention du vétéran fut attirée par lêtre artificiel alors quun groupe détudiants sortaient hilares \nde la ruelle sombre. Lautomate avait manifestement été passé à tabac. Après plusieurs semaines \ndurant lesquelles personne nen revendiqua la propriété, Ernest prit sur lui de payer ses réparations.\nMalgré sa remise en état de marche, lautomate semblait ne pas conserver de souvenir de sa « vie » \npassée. Cest ainsi quil entra au service dErnest en tant quassistant-archiviste au sein de lagence \ndu Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, lautomate le plus célèbre de \nla Cité, larchiviste est désormais la propriété dErnest.\nDans les faits, lautomate est un membre à part entière de lagence, 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 dun test dAppréciation, de Merveilleux technologique, de \nTraitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au \ncours dun même scénario, mais doit conserver le dernier résultat.\nNarratif\nLesprit de Polpyphème quitte son enveloppe corporelle et se déplace \nde 8 mètres par tour pendant 4 tours, dans nimporte quelle direction. \nDe cette manière, lesprit est invisible et peut ignorer tous les obstacles. \nSes sens restent toutefois les mêmes.\nExemples : Polyphème accède aux toits dune maison ou il peut aller \nen repérage dans la pièce voisine. Si un éboulis bloque le passage dun \ntunnel, Polyphème peut voir sur quelle distance et sil 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 \nsillustra 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 locca-\nsion dexaucer son rêve en tant que conseillère du roi Béhanzin au cours dune 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 la 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 dun test dAppréciation, dAttraction, dÉchauffourée ou de \nFaveur, Sèdami peut relancer les 2d8 2 fois au cours dun même \nscénario, mais doit conserver le dernier résultat.\nNarratif\nSèdami est capable de percevoir les pensées superficielles dun tiers. \nDe cette manière, elle peut comprendre létat émotionnel dune per-\nsonne, voire capter une image ou un mot (à lappréciation du narra-\nteur) dans son esprit, simplement en lobservant.\nExemples : Sèdami suspecte une tentative de meurtre et perçoit un flacon \nde cyanure dans lesprit dun domestique. Malgré un faciès contenu, elle \nsaisit quun 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 : LESCROC\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 à sintroduire 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 à loccasion. Cest dans lun de ces \nlieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de lagence 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, dintégrer lagence 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 sinvestit dailleurs 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 dun même \nscénario et choisir de conserver le résultat quil 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 quil 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 : LOUVRIER\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 douvriers 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 dune machine emporta Rubben et priva Elemiah de deux \ndoigts de sa main gauche. Depuis, louvrier survivant sest 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 dune \ntrentaine danné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 dailleurs encore plus souvent juste depuis son accident , et reste très apprécié de sa communauté, \nmême sil travaille aujourdhui comme manutentionnaire aux galeries Sabline.\nSubjugué par larchitecture 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 à sen émerveiller. Une manière pour lui \ndexpérimenter ce que son frère ne pourra jamais faire.\nANOMALIE\nTarot \ndivinatoire 2\nTechnique\nLors dun test dune Spécialisation de Cœur, Elemiah gagne la pos-\nsibilité de relancer les 2d8 2 fois au cours dun 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. \nLinformation reste soumise à interprétation.\nExemples : Elemiah cherche à savoir où sera sa cible le lendemain. Il \nveut connaître lhistoire dun 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 lespace 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 quavec lâge, elle choisit de devenir \npilote daéronef afin de pouvoir caresser lespoir de rejoindre un jour ces destinations chères à son cœur. \nNadeja intégra lacadé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 quelle 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 \ndaé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 lentreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. \nEn réalité, elle ne supporte pas quon lui manque de respect.\nANOMALIE\nTélékinésie 2\nTechnique\nLors dun test dune Spécialisation de Corps, Nadeja peut relancer \nles 2d8 2 fois au cours dun 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 (nimporte quelle \ndirection) pendant 2 tours.\nExemples : Nadeja peut déplacer une cuillère pour la faire tomber \ndune 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 lingénierie de pointe, \nspécialement dans lutilisation 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 à luniversité de Célestopol, dont elle \nest dailleurs sortie major de promotion. Pourtant, personne navait 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 quil soit. Par ailleurs, cest 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 dune Spécialisation dEsprit, Maribel peut relancer \nles 2d8 2 fois au cours dun même scénario, mais doit conserver le \ndernier résultat.\nNarratif\nMaribel entre en contact avec lesprit dun défunt. Elle peut lui \nposer une question fermée (réponse par oui ou non).\nExemples : Maribel interroge la victime dun meurtre. Elle consulte \nlesprit dun 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\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 aujourdhui prit les armes pour défendre sa patrie en tant que \nconscrite. Blessée à lœil, quelle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort \ndans lestime 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 daller 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 lancienne 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 quelle apprécie tant et durant lesquelles elle se fait fort de collecter nombre dinforma-\ntions utiles à lagence, mêlant ainsi lutile à lagréable.\nANOMALIE\nIllusion 2 \nTechnique\nLors dun test de Coercition, dÉchauffourée, dEffacement ou de \nTraque, Wiktoria peut relancer les 2d8 2 fois au cours dun 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 dun chat qui miaule \nou dun 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\n1\n10 min\nSuperficiel\n1\n10 min\nLéger\n2\n30 min\nModéré\n2\n30 min\nGrave\n3\nUne journée\nDramatique\nLe personnage est \nhors-fiction\nAffable (1)\nGrande (1)\nExpérience militaire (1)\n"
}
}

669
pretires_v3.json Normal file
View File

@@ -0,0 +1,669 @@
{
"Niels Bielke": {
"name": "Niels Bielke",
"concept": "LARTISTE 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 dun test dune Spécialisation dÂme, Niels peut relancer les 2d8 2 fois au cours dun même scénario, mais doit conserver le dernier résultat.",
"narratif": "Niels est en mesure dinfluer sur la prise de décision dune 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 : LARTISTE 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 cest son ego qui se retrouva taillé en pièce. Il sobstina pendant plusieurs années, voyant toutes les portes se fermer devant lui petit à petit. Sombrant dans le mépris de lui-même et lalcool conjointement, Niels ne connut son salut que grâce à lintervention dErnest, qui sauva littéralement la vie de lartiste 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 à lalcool. Niels porte les stigmates dun homme ayant commis des abus en particulier un tic nerveux dont il narrive 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 dun test dAppréciation, de Merveilleux technologique, de Traitement ou de Traque, Polyphème peut relancer les 2d8 2 fois au cours dun même scénario, mais doit conserver le dernier résultat.",
"narratif": "Lesprit de Polpyphème quitte son enveloppe corporelle et se déplace de 8 mètres par tour pendant 4 tours, dans nimporte quelle direction. De cette manière, lesprit est invisible et peut ignorer tous les obstacles. Ses sens restent toutefois les mêmes.",
"exemples": "Polyphème accède aux toits dune maison ou il peut aller en repérage dans la pièce voisine. Si un éboulis bloque le passage dun tunnel, Polyphème peut voir sur quelle distance et sil 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 dune impasse. Lattention du vétéran fut attirée par lêtre artificiel alors quun groupe détudiants sortaient hilares de la ruelle sombre. Lautomate avait manifestement été passé à tabac. Après plusieurs semaines durant lesquelles personne nen revendiqua la propriété, Ernest prit sur lui de payer ses réparations. Malgré sa remise en état de marche, lautomate semblait ne pas conserver de souvenir de sa « vie » passée. Cest ainsi quil entra au service dErnest en tant quassistant-archiviste au sein de lagence du Lys blanc. Baptisé Polyphème, un nom grec en référence à Ajax, lautomate le plus célèbre de la Cité, larchiviste est désormais la propriété dErnest. Dans les faits, lautomate est un membre à part entière de lagence, 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 dun test dAppréciation, dAttraction, dÉchauffourée ou de Faveur, Sèdami peut relancer les 2d8 2 fois au cours dun même scénario, mais doit conserver le dernier résultat.",
"narratif": "Sèdami est capable de percevoir les pensées superficielles dun tiers. De cette manière, elle peut comprendre létat émotionnel dune per- sonne, voire capter une image ou un mot (à lappréciation du narra- teur) dans son esprit, simplement en lobservant.",
"exemples": "Sèdami suspecte une tentative de meurtre et perçoit un flacon de cyanure dans lesprit dun domestique. Malgré un faciès contenu, elle saisit quun 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 sillustra 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 locca- sion dexaucer son rêve en tant que conseillère du roi Béhanzin au cours dune 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 la 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": "LESCROC",
"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 dun même scénario et choisir de conserver le résultat quil 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 quil tourne au coin de la rue.",
"note": null
},
"aspects": [
"Aime le jeu (1)",
"Belle gueule (2)"
],
"background": "BAO WANG : LESCROC 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 à sintroduire 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 à loccasion. Cest dans lun de ces lieux interlopes de la cité que le jeune chinois rencontra Ernest, le directeur de lagence 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, dintégrer lagence 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 sinvestit dailleurs 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": "LOUVRIER",
"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 dun test dune Spécialisation de Cœur, Elemiah gagne la pos- sibilité de relancer les 2d8 2 fois au cours dun 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. Linformation reste soumise à interprétation.",
"exemples": "Elemiah cherche à savoir où sera sa cible le lendemain. Il veut connaître lhistoire dun voisin.",
"note": null
},
"aspects": [
"Digne de confiance (2)",
"Robuste (1)"
],
"background": "ELEMIAH COWEN : LOUVRIER 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 douvriers 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 dune machine emporta Rubben et priva Elemiah de deux doigts de sa main gauche. Depuis, louvrier survivant sest 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 dune trentaine danné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 dailleurs encore plus souvent juste depuis son accident , et reste très apprécié de sa communauté, même sil travaille aujourdhui comme manutentionnaire aux galeries Sabline. Subjugué par larchitecture 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 à sen émerveiller. Une manière pour lui dexpé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 dun test dune Spécialisation de Corps, Nadeja peut relancer les 2d8 2 fois au cours dun 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 (nimporte quelle direction) pendant 2 tours.",
"exemples": "Nadeja peut déplacer une cuillère pour la faire tomber dune 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 lespace 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 quavec lâge, elle choisit de devenir pilote daéronef afin de pouvoir caresser lespoir de rejoindre un jour ces destinations chères à son cœur. Nadeja intégra lacadé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 quelle 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 daé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 lentreprise Columbia. De fait, elle peut paraître sérieuse de prime abord, certains diraient farouche. En réalité, elle ne supporte pas quon 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 dune Spécialisation dEsprit, Maribel peut relancer les 2d8 2 fois au cours dun même scénario, mais doit conserver le dernier résultat.",
"narratif": "Maribel entre en contact avec lesprit dun défunt. Elle peut lui poser une question fermée (réponse par oui ou non).",
"exemples": "Maribel interroge la victime dun meurtre. Elle consulte lesprit dun 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 lingénierie de pointe, spécialement dans lutilisation 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 à luniversité de Célestopol, dont elle est dailleurs sortie major de promotion. Pourtant, personne navait 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 quil soit. Par ailleurs, cest 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 dun test de Coercition, dÉchauffourée, dEffacement ou de Traque, Wiktoria peut relancer les 2d8 2 fois au cours dun 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 dun chat qui miaule ou dun 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 aujourdhui prit les armes pour défendre sa patrie en tant que conscrite. Blessée à lœil, quelle finit par perdre faute de soins adaptés, elle ne trouva pas le réconfort dans lestime 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 daller 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 lancienne 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 quelle apprécie tant et durant lesquelles elle se fait fort de collecter nombre dinforma- tions utiles à lagence, mêlant ainsi lutile à lagréable.",
"description_physique": null,
"description_psychologique": null,
"weapons": [],
"equipment": []
}
}

BIN
renders/aspects-page-12.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-20.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-24.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-28.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/aspects-page-8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/debug_ENTREGENT.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
renders/debug_FORTUNE.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

BIN
renders/debug_REVE.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
renders/debug_VISION.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

BIN
renders/debug_attribut.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

BIN
renders/page-11.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/page-15.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/page-19.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/page-23.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 MiB

BIN
renders/page-27.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
renders/page-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
renders/page-31.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

BIN
renders/page-7.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

791
snapshot-current.txt Normal file
View 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 dambiance" 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 dabord 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 à laide 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 "Noubliez pas dexplorer tous les onglets disponibles dans cette barre latérale, et pour plus dinformations, 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 longlet de chat en cliquant avec le bouton droit de la souris sur licô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 nimporte 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 dinvitation"
uid=8_93 StaticText "."
uid=8_94 StaticText "Si la boîte de dialogue « Liens dinvitation » 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 daide, 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 dinvitation, "
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 longlet de chat en cliquant avec le bouton droit de la souris sur licô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 nimporte 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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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 dAntre-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

View File

@@ -608,6 +608,7 @@
}
// Onglet Équipement
.tab.combat,
.tab.equipement {
.equip-section {
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 {
font-size: 0.85em;
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 {
margin-bottom: 12px;
.section-header { .cel-section-header(); }
.enriched-html { font-size: 0.9em; line-height: 1.6; }
}
}
// ── Section Expérience (onglet Biographie) ──────────────────────────────
.xp-section {

View File

@@ -57,14 +57,14 @@
background-image: url("../assets/ui/fond_cadrille.jpg");
background-blend-mode: soft-light;
background-size: auto;
padding: 10px 12px 10px 10px;
padding: 8px 12px 8px 10px;
gap: 10px;
border-bottom: 3px solid var(--cel-orange);
box-shadow: 0 3px 0 0 rgba(196,154,26,0.25);
.actor-portrait {
width: 84px;
height: 84px;
width: 97px;
height: 97px;
object-fit: cover;
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);

View File

@@ -346,6 +346,7 @@
}
}
.tab.combat,
.tab.equipement {
.equip-section {
margin-bottom: 14px;
@@ -418,6 +419,112 @@
.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 {
margin-top: 8px;
.enriched-html { font-size: 0.9em; line-height: 1.6; }

View File

@@ -977,6 +977,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.05em;
line-height: 1;
}
.portrait-message-title {
font-family: var(--cel-font-title, "CopaseticNF", serif);
color: var(--cel-orange, #e07b00);
font-size: 0.98em;
letter-spacing: 0.05em;
text-transform: uppercase;
}
.portrait-message-body {
padding: 9px 11px 10px;
color: #3f3623;
}
.portrait-message-name {
margin-bottom: 8px;
color: var(--cel-green, #0c4c0c);
font-size: 0.84em;
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 {
width: min(540px, 92vw);
}

View File

@@ -98,6 +98,13 @@
"path": "packs-system/anomalies",
"type": "Item"
},
{
"name": "pretires",
"label": "Célestopol 1922 — Prétirés",
"system": "fvtt-celestopol",
"path": "packs-system/pretires",
"type": "Actor"
},
{
"name": "aides-de-jeu",
"label": "Célestopol 1922 — Aides de jeu",

View File

@@ -1,5 +1,6 @@
<div class="tab biography {{tab.cssClass}}" data-group="sheet" data-tab="biography">
<div class="biography-layout">
<div class="biography-main">
{{!-- Description Physique --}}
<div class="biography-section">
<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}}
</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 --}}
<div class="notes-section">
<div class="section-header">{{localize "CELESTOPOL.Actor.notes"}}</div>
@@ -88,5 +95,28 @@
</table>
</details>
</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>

View 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>

View File

@@ -1,67 +1,4 @@
<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="section-header">
<i class="fas fa-briefcase"></i>

View File

@@ -183,23 +183,23 @@
{{#if hasVariableDamage}}
<div class="damage-note">{{localize "CELESTOPOL.Combat.damageManual"}}</div>
{{else}}
{{#if targetActorId}}
{{#if targetActorUuid}}
<div class="damage-breakdown">
<div><strong>{{localize "CELESTOPOL.Combat.targetLabel"}} :</strong> {{targetActorName}}</div>
<div><strong>{{localize "CELESTOPOL.Combat.damageArmorReduction"}} :</strong> {{selectedTargetProtection}}</div>
<div><strong>{{localize "CELESTOPOL.Combat.damageApplied"}} :</strong> {{selectedTargetAppliedWounds}}</div>
</div>
<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"}}
</button>
</div>
{{else if availableTargets.length}}
<div class="weapon-damage-actions">
<select name="targetActorId">
<select name="targetActorUuid">
<option value="">{{localize "CELESTOPOL.Combat.targetAuto"}}</option>
{{#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}}
</select>
<button type="button" class="damage-apply-button" data-action="apply-weapon-damage" data-incoming-wounds="{{incomingWounds}}">

View File

@@ -1,5 +1,6 @@
<div class="tab biographie {{tab.cssClass}}" data-group="sheet" data-tab="biographie">
<div class="biography-layout">
<div class="biography-main">
{{!-- Faction --}}
<div class="bio-section faction-section">
<div class="section-header">
@@ -44,5 +45,28 @@
</div>
{{formInput systemFields.descriptionPhysique enriched=enrichedDescriptionPhysique value=system.descriptionPhysique name="system.descriptionPhysique" toggled=true}}
</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>

59
templates/npc-combat.hbs Normal file
View File

@@ -0,0 +1,59 @@
<div class="tab combat {{tab.cssClass}}" data-group="sheet" data-tab="combat">
<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}}"
title="{{#if item.system.equipped}}{{localize 'CELESTOPOL.Armure.unequip'}}{{else}}{{localize 'CELESTOPOL.Armure.equip'}}{{/if}}"
class="equip-toggle {{#if item.system.equipped}}equipped{{/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>

View File

@@ -18,7 +18,7 @@
<div class="npc-domain-value-wrap">
{{#if ../isEditMode}}
<input type="number" name="system.stats.{{statId}}.res"
value="{{lookup ../system.stats statId 'res'}}" min="0" max="8" class="domain-value-input">
value="{{lookup ../system.stats statId 'res'}}" min="0" class="domain-value-input">
{{else}}
<div class="npc-domain-roll-btn rollable" data-stat-id="{{statId}}"
title="{{localize 'CELESTOPOL.Roll.clickToRoll'}}">

Some files were not shown because too many files have changed in this diff Show More