Compare commits

..

No commits in common. "master" and "fvtt-ecryme-v11.0.5" have entirely different histories.

94 changed files with 369 additions and 2769 deletions

View File

@ -1,54 +0,0 @@
name: Release Creation
on:
release:
types: [published]
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: echo "💡 The ${{ gitea.repository }} repository will cloned to the runner."
#- uses: actions/checkout@v3
- uses: RouxAntoine/checkout@v3.5.4
with:
ref: 'master'
# get part of the tag after the `v`
- name: Extract tag version number
id: get_version
uses: battila7/get-version-action@v2
# Substitute the Manifest and Download URLs in the module.json
- name: Substitute Manifest and Download Links For Versioned Ones
id: sub_manifest_link_version
uses: microsoft/variable-substitution@v1
with:
files: 'system.json'
env:
version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/public/fvtt-ecryme
manifest: https://www.uberwald.me/gitea/public/fvtt-ecryme/releases/latest/system.json
download: https://www.uberwald.me/gitea/public/fvtt-ecryme/releases/download/${{github.event.release.tag_name}}/fvtt-ecryme.zip
# Create a zip file with all files required by the module to add to the release
- run: |
apt update -y
apt install -y zip
- run: zip -r ./fvtt-ecryme.zip system.json template.json README.md LICENSE.txt fonts/ images/ lang/ modules/ packs/ styles/ templates/ translated/
- name: setup go
uses: https://github.com/actions/setup-go@v4
with:
go-version: '>=1.20.1'
- name: Use Go Action
id: use-go-action
uses: https://gitea.com/actions/release-action@main
with:
files: |-
./fvtt-ecryme.zip
system.json
api_key: '${{secrets.RELEASE_TOKEN_UBERWALD}}'

View File

@ -1,7 +0,0 @@
Copyright 2023 Open Sesame Games
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,43 +1,6 @@
# Ecryme v2 system for FoundryVTT (French RPG, Open Sesam Games, Official)
# Système Foundry pour Ecryme v2 (French RPG, Open Sesam Games, Official)
# Developmement
This is a base game system with functionnal character sheets for the game Ecryme, powered by the Engrenage system.
You can join the kickstarter and obtain the base books here : https://www.kickstarter.com/projects/osg-us/ecryme
# System overview
The game system in Foundry offers the following features :
- PC/NPC sheet
- Skill rolls
- Cephaly rolls (with Anency support)
- Confrontation management, with detailed result in the chat card
- Weapon rolls
- Trait management, with Spleen and Ideal also.
- Compendiums of items for the game
![System Snapshot](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/08/ecryme_snapshot_01.webp "System Snapshot")
# Contributions
- Original code realised by Uberwald (https://www.uberwald.me/)
# English translation
English translation by Conal Longden and Ian McClung
# Copyright mentions
Copyright 2023 Open Sesame Games
All rights reserved
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Ecryme is a game written by Alexandre Clavel and Samuel Metzener, in a universe created by Mathieu gaborit. All of the aforementionned authors retain there moral rights regarding this work in both print and digital formats.
# Requests or Problems
Please report any requests or problems you have at contact@open-sesame.games
Uberwald

View File

@ -1,33 +0,0 @@
v12.0.0
- Support Foundry v11/v12
- Correction sur le niveau de jeu par défaut
v11.0.39
- Modification sur la prise en compte des traits en bonus/malus
- Correction sur les images de l'aide intégrée FR
v11.0.38
- Corrections sur les champs background/notes/equipement libre
- Taduction des répertoires
- Ajout de 2 landing pages
v11.0.36
- Enable deletion specialization
- Custome bonus for specializations
- Specialization direct rolls
v11.0.31
Add profession, fix equipment tab and add missing translation
v11.0.30
Snapshot and more detailed README
v11.0.28
Initial release

View File

@ -1,4 +0,0 @@
[Dolphin]
Timestamp=2024,3,15,11,30,15.103
Version=4
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

View File

@ -1,4 +0,0 @@
[Dolphin]
Timestamp=2024,3,15,11,30,26.235
Version=4
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

Binary file not shown.

Before

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 248 KiB

View File

@ -1,4 +0,0 @@
[Dolphin]
Timestamp=2024,3,15,11,30,19.681
Version=4
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails

View File

@ -1,16 +1,12 @@
{
"TYPES": {
"Actor": {
"pc": "Player Character",
"npc": "Non-Player Character",
"annency": "Annency"
"Personnage": "PC"
},
"Item": {
"trait": "Trait",
"weapon": "Weapon",
"equipment": "Equipment",
"maneuver": "Maneuver",
"specialization": "Specialization"
"Trait": "Trait",
"Weapon": "Weapon",
"Equipment": "Equipment"
}
},
"ECRY": {
@ -18,8 +14,7 @@
"cogs": "Cogs",
"cephaly": "Cephaly",
"boheme": "Boheme",
"amertume": "Amertume",
"gamelevel": "Game level"
"amertume": "Amertume"
},
"chat": {
"formula": "Formula",
@ -33,27 +28,12 @@
"traitbonus": "Bonus trait",
"traitmalus": "Malus trait",
"bonusmalustraits": "Traits Bonus/Malus",
"spectranscend": "Self-Transcend : ",
"confrontselect": "Selected for confrontation",
"sentogm": "Confrontation has been sent to GM"
},
"rule": {
"cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1",
"cephaly-success-4": "Duration : 1 week - Impact : Light - Bonus : 2 - Elegy : 2",
"cephaly-success-6": "Duration : 1 month - Impact : Serious - Bonus : 3 - Elegy : 3",
"cephaly-success-8": "Duration : 1 year - Impact : Major - Bonus : 4 - Elegy : 4",
"cephaly-success-10": "Duration : Permanent - Impact : Dead - Bonus : 5 - Elegy : 5",
"cephaly-failure-2": "Duration : 1 scene - Impact : Superficial - Malus : 1",
"cephaly-failure-4": "Duration : 1 week - Impact : Light - Malus : 2",
"cephaly-failure-6": "Duration : 1 month - Impact : Serious - Malus : 3",
"cephaly-failure-8": "Duration : 1 year - Impact : Major - Malus : 4",
"cephaly-failure-10": "Duration : Permanent - Impact : Death/Madness - Malus : 5"
"spectranscend": "Self-Transcend : "
},
"warn": {
"notenoughdice": "Execution and Preservation must have 2 dices allocated"
},
"ui": {
"equipmentfree": "Equipments (free input)",
"traitType": "Trait type",
"niveauTrait": "Trait level",
"weight": "Weight",
@ -65,7 +45,7 @@
"goldcoin": "Gold coin",
"lige": "Lige",
"hurle": "Howl",
"coin": "Penny",
"coin": "Coin",
"notes": "Notes",
"bio": "Bio",
"bionotes": "Bio&Notes",
@ -143,32 +123,7 @@
"type": "Type",
"applyimpact": "Apply impact",
"applybonus": "Apply bonus",
"bonuspool": "Available bonuses",
"cephaly": "Cephaly",
"elegy": "Elegy",
"entelechy": "Entelechy",
"mekany": "Mekany",
"psyche": "Psyche",
"scoria": "Scoria",
"cephalydifficulty": "Set Cephaly difficulty",
"maneuvers": "Maneuvers",
"annency": "Annency",
"iscollective": "Collective",
"ismultiple": "Multiple",
"description": "Description",
"location": "Location",
"characters": "Characters",
"enhancements": "Enhancements",
"oniricform": "Oniric shape (Boheme)",
"ideals": "Ideals",
"politic": "Political ideal",
"boheme": "Boheme",
"annencybonus": "Annency bonus",
"bornplace": "Born place",
"residence": "Residence",
"origin": "Origin",
"childhood": "Childhood",
"bonus": "Bonus"
"bonuspool": "Available bonuses"
}
}
}

View File

@ -1,16 +1,12 @@
{
"TYPES": {
"Actor":{
"pc": "Personnage Joueur",
"npc": "Personnage Non Joueur",
"annency": "Anence"
"Personnage": "PJ"
},
"Item": {
"trait": "Trait",
"weapon": "Arme",
"equipment": "Equipement",
"maneuver": "Manoeuvre",
"specialization": "Spécialisation"
"Trait": "Trait",
"Weapon": "Arme",
"Equipment": "Equipement"
}
},
"ECRY": {
@ -18,8 +14,7 @@
"cogs": "Engrenages",
"cephaly": "Céphalie",
"boheme": "Bohême",
"amertume": "Amertume",
"gamelevel": "Niveau de jeu"
"amertume": "Amertume"
},
"chat": {
"formula": "Formule",
@ -33,28 +28,12 @@
"traitbonus": "Trait bonus",
"traitmalus": "Trait malus",
"bonusmalustraits": "Bonus/Malus des Traits",
"spectranscend": "Dépassement de soi : ",
"confrontselected": "Confrontation selectionnée",
"sentogm": "La confrontation a été envoyée au MJ"
},
"rule": {
"cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1",
"cephaly-success-4": "Durée : 1 semaine - Impact : Léger - Bonus : 2 - Elegie : 2",
"cephaly-success-6": "Durée : 1 mois - Impact : Grave - Bonus : 3 - Elegie : 3",
"cephaly-success-8": "Durée : 1 année - Impact : Majeur - Bonus : 4 - Elegie : 4",
"cephaly-success-10": "Durée : Permanent - Impact : Mort - Bonus : 5 - Elegie : 5",
"cephaly-failure-2": "Durée : 1 scène - Impact : Superficiel - Malus : 1 - Symptôme non visible et sans gravité - Altération bégigne difficilement repérable",
"cephaly-failure-4": "Durée : 1 semaine - Impact : Léger - Malus : 2 - Symptôme visible non incapacitant - Altération repérable",
"cephaly-failure-6": "Durée : 1 mois - Impact : Grave - Malus : 3 - Symptôme incapacitant - Altération repérable et fâcheuse",
"cephaly-failure-8": "Durée : 1 année - Impact : Majeur - Malus : 4 - Symptôme très incapacitant - Altération dangereuse",
"cephaly-failure-10": "Durée : Permanent - Impact : Mort/Folie - Malus : 5 - Symptôme spectaculaire et repoussant - Altération dangereuse globalement"
"spectranscend": "Dépassement de soi : "
},
"warn": {
"notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun"
},
"ui": {
"equipmentfree": "Equipements (saisie libre)",
"traitType": "Type de trait",
"niveauTrait": "Niveau du trait",
"effect": "Incidence",
@ -144,32 +123,7 @@
"type": "Type",
"applyimpact": "Appliquer l'impact",
"applybonus": "Appliquer le bonus",
"bonuspool": "Bonus disponibles",
"cephaly": "Cephalie",
"elegy": "Elégie",
"entelechy": "Entéléchie",
"mekany": "Mekanë",
"psyche": "Psyché",
"scoria": "Scorie",
"cephalydifficulty": "Difficulté de la Céphalie",
"maneuvers": "Manoeuvres",
"annency": "Anence",
"iscollective": "Collective",
"ismultiple": "Multiple",
"description": "Description",
"location": "Lieu",
"characters": "Personnages",
"enhancements": "Améliorations",
"oniricform": "Forme Onorique (Bohême)",
"ideals": "Idéaux",
"politic": "Idéaux politiques",
"boheme": "Bohême",
"annencybonus": "Bonus d'Anence",
"bornplace": "Lieu de naissance",
"residence": "Résidence",
"origin": "Origine",
"childhood": "Enfance",
"bonus": "Bonus"
"bonuspool": "Bonus disponibles"
}
}
}

View File

@ -11,7 +11,7 @@ export class EcrymeActorSheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "actor"],
template: "systems/fvtt-ecryme/templates/actors/actor-sheet.hbs",
width: 860,
@ -33,7 +33,7 @@ export class EcrymeActorSheet extends ActorSheet {
name: this.actor.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: foundry.utils.duplicate(this.object.system),
system: duplicate(this.object.system),
limited: this.object.limited,
skills: this.actor.prepareSkills(),
traits: this.actor.getRollTraits(),
@ -41,21 +41,15 @@ export class EcrymeActorSheet extends ActorSheet {
ideal: this.actor.getIdeal(),
spleen: this.actor.getSpleen(),
impacts: this.object.getImpacts(),
config: foundry.utils.duplicate(game.system.ecryme.config),
config: duplicate(game.system.ecryme.config),
weapons: this.actor.getWeapons(),
maneuvers: this.actor.getManeuvers(),
impactsMalus: this.actor.getImpactsMalus(),
archetype: foundry.utils.duplicate(this.actor.getArchetype()),
equipments: this.actor.getEquipments(),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),
cephalySkills: this.actor.getCephalySkills(),
subActors: foundry.utils.duplicate(this.actor.getSubActors()),
annency: this.actor.getAnnency(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, { async: true }),
equipementlibre: await TextEditor.enrichHTML(this.object.system.equipmentfree, { async: true }),
archetype: duplicate(this.actor.getArchetype()),
equipements: this.actor.getEquipments(),
subActors: duplicate(this.actor.getSubActors()),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
equipementlibre: await TextEditor.enrichHTML(this.object.system.equipementlibre, { async: true }),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
@ -80,19 +74,10 @@ export class EcrymeActorSheet extends ActorSheet {
if (e.keyCode === 13) return false;
});
html.find('.open-annency').click(ev => {
let actorId = $(ev.currentTarget).data("annency-id")
const actor = game.actors.get(actorId)
actor.sheet.render(true)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let itemId = li.data("item-id")
if (!itemId) {
itemId = $(ev.currentTarget).data("item-id")
}
const item = this.actor.items.get( itemId );
item.sheet.render(true);
});
@ -132,21 +117,11 @@ export class EcrymeActorSheet extends ActorSheet {
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollSkill(categKey, skillKey)
});
html.find('.roll-spec').click((event) => {
let categKey = $(event.currentTarget).data("category-key")
let skillKey = $(event.currentTarget).data("skill-key")
let specId = $(event.currentTarget).data("spec-id")
this.actor.rollSpec(categKey, skillKey, specId)
});
html.find('.roll-skill-confront').click((event) => {
let categKey = $(event.currentTarget).data("category-key")
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollSkillConfront(categKey, skillKey)
});
html.find('.roll-cephaly').click((event) => {
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollCephalySkillConfront(skillKey)
});
html.find('.roll-weapon-confront').click((event) => {
const li = $(event.currentTarget).parents(".item")
let weaponId = li.data("item-id");

View File

@ -29,7 +29,7 @@ export class EcrymeActor extends Actor {
if (data instanceof Array) {
return super.create(data, options);
}
// If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic
// If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic
if (data.items) {
let actor = super.create(data, options);
return actor;
@ -54,18 +54,6 @@ export class EcrymeActor extends Actor {
super._preUpdate(changed, options, user);
}
/* -------------------------------------------- */
async _preCreate(data, options, user) {
await super._preCreate(data, options, user);
// Configure prototype token settings
const prototypeToken = {};
if (this.type === "pc") Object.assign(prototypeToken, {
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
});
this.updateSource({ prototypeToken });
}
/* -------------------------------------------- */
getMoneys() {
let comp = this.items.filter(item => item.type == 'money');
@ -73,39 +61,13 @@ export class EcrymeActor extends Actor {
return comp;
}
getArchetype() {
let comp = foundry.utils.duplicate(this.items.find(item => item.type == 'archetype') || { name: "Pas d'archetype" })
let comp = duplicate(this.items.find(item => item.type == 'archetype') || { name: "Pas d'archetype" })
if (comp?.system) {
comp.tarot = EcrymeUtility.getTarot(comp.system.lametutelaire)
}
return comp;
}
/* -------------------------------------------- */
buildAnnencyActorList() {
let membersFull = {}
for(let id of this.system.base.characters) {
let actor = game.actors.get(id)
membersFull[id] = { name: actor.name, id: actor.id, img: actor.img }
}
return membersFull
}
/* ----------------------- --------------------- */
addAnnencyActor(actorId) {
let members = foundry.utils.duplicate(this.system.base.characters)
members.push(actorId)
this.update({ 'system.base.characters': members })
}
async removeAnnencyActor(actorId) {
let members = this.system.base.characters.filter(id => id != actorId)
this.update({ 'system.base.characters': members })
}
/* -------------------------------------------- */
getAnnency() {
let annency = game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id))
return annency || {}
}
/* -------------------------------------------- */
getConfrontations() {
return this.items.filter(it => it.type == "confrontation")
@ -136,7 +98,7 @@ export class EcrymeActor extends Actor {
}
/* -------------------------------------------- */
prepareSkills() {
let skills = foundry.utils.duplicate(this.system.skills)
let skills = duplicate(this.system.skills)
for (let categKey in skills) {
let category = skills[categKey]
for (let skillKey in category.skilllist) {
@ -147,23 +109,13 @@ export class EcrymeActor extends Actor {
return skills
}
/* -------------------------------------------- */
getCephalySkills() {
let skills = foundry.utils.duplicate(this.system.cephaly.skilllist)
return skills
}
/* -------------------------------------------- */
getImpacts() {
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'impact') || [])
let comp = duplicate(this.items.filter(item => item.type == 'impact') || [])
return comp;
}
/* -------------------------------------------- */
getWeapons() {
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'weapon') || [])
EcrymeUtility.sortArrayObjectsByName(comp)
return comp;
}
getManeuvers() {
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'maneuver') || [])
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || [])
EcrymeUtility.sortArrayObjectsByName(comp)
return comp;
}
@ -171,7 +123,7 @@ export class EcrymeActor extends Actor {
getItemById(id) {
let item = this.items.find(item => item.id == id);
if (item) {
item = foundry.utils.duplicate(item)
item = duplicate(item)
}
return item;
}
@ -201,12 +153,12 @@ export class EcrymeActor extends Actor {
/* ------------------------------------------- */
getEquipments() {
return this.items.filter(item => item.type == 'equipment')
return this.items.filter(item => item.type == 'equipement')
}
/* ------------------------------------------- */
async buildContainerTree() {
let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || [])
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || [])
for (let equip1 of equipments) {
if (equip1.system.iscontainer) {
equip1.system.contents = []
@ -301,13 +253,13 @@ export class EcrymeActor extends Actor {
getSubActors() {
let subActors = [];
for (let id of this.system.subactors) {
subActors.push(foundry.utils.duplicate(game.actors.get(id)))
subActors.push(duplicate(game.actors.get(id)))
}
return subActors;
}
/* -------------------------------------------- */
async addSubActor(subActorId) {
let subActors = foundry.utils.duplicate(this.system.subactors);
let subActors = duplicate(this.system.subactors);
subActors.push(subActorId);
await this.update({ 'system.subactors': subActors });
}
@ -349,7 +301,7 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */
modifyConfrontBonus( modifier ) {
let newBonus = this.system.internals.confrontbonus + modifier
let newBonus = this.system.internals.confrontbonus + bonus
this.update({'system.internals.confrontbonus': newBonus})
}
@ -371,17 +323,16 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */
getCommonRollData() {
//this.system.internals.confrontbonus = 5 // TO BE REMOVED!!!!
this.system.internals.confrontbonus = 5 // TO BE REMOVED!!!!
let rollData = EcrymeUtility.getBasicRollData()
rollData.alias = this.name
rollData.actorImg = this.img
rollData.actorId = this.id
rollData.img = this.img
rollData.isReroll = false
rollData.config = game.system.ecryme.config
rollData.traits = foundry.utils.duplicate(this.getRollTraits())
rollData.spleen = foundry.utils.duplicate(this.getSpleen() || {})
rollData.ideal = foundry.utils.duplicate(this.getIdeal() || {})
rollData.traits = duplicate(this.getRollTraits())
rollData.spleen = duplicate(this.getSpleen() || {})
rollData.ideal = duplicate(this.getIdeal() || {})
rollData.confrontBonus = this.getBonusList()
return rollData
@ -389,30 +340,14 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */
getCommonSkill(categKey, skillKey) {
let skill = this.system.skills[categKey].skilllist[skillKey]
let rollData = this.getCommonRollData()
// Specific NPC case
let skill
if (skillKey == "rawnpc") {
skill = {
name: "ECRY.ui." + categKey,
max: 10,
value: this.system.skills[categKey].pnjvalue,
spec: []
}
} else {
skill = this.system.skills[categKey].skilllist[skillKey]
skill = foundry.utils.duplicate(skill)
skill.spec = this.getSpecializations(skillKey)
}
rollData.skillLevelOptions = [];
for (let i=0; i<=skill.value; i++) {
rollData.skillLevelOptions[i] = `${i}`
}
skill = duplicate(skill)
skill.categKey = categKey
skill.skillKey = skillKey
skill.spec = this.getSpecializations(skillKey)
rollData.skill = skill
rollData.img = skill.img
rollData.impactMalus = this.getImpactMalus(categKey)
@ -428,17 +363,6 @@ export class EcrymeActor extends Actor {
this.startRoll(rollData).catch("Error on startRoll")
}
/* -------------------------------------------- */
rollSpec(categKey, skillKey, specId) {
let rollData = this.getCommonSkill(categKey, skillKey)
let spec = this.items.find(it => it.type == "specialization" && it.id == specId)
rollData.mode = "skill"
rollData.selectedSpecs = [spec.id]
rollData.forcedSpec = foundry.utils.duplicate(spec)
rollData.title = game.i18n.localize(rollData.skill.name)
this.startRoll(rollData).catch("Error on startRoll")
}
/* -------------------------------------------- */
async rollSkillConfront(categKey, skillKey) {
let rollData = this.getCommonSkill(categKey, skillKey)
@ -447,27 +371,6 @@ export class EcrymeActor extends Actor {
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.applyTranscendence = "execution"
rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
console.log("ROLLDATA", rollData)
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
}
/* -------------------------------------------- */
async rollCephalySkillConfront(skillKey) {
let rollData = this.getCommonRollData()
rollData.mode = "cephaly"
rollData.skill = foundry.utils.duplicate(this.system.cephaly.skilllist[skillKey])
rollData.annency = foundry.utils.duplicate(this.getAnnency())
rollData.img = rollData.skill.img
rollData.skill.categKey = "cephaly"
rollData.skill.skillKey = skillKey
rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
rollData.applyTranscendence = "execution"
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
}
@ -482,12 +385,10 @@ export class EcrymeActor extends Actor {
rollData = this.getCommonSkill("physical", "shooting")
}
rollData.mode = "weapon"
rollData.weapon = foundry.utils.duplicate(weapon)
rollData.weapon = duplicate(weapon)
rollData.title = game.i18n.localize("ECRY.ui.confrontation") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
rollData.applyTranscendence = "execution"
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
@ -497,12 +398,12 @@ export class EcrymeActor extends Actor {
rollWeapon(weaponId) {
let weapon = this.items.get(weaponId)
if (weapon) {
weapon = foundry.utils.duplicate(weapon)
weapon = duplicate(weapon)
let rollData = this.getCommonRollData()
if (weapon.system.armetype == "mainsnues" || weapon.system.armetype == "epee") {
rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor((this.getPhysiqueMalus() + this.system.attributs.physique.value + this.system.attributs.habilite.value) / 2) }
} else {
rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite)
rollData.attr = duplicate(this.system.attributs.habilite)
}
rollData.mode = "weapon"
rollData.weapon = weapon

View File

@ -1,143 +0,0 @@
/**
* Extend the basic ActorSheet with some very simple modifications
* @extends {ActorSheet}
*/
import { EcrymeUtility } from "../common/ecryme-utility.js";
/* -------------------------------------------- */
export class EcrymeAnnencySheet extends ActorSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "actor"],
template: "systems/fvtt-ecryme/templates/actors/annency-sheet.hbs",
width: 640,
height: 600,
tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "annency" }],
dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }],
editScore: true
});
}
/* -------------------------------------------- */
async getData() {
let formData = {
title: this.title,
id: this.actor.id,
type: this.actor.type,
img: this.actor.img,
name: this.actor.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: foundry.utils.duplicate(this.object.system),
limited: this.object.limited,
config: foundry.utils.duplicate(game.system.ecryme.config),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),
characters: this.actor.buildAnnencyActorList(),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
isGM: game.user.isGM
}
this.formData = formData;
console.log("Annency : ", formData, this.object);
return formData;
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
html.bind("keydown", function (e) { // Ignore Enter in actores sheet
if (e.keyCode === 13) return false;
});
html.find('.actor-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let actorId = li.data("actor-id")
const actor = game.actors.get(actorId)
actor.sheet.render(true)
})
html.find('.actor-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let actorId = li.data("actor-id")
this.actor.removeAnnencyActor(actorId)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let itemId = li.data("item-id")
const item = this.actor.items.get(itemId);
item.sheet.render(true);
});
// Delete Inventory Item
html.find('.item-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item")
EcrymeUtility.confirmDelete(this, li).catch("Error : No deletion confirmed")
})
html.find('.item-add').click(ev => {
let dataType = $(ev.currentTarget).data("type")
this.actor.createEmbeddedDocuments('Item', [{ name: "NewItem", type: dataType }], { renderSheet: true })
})
html.find('.subactor-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item");
let actorId = li.data("actor-id");
let actor = game.actors.get(actorId);
actor.sheet.render(true);
});
html.find('.subactor-delete').click(ev => {
const li = $(ev.currentTarget).parents(".item");
let actorId = li.data("actor-id");
this.actor.delSubActor(actorId);
});
html.find('.update-field').change(ev => {
const fieldName = $(ev.currentTarget).data("field-name");
let value = Number(ev.currentTarget.value);
this.actor.update({ [`${fieldName}`]: value });
});
}
/* -------------------------------------------- */
async _onDropActor(event, dragData) {
const actor = fromUuidSync(dragData.uuid)
if (actor) {
this.actor.addAnnencyActor(actor.id)
} else {
ui.notifications.warn("Actor not found")
}
super._onDropActor(event)
}
/* -------------------------------------------- */
/** @override */
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - 192;
sheetBody.css("height", bodyHeight);
return position;
}
/* -------------------------------------------- */
/** @override */
_updateObject(event, formData) {
// Update the Actor
return this.object.update(formData);
}
}

View File

@ -43,7 +43,7 @@ export class EcrymeCharacterSummary extends Application {
/* -------------------------------------------- */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
template: "systems/fvtt-ecryme/templates/dialogs/character-summary.hbs",
popOut: true,
resizable: true,

View File

@ -10,14 +10,14 @@ export const ECRYME_CONFIG = {
"melee": "ECRY.ui.melee",
"ranged": "ECRY.ui.ranged"
},
traitLevel: {
"-3":{value: "-3", text: "-3"},
"-2":{value: "-2", text: "-2"},
"-1":{value: "-1", text: "-1"},
"+1":{value: "+1", text: "+1"},
"+2":{value: "+2", text: "+2"},
"+3":{value: "+3", text: "+3"}
},
traitLevel: [
{value: -3, text: "-3"},
{value: -2, text: "-2"},
{value: -1, text: "-1"},
{value: +1, text: "+1"},
{value: +2, text: "+2"},
{value: +3, text: "+3"}
],
impactTypes: {
physical: "ECRY.ui.physical",
mental: "ECRY.ui.mental",
@ -30,7 +30,7 @@ export const ECRYME_CONFIG = {
major: "ECRY.ui.major"
},
difficulty: {
"-1": {difficulty: "ECRY.ui.none", frequency: "ECRY.ui.none", value: "-1"},
"-1": {difficulty: "ECRY.ui.none", frequency: "ECRY.ui.none", value: "-"},
"8": { difficulty: "ECRY.ui.troublesome", frequency: "ECRY.ui.occasional", value: 8 },
"10": { difficulty: "ECRY.ui.difficult", frequency: "ECRY.ui.uncommon", value: 10 },
"12": { difficulty: "ECRY.ui.verydifficult", frequency: "ECRY.ui.rare", value: 12 },
@ -57,19 +57,6 @@ export const ECRYME_CONFIG = {
"lige": {name: "ECRY.ui.lige", value: 100 },
"hurle": {name: "ECRY.ui.hurle", value: 10 },
"coin": {name: "ECRY.ui.coin", value: 1 }
},
transcendanceOptions: {
"execution": "ECRY.ui.execution",
"preservation": "ECRY.ui.preservation"
},
bonusMalusPersoOptions: {
"-3": {value: "-3", label: "-3"},
"-2": {value: "-2", label: "-2"},
"-1": {value: "-1", label: "-1"},
"0": {value: "0", label: "0"},
"+1": {value: "1", label: "+1"},
"+2": {value: "2", label: "+2"},
"+3": {value: "3", label: "+3"}
}
}

View File

@ -5,31 +5,6 @@ import { EcrymeCommands } from "../app/ecryme-commands.js";
const __maxImpacts = { superficial: 4, light: 3, serious: 2, major: 1 }
const __nextImpacts = { superficial: "light", light: "serious", serious: "major", major: "major" }
const __effect2Impact= [ "none", "superficial", "superficial", "light", "light", "serious", "serious", "major", "major" ]
const __cephalySuccess = {
1: "cephaly-success-2",
2: "cephaly-success-2",
3: "cephaly-success-4",
4: "cephaly-success-4",
5: "cephaly-success-6",
6: "cephaly-success-6",
7: "cephaly-success-8",
8: "cephaly-success-8",
9: "cephaly-success-9",
10: "cephaly-success-10"
}
const __cephalyFailure = {
1: "cephaly-failure-2",
2: "cephaly-failure-2",
3: "cephaly-failure-4",
4: "cephaly-failure-4",
5: "cephaly-failure-6",
6: "cephaly-failure-6",
7: "cephaly-failure-8",
8: "cephaly-failure-8",
9: "cephaly-failure-9",
10: "cephaly-failure-10"
}
/* -------------------------------------------- */
export class EcrymeUtility {
@ -81,9 +56,6 @@ export class EcrymeUtility {
accum += block.fn(i);
return accum;
})
Handlebars.registerHelper('isGM', function () {
return game.user.isGM
})
game.settings.register("fvtt-ecryme", "ecryme-game-level", {
name: game.i18n.localize("ECRY.settings.gamelevel"),
@ -97,7 +69,6 @@ export class EcrymeUtility {
"level_b": game.i18n.localize("ECRY.settings.boheme"),
"level_a": game.i18n.localize("ECRY.settings.amertume"),
},
default: "level_a",
restricted: true
})
@ -105,29 +76,13 @@ export class EcrymeUtility {
}
/*-------------------------------------------- */
static hasCephaly() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level != "level_e"
}
/*-------------------------------------------- */
static hasBoheme() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level == "level_b" || level == "level_a"
}
/*-------------------------------------------- */
static hasAmertume() {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level == "level_a"
}
/*-------------------------------------------- */
static buildSkillConfig() {
game.system.ecryme.config.skills = {}
for (let categKey in game.data.template.Actor.templates.core.skills) {
let category = game.data.template.Actor.templates.core.skills[categKey]
for (let skillKey in category.skilllist) {
let skill = foundry.utils.duplicate(category.skilllist[skillKey])
let skill = duplicate(category.skilllist[skillKey])
skill.categKey = categKey // Auto reference the category
game.system.ecryme.config.skills[skillKey] = skill
}
@ -216,38 +171,17 @@ export class EcrymeUtility {
confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation))
}
if ( confront.marginPreservation > 0) {
confront.bonus1 = confront.marginPreservation
confront.bonus1 = -confront.marginPreservation
}
let msg = await this.createChatWithRollMode(this.confrontData1.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-result.hbs`, confront)
})
await msg.setFlag("world", "ecryme-rolldata", confront)
msg.setFlag("world", "ecryme-rolldata", confront)
console.log("Confront result", confront)
this.lastConfront = confront
}
/* -------------------------------------------- */
static async manageCephalyDifficulty(rollData, difficulty) {
rollData.difficulty = Number(difficulty)
if (rollData.executionTotal > difficulty) {
rollData.marginExecution = rollData.executionTotal - difficulty
rollData.cephalySuccess = "ECRY.rule." + __cephalySuccess[(rollData.marginExecution > 10) ? 10 : rollData.marginExecution]
} else {
rollData.marginExecution = -1
}
if (rollData.preservationTotal < difficulty) {
rollData.marginPreservation = difficulty - rollData.preservationTotal
rollData.cephalyFailure = "ECRY.rule." + __cephalyFailure[(rollData.marginPreservation > 10) ? 10 : rollData.marginPreservation]
} else {
rollData.marginPreservation = -1
}
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-cephaly-result.hbs`, rollData)
})
msg.setFlag("world", "ecryme-rolldata", rollData)
console.log("Cephaly result", rollData)
}
/* -------------------------------------------- */
static manageConfrontation(rollData) {
@ -276,7 +210,7 @@ export class EcrymeUtility {
let message = game.messages.get(li.attr("data-message-id"))
let rollData = message.getFlag("world", "rolldata")
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>>> Menu !!!!", rollData)
if (rollData.skill && rollData.skill.value >= i && !rollData.transcendUsed && rollData.spec) {
if (rollData.skill && i <= rollData.skill.value && !rollData.transcendUsed && rollData.spec) {
return true
}
return false
@ -301,16 +235,8 @@ export class EcrymeUtility {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata")
ui.notifications.info( game.i18n.localize("ECRY.chat.confrontselect"))
EcrymeUtility.manageConfrontation(rollData)
})
html.on("click", '.button-apply-cephaly-difficulty', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata")
let difficulty = $("#" + rollData.rollId + "-cephaly-difficulty").val()
EcrymeUtility.manageCephalyDifficulty(rollData, difficulty)
})
html.on("click", '.button-apply-impact', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
@ -323,6 +249,10 @@ export class EcrymeUtility {
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
actor.modifyConfrontBonus( $(event.currentTarget).data("bonus") )
})
html.on("click", '.draw-tarot-card', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
this.drawDeckCard(messageId)
})
}
@ -405,21 +335,16 @@ export class EcrymeUtility {
let id = rollData.rollId
let oldRollData = this.rollDataStore[id] || {}
let newRollData = foundry.utils.mergeObject(oldRollData, rollData)
let newRollData = mergeObject(oldRollData, rollData)
this.rollDataStore[id] = newRollData
}
/* -------------------------------------------- */
static async onSocketMesssage(msg) {
console.log("SOCKET MESSAGE", msg)
if (msg.name == "msg_gm_chat_message") {
let rollData = msg.data.rollData
if ( game.user.isGM ) {
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
content: await renderTemplate(msg.data.template, rollData),
whisper: game.user.id
})
chatMsg.setFlag("world", "ecryme-rolldata", rollData)
console.log("SOCKET MESSAGE", msg.name)
if (msg.name == "msg-draw-card") {
if (game.user.isGM && game.system.ecryme.currentTirage) {
game.system.ecryme.currentTirage.addCard(msg.data.msgId)
}
}
}
@ -499,7 +424,7 @@ export class EcrymeUtility {
rollData.margin = rollData.total - rollData.difficulty
if (rollData.total > rollData.difficulty) {
rollData.isSuccess = true
let maxMargin = rollData.skill.value + ((rollData.spec) ? 2 : 0)
let maxMargin = rollData.skill.value + (rollData.spec) ? 2 : 0
rollData.margin = Math.min(rollData.margin, maxMargin)
}
}
@ -523,7 +448,7 @@ export class EcrymeUtility {
}
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0])
diceFormula += "+" + (String(rollData.spec.system?.bonus) || "2")
diceFormula += "+2"
}
rollData.bonusMalusTraits = 0
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
@ -532,7 +457,7 @@ export class EcrymeUtility {
let trait = actor.getTrait(id)
console.log(trait, id)
rollData.traitsBonusList.push(trait)
rollData.bonusMalusTraits += Math.abs(trait.system.level)
rollData.bonusMalusTraits += trait.system.level
}
}
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
@ -540,15 +465,12 @@ export class EcrymeUtility {
for (let id of rollData.traitsMalus) {
let trait = actor.getTrait(id)
rollData.traitsMalusList.push(trait)
rollData.bonusMalusTraits -= Math.abs(trait.system.level)
rollData.bonusMalusTraits -= trait.system.level
}
}
diceFormula += "+" + rollData.bonusMalusTraits
diceFormula += "+" + rollData.bonusMalusPerso
diceFormula += "+" + rollData.impactMalus
if (rollData.annency) {
diceFormula += "+" + rollData.annencyBonus
}
rollData.diceFormula = diceFormula
return diceFormula
}
@ -558,7 +480,7 @@ export class EcrymeUtility {
let actor = game.actors.get(rollData.actorId)
// Fix difficulty
if (!rollData.difficulty || rollData.difficulty == "-1") {
if (!rollData.difficulty || rollData.difficulty == "-") {
rollData.difficulty = 0
}
rollData.difficulty = Number(rollData.difficulty)
@ -566,9 +488,9 @@ export class EcrymeUtility {
let diceFormula = this.computeRollFormula(rollData, actor)
// Performs roll
let myRoll = await new Roll(diceFormula).roll()
let myRoll = new Roll(diceFormula).roll({ async: false })
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.roll = duplicate(myRoll)
rollData.total = myRoll.total
rollData.diceSum = myRoll.terms[0].total
@ -577,7 +499,7 @@ export class EcrymeUtility {
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
})
await msg.setFlag("world", "ecryme-rolldata", rollData)
msg.setFlag("world", "ecryme-rolldata", rollData)
console.log("Rolldata result", rollData)
}
@ -594,7 +516,7 @@ export class EcrymeUtility {
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
})
await msg.setFlag("world", "ecryme-rolldata", rollData)
msg.setFlag("world", "ecryme-rolldata", rollData)
}
/* -------------------------------------------- */
@ -638,10 +560,12 @@ export class EcrymeUtility {
}
/* -------------------------------------------- */
static blindMessageToGM(chatData) {
chatData.whisper = this.getUsers(user => user.isGM);
console.log("blindMessageToGM", chatData);
game.socket.emit("system.fvtt-ecryme", { name: "msg_gm_chat_message", data: chatData });
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
game.socket.emit("system.fvtt-ecryme", { msg: "msg_gm_chat_message", data: chatGM });
}
@ -667,8 +591,12 @@ export class EcrymeUtility {
switch (rollMode) {
case "blindroll": // GM only
if (!game.user.isGM) {
this.blindMessageToGM(chatOptions);
chatOptions.whisper = [game.user.id];
} else {
chatOptions.content = "Message only to the GM";
}
else {
chatOptions.whisper = this.getUsers(user => user.isGM);
}
break;
@ -683,20 +611,19 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static getBasicRollData() {
let rollData = {
rollId: foundry.utils.randomID(16),
rollId: randomID(16),
type: "roll-data",
bonusMalusPerso: "0",
bonusMalusPerso: 0,
bonusMalusSituation: 0,
bonusMalusDef: 0,
annencyBonus: 0,
bonusMalusPortee: 0,
skillTranscendence: 0,
rollMode: game.settings.get("core", "rollMode"),
difficulty: "-1",
difficulty: "-",
useSpleen: false,
useIdeal: false,
impactMalus: 0,
config: foundry.utils.duplicate(game.system.ecryme.config)
config: duplicate(game.system.ecryme.config)
}
EcrymeUtility.updateWithTarget(rollData)
return rollData

View File

@ -6,7 +6,7 @@ export class EcrymeConfrontDialog extends Dialog {
/* -------------------------------------------- */
static async create(actor, rollData) {
let options = foundry.utils.mergeObject(super.defaultOptions, {
let options = mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme ecryme-confrontation-dialog"],
dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }],
width: 620, height: 'fit-content', 'z-index': 99999
@ -50,30 +50,10 @@ export class EcrymeConfrontDialog extends Dialog {
let msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData)
})
EcrymeUtility.blindMessageToGM( { rollData: this.rollData, template: "systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs" })
console.log("MSG", this.rollData)
msg.setFlag("world", "ecryme-rolldata", this.rollData)
}
/* -------------------------------------------- */
async refreshDice() {
this.rollData.filter = "execution"
let content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-execution").html(content)
this.rollData.filter = "preservation"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
content += await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-preservation").html(content)
this.rollData.filter = "mainpool"
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs", this.rollData )
$("#confront-dice-pool").html(content)
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-bonus-pool").html(content)
}
/* -------------------------------------------- */
async refreshDialog() {
const content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs", this.rollData)
@ -84,19 +64,8 @@ export class EcrymeConfrontDialog extends Dialog {
setTimeout(function () { $(".launchConfront").attr("disabled", button) }, 180)
}
/* ------------------ -------------------------- */
_canDragStart(selector) {
console.log("CAN DRAG START", selector, super._canDragStart(selector) )
return true
}
_canDragDrop(selector) {
console.log("CAN DRAG DROP", selector, super._canDragDrop(selector) )
return true
}
/* ------------------ -------------------------- */
_onDragStart(event) {
console.log("DRAGSTART::::", event)
super._onDragStart(event)
let dragType = $(event.srcElement).data("drag-type")
let diceData = {}
@ -123,7 +92,7 @@ export class EcrymeConfrontDialog extends Dialog {
let data = JSON.parse(dataJSON)
if ( data.dragType == "dice") {
let idx = Number(data.diceIndex)
console.log("DATA", data, event, event.srcElement.className)
//console.log("DATA", data, event, event.srcElement.className)
if (event.srcElement.className.includes("execution") &&
this.rollData.availableDices.filter(d => d.location == "execution").length < 2) {
this.rollData.availableDices[idx].location = "execution"
@ -163,9 +132,9 @@ export class EcrymeConfrontDialog extends Dialog {
// Apply Transcend if needed
if (this.rollData.skillTranscendence > 0) {
if (this.rollData.applyTranscendence == "execution") {
this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
this.rollData.executionTotal += this.rollData.skillTranscendence
} else {
this.rollData.preservationTotal += Number(this.rollData.skillTranscendence)
this.rollData.preservationTotal += this.rollData.skillTranscendence
}
}
}
@ -188,45 +157,43 @@ export class EcrymeConfrontDialog extends Dialog {
rollData.preservationTotal = rollData.confrontBonus.filter(d => d.location == "preservation").reduce((previous, current) => {
return previous + 1
}, rollData.preservationTotal)
this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.specApplied = true
rollData.executionTotal += 2
rollData.preservationTotal += 2
}
if ( rollData.specApplied && rollData.selectedSpecs.length == 0) {
rollData.spec = undefined
rollData.specApplied = false
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
this.rollData.executionTotal += "+2"
this.rollData.preservationTotal += "+2"
}
rollData.bonusMalusTraits = 0
for (let t of rollData.traitsBonus) {
t.activated = false
for (let t of rollData.traits) {
t.isBonus = false
t.isMalus = false
}
for (let t of rollData.traitsMalus) {
t.activated = false
}
if (rollData.traitsBonusSelected && rollData.traitsBonusSelected.length > 0) {
for (let id of rollData.traitsBonusSelected) {
let trait = rollData.traitsBonus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits += Number(trait.system.level)
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
rollData.traitsBonusList = []
for (let id of rollData.traitsBonus) {
let trait = rollData.traits.find(t => t._id == id)
trait.isBonus = true
rollData.traitsBonusList.push(trait)
rollData.bonusMalusTraits += trait.system.level
}
}
if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) {
for (let id of rollData.traitsMalusSelected) {
let trait = rollData.traitsMalus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits -= Number(trait.system.level)
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
rollData.traitsMalusList = []
for (let id of rollData.traitsMalus) {
let trait = rollData.traits.find(t => t._id == id)
trait.isMalus = true
rollData.traitsMalusList.push(trait)
rollData.bonusMalusTraits -= trait.system.level
}
}
rollData.executionTotal += rollData.bonusMalusTraits
rollData.executionTotal += rollData.bonusMalusPerso
rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.preservationTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.preservationTotal += rollData.bonusMalusTraits
rollData.preservationTotal += rollData.bonusMalusPerso
this.refreshDialog()
this.refreshDialog().catch("Error on refresh confrontation dialog")
}
/* -------------------------------------------- */
@ -234,7 +201,7 @@ export class EcrymeConfrontDialog extends Dialog {
super.activateListeners(html);
html.find('#bonusMalusPerso').change((event) => {
this.rollData.bonusMalusPerso = event.currentTarget.value
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
this.computeTotals()
})
html.find('#roll-specialization').change((event) => {
@ -242,11 +209,11 @@ export class EcrymeConfrontDialog extends Dialog {
this.computeTotals()
})
html.find('#roll-trait-bonus').change((event) => {
this.rollData.traitsBonusSelected = $('#roll-trait-bonus').val()
this.rollData.traitsBonus = $('#roll-trait-bonus').val()
this.computeTotals()
})
html.find('#roll-trait-malus').change((event) => {
this.rollData.traitsMalusSelected = $('#roll-trait-malus').val()
this.rollData.traitsMalus = $('#roll-trait-malus').val()
this.computeTotals()
})
html.find('#roll-select-transcendence').change((event) => {
@ -257,9 +224,7 @@ export class EcrymeConfrontDialog extends Dialog {
this.rollData.applyTranscendence = $('#roll-apply-transcendence').val()
this.computeTotals()
})
html.find('#annency-bonus').change((event) => {
this.rollData.annencyBonus = Number(event.currentTarget.value)
})
}
}

View File

@ -50,15 +50,15 @@ export class EcrymeConfrontStartDialog extends Dialog {
/* -------------------------------------------- */
async rollConfront( diceFormula ) {
// Do the initial roll
let myRoll = await new Roll(diceFormula).roll()
let myRoll = new Roll(diceFormula).roll({async: false})
await EcrymeUtility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
// Fill the available dice table
let rollData = this.rollData
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.roll = duplicate(myRoll)
rollData.availableDices = []
for (let result of myRoll.terms[0].results) {
if ( !result.discarded) {
let resultDup = foundry.utils.duplicate(result)
let resultDup = duplicate(result)
resultDup.location = "mainpool"
rollData.availableDices.push(resultDup)
}

View File

@ -58,7 +58,6 @@ export class EcrymeRollDialog extends Dialog {
$(function () { onLoad(); });
html.find('#bonusMalusPerso').change((event) => {
console.log("DIFF", event.currentTarget.value)
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
})
html.find('#roll-difficulty').change((event) => {

View File

@ -11,7 +11,6 @@
import { EcrymeActor } from "./actors/ecryme-actor.js";
import { EcrymeItemSheet } from "./items/ecryme-item-sheet.js";
import { EcrymeActorSheet } from "./actors/ecryme-actor-sheet.js";
import { EcrymeAnnencySheet } from "./actors/ecryme-annency-sheet.js";
import { EcrymeUtility } from "./common/ecryme-utility.js";
import { EcrymeCombat } from "./app/ecryme-combat.js";
import { EcrymeItem } from "./items/ecryme-item.js";
@ -59,16 +58,13 @@ Hooks.once("init", async function () {
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["pc"], makeDefault: true });
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["npc"], makeDefault: true });
Actors.registerSheet("fvtt-ecryme", EcrymeAnnencySheet, { types: ["annency"], makeDefault: false });
//Actors.registerSheet("fvtt-ecryme", EcrymeNPCSheet, { types: ["pnj"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-ecryme", EcrymeItemSheet, { makeDefault: true });
EcrymeUtility.init()
Babele.get().setSystemTranslationsDir("translated")
});
/* -------------------------------------------- */
@ -83,13 +79,28 @@ function welcomeMessage() {
}
/* -------------------------------------------- */
async function importDefaultScene() {
let exists = game.scenes.find(j => j.name == "Landing page 1");
if (!exists) {
const scenes = await EcrymeUtility.loadCompendium("fvtt-ecryme.scenes")
let newDocuments = scenes.filter(i => i.name == "Landing page 1");
await game.scenes.documentClass.create(newDocuments);
game.scenes.find(i => i.name == "Landing page 1").activate();
// Register world usage statistics
function registerUsageCount(registerKey) {
if (game.user.isGM) {
game.settings.register(registerKey, "world-key", {
name: "Unique world key",
scope: "world",
config: false,
default: "",
type: String
});
let worldKey = game.settings.get(registerKey, "world-key")
if (worldKey == undefined || worldKey == "") {
worldKey = randomID(32)
game.settings.set(registerKey, "world-key", worldKey)
}
// Simple API counter
let regURL = `https://www.uberwald.me/fvtt_appcount/count.php?name="${registerKey}"&worldKey="${worldKey}"&version="${game.release.generation}.${game.release.build}"&system="${game.system.id}"&systemversion="${game.system.version}"`
//$.ajaxSetup({
//headers: { 'Access-Control-Allow-Origin': '*' }
//})
$.ajax(regURL)
}
}
@ -98,9 +109,6 @@ async function importDefaultScene() {
/* -------------------------------------------- */
Hooks.once("ready", function () {
// Load trranslations
Babele.get().setSystemTranslationsDir("translated")
// User warning
if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
@ -110,17 +118,10 @@ Hooks.once("ready", function () {
});
}
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err =>
console.log("No stats available, giving up.")
)
registerUsageCount(game.system.id)
welcomeMessage();
EcrymeUtility.ready();
EcrymeCharacterSummary.ready();
importDefaultScene();
EcrymeUtility.ready()
EcrymeCharacterSummary.ready()
})

View File

@ -8,7 +8,7 @@ export class EcrymeItemSheet extends ItemSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
return mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "item"],
template: "systems/fvtt-ecryme/templates/item-sheet.hbs",
dragDrop: [{ dragSelector: null, dropSelector: null }],
@ -56,8 +56,8 @@ export class EcrymeItemSheet extends ItemSheet {
name: this.object.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: foundry.utils.duplicate(this.object.system),
config: foundry.utils.duplicate(game.system.ecryme.config),
system: duplicate(this.object.system),
config: duplicate(game.system.ecryme.config),
limited: this.object.limited,
options: this.options,
owner: this.document.isOwner,
@ -89,7 +89,7 @@ export class EcrymeItemSheet extends ItemSheet {
/* -------------------------------------------- */
postItem() {
let chatData = foundry.utils.duplicate(this.item)
let chatData = duplicate(this.item)
if (this.actor) {
chatData.actor = { id: this.actor.id };
}

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000184

View File

View File

@ -1,7 +0,0 @@
2025/03/11-23:44:54.691022 7f24c57fa6c0 Recovering log #182
2025/03/11-23:44:54.761305 7f24c57fa6c0 Delete type=3 #180
2025/03/11-23:44:54.761368 7f24c57fa6c0 Delete type=0 #182
2025/03/11-23:45:54.472551 7f24c4bff6c0 Level-0 table #187: started
2025/03/11-23:45:54.472575 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2025/03/11-23:45:54.479092 7f24c4bff6c0 Delete type=0 #185
2025/03/11-23:45:54.491718 7f24c4bff6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +0,0 @@
2025/03/11-23:33:32.501703 7f24c5ffb6c0 Recovering log #178
2025/03/11-23:33:32.511734 7f24c5ffb6c0 Delete type=3 #176
2025/03/11-23:33:32.511785 7f24c5ffb6c0 Delete type=0 #178
2025/03/11-23:44:47.591299 7f24c4bff6c0 Level-0 table #183: started
2025/03/11-23:44:47.591363 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2025/03/11-23:44:47.624590 7f24c4bff6c0 Delete type=0 #181
2025/03/11-23:44:47.748676 7f24c4bff6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

View File

@ -1 +0,0 @@
MANIFEST-000121

View File

View File

@ -1,8 +0,0 @@
2025/03/11-23:44:54.948819 7f24c67fc6c0 Recovering log #119
2025/03/11-23:44:55.014909 7f24c67fc6c0 Delete type=3 #117
2025/03/11-23:44:55.015006 7f24c67fc6c0 Delete type=0 #119
2025/03/11-23:45:54.515413 7f24c4bff6c0 Level-0 table #124: started
2025/03/11-23:45:54.515443 7f24c4bff6c0 Level-0 table #124: 0 bytes OK
2025/03/11-23:45:54.522097 7f24c4bff6c0 Delete type=0 #122
2025/03/11-23:45:54.522287 7f24c4bff6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2025/03/11-23:45:54.522303 7f24c4bff6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2025/03/11-23:33:32.552584 7f24c6ffd6c0 Recovering log #115
2025/03/11-23:33:32.563351 7f24c6ffd6c0 Delete type=3 #113
2025/03/11-23:33:32.563398 7f24c6ffd6c0 Delete type=0 #115
2025/03/11-23:44:47.842166 7f24c4bff6c0 Level-0 table #120: started
2025/03/11-23:44:47.842227 7f24c4bff6c0 Level-0 table #120: 0 bytes OK
2025/03/11-23:44:47.879285 7f24c4bff6c0 Delete type=0 #118
2025/03/11-23:44:47.922462 7f24c4bff6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2025/03/11-23:44:47.974424 7f24c4bff6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000184

View File

View File

@ -1,7 +0,0 @@
2025/03/11-23:44:54.883993 7f24c5ffb6c0 Recovering log #182
2025/03/11-23:44:54.946077 7f24c5ffb6c0 Delete type=3 #180
2025/03/11-23:44:54.946154 7f24c5ffb6c0 Delete type=0 #182
2025/03/11-23:45:54.498184 7f24c4bff6c0 Level-0 table #187: started
2025/03/11-23:45:54.498223 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2025/03/11-23:45:54.505537 7f24c4bff6c0 Delete type=0 #185
2025/03/11-23:45:54.522269 7f24c4bff6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

View File

@ -1,7 +0,0 @@
2025/03/11-23:33:32.540154 7f24c67fc6c0 Recovering log #178
2025/03/11-23:33:32.549680 7f24c67fc6c0 Delete type=3 #176
2025/03/11-23:33:32.549720 7f24c67fc6c0 Delete type=0 #178
2025/03/11-23:44:47.624705 7f24c4bff6c0 Level-0 table #183: started
2025/03/11-23:44:47.624728 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2025/03/11-23:44:47.667991 7f24c4bff6c0 Delete type=0 #181
2025/03/11-23:44:47.748692 7f24c4bff6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000068

View File

View File

@ -1,8 +0,0 @@
2025/03/11-23:44:54.826302 7f24c67fc6c0 Recovering log #66
2025/03/11-23:44:54.878873 7f24c67fc6c0 Delete type=3 #64
2025/03/11-23:44:54.879033 7f24c67fc6c0 Delete type=0 #66
2025/03/11-23:45:54.479218 7f24c4bff6c0 Level-0 table #71: started
2025/03/11-23:45:54.479246 7f24c4bff6c0 Level-0 table #71: 0 bytes OK
2025/03/11-23:45:54.485312 7f24c4bff6c0 Delete type=0 #69
2025/03/11-23:45:54.491727 7f24c4bff6c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2025/03/11-23:45:54.491756 7f24c4bff6c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)

View File

@ -1,8 +0,0 @@
2025/03/11-23:33:32.527497 7f24c6ffd6c0 Recovering log #62
2025/03/11-23:33:32.537450 7f24c6ffd6c0 Delete type=3 #60
2025/03/11-23:33:32.537513 7f24c6ffd6c0 Delete type=0 #62
2025/03/11-23:44:47.879398 7f24c4bff6c0 Level-0 table #67: started
2025/03/11-23:44:47.879423 7f24c4bff6c0 Level-0 table #67: 0 bytes OK
2025/03/11-23:44:47.922234 7f24c4bff6c0 Delete type=0 #65
2025/03/11-23:44:47.922483 7f24c4bff6c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2025/03/11-23:44:47.974443 7f24c4bff6c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000184

View File

@ -1,7 +0,0 @@
2025/03/11-23:44:54.615643 7f24c6ffd6c0 Recovering log #182
2025/03/11-23:44:54.688425 7f24c6ffd6c0 Delete type=3 #180
2025/03/11-23:44:54.688509 7f24c6ffd6c0 Delete type=0 #182
2025/03/11-23:45:54.466489 7f24c4bff6c0 Level-0 table #187: started
2025/03/11-23:45:54.466525 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2025/03/11-23:45:54.472451 7f24c4bff6c0 Delete type=0 #185
2025/03/11-23:45:54.491700 7f24c4bff6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@ -1,7 +0,0 @@
2025/03/11-23:33:32.488591 7f24c57fa6c0 Recovering log #178
2025/03/11-23:33:32.499216 7f24c57fa6c0 Delete type=3 #176
2025/03/11-23:33:32.499268 7f24c57fa6c0 Delete type=0 #178
2025/03/11-23:44:47.713953 7f24c4bff6c0 Level-0 table #183: started
2025/03/11-23:44:47.713983 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2025/03/11-23:44:47.748547 7f24c4bff6c0 Delete type=0 #181
2025/03/11-23:44:47.748713 7f24c4bff6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
MANIFEST-000184

View File

View File

@ -1,7 +0,0 @@
2025/03/11-23:44:54.764214 7f24c5ffb6c0 Recovering log #182
2025/03/11-23:44:54.823309 7f24c5ffb6c0 Delete type=3 #180
2025/03/11-23:44:54.823390 7f24c5ffb6c0 Delete type=0 #182
2025/03/11-23:45:54.485457 7f24c4bff6c0 Level-0 table #187: started
2025/03/11-23:45:54.485489 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2025/03/11-23:45:54.491568 7f24c4bff6c0 Delete type=0 #185
2025/03/11-23:45:54.491736 7f24c4bff6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +0,0 @@
2025/03/11-23:33:32.514118 7f24c67fc6c0 Recovering log #178
2025/03/11-23:33:32.524830 7f24c67fc6c0 Delete type=3 #176
2025/03/11-23:33:32.525025 7f24c67fc6c0 Delete type=0 #178
2025/03/11-23:44:47.668164 7f24c4bff6c0 Level-0 table #183: started
2025/03/11-23:44:47.668203 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2025/03/11-23:44:47.713809 7f24c4bff6c0 Delete type=0 #181
2025/03/11-23:44:47.748703 7f24c4bff6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

Binary file not shown.

View File

@ -1265,7 +1265,6 @@ ul, li {
min-width: 12rem;
}
.item-name-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
@ -1276,16 +1275,6 @@ ul, li {
max-width: 6rem;
min-width: 6rem;
}
.item-name-label-medium2 {
margin-top: 4px;
flex-grow:0;
max-width: 10rem;
min-width: 10rem;
}
.item-name-label-free {
margin-top: 4px;
align-self: flex-start;
}
.item-name-label-long2 {
margin-top: 4px;
flex-grow:2;
@ -1298,17 +1287,10 @@ ul, li {
min-width: 9rem;
}
.item-field-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
}
.item-field-label-short-header {
margin-top: 4px;
flex-grow:1;
max-width: 2.2rem;
min-width: 2.2rem;
}
.item-field-label-medium {
flex-grow:1;
max-width: 6rem;
@ -1339,21 +1321,12 @@ ul, li {
min-width:2rem;
max-width: 2rem;
}
.item-controls-fixed-full {
min-width:3rem;
max-width: 3rem;
}
.attribute-label {
font-weight: bold;
}
.flexrow-no-expand {
flex-grow: 0;
}
.flexrow-start {
justify-content: flex-start;
align-content: flex-start;
align-self: flex-start;
}
.item-input-small {
max-width: 16px;
max-height: 12px;

View File

@ -1245,7 +1245,6 @@ ul, li {
min-width: 12rem;
}
.item-name-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
@ -1256,16 +1255,6 @@ ul, li {
max-width: 6rem;
min-width: 6rem;
}
.item-name-label-medium2 {
margin-top: 4px;
flex-grow:0;
max-width: 10rem;
min-width: 10rem;
}
.item-name-label-free {
margin-top: 4px;
align-self: flex-start;
}
.item-name-label-long2 {
margin-top: 4px;
flex-grow:2;
@ -1278,17 +1267,10 @@ ul, li {
min-width: 9rem;
}
.item-field-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
}
.item-field-label-short-header {
margin-top: 4px;
flex-grow:1;
max-width: 2.2rem;
min-width: 2.2rem;
}
.item-field-label-medium {
flex-grow:1;
max-width: 6rem;
@ -1319,21 +1301,12 @@ ul, li {
min-width:2rem;
max-width: 2rem;
}
.item-controls-fixed-full {
min-width:3rem;
max-width: 3rem;
}
.attribute-label {
font-weight: bold;
}
.flexrow-no-expand {
flex-grow: 0;
}
.flexrow-start {
justify-content: flex-start;
align-content: flex-start;
align-self: flex-start;
}
.item-input-small {
max-width: 16px;
max-height: 12px;

View File

@ -3,10 +3,8 @@
"esmodules": [
"modules/ecryme-main.js"
],
"grid": {
"distance": 2,
"units": "m"
},
"gridDistance": 1,
"gridUnits": "m",
"languages": [
{
"lang": "fr",
@ -28,84 +26,13 @@
}
],
"packs": [
{
"label": "Spécialisation",
"type": "Item",
"name": "specialisation",
"path": "packs/specialisation",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Equipment",
"type": "Item",
"name": "equipment",
"path": "packs/equipment",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Traits",
"type": "Item",
"name": "traits",
"path": "packs/traits",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Scenes",
"type": "Scene",
"name": "scenes",
"path": "packs/scenes",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Maneuvers",
"type": "Item",
"name": "maneuvers",
"path": "packs/maneuvers",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Help/Aides",
"type": "JournalEntry",
"name": "help",
"path": "packs/help",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
}
],
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/system.json",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/raw/branch/master/system.json",
"compatibility": {
"minimum": "12",
"verified": "12"
"minimum": "10",
"verified": "11",
"maximum": "11"
},
"id": "fvtt-ecryme",
"primaryTokenAttribute": "secondary.health",
@ -114,18 +41,9 @@
"styles": [
"styles/ecryme.css"
],
"relationships": {
"requires": [
{
"id": "babele",
"type": "module",
"compatibility": {}
}
]
},
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
"version": "12.0.3",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v12.0.3.zip",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme",
"version": "11.0.5",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.5.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@ -1,7 +1,7 @@
{
"Actor": {
"types": [
"pc","annency", "npc"
"pc"
],
"templates": {
"biodata": {
@ -24,38 +24,31 @@
},
"core": {
"subactors": [],
"equipmentfree": "",
"skills": {
"physical": {
"name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": {
"athletics": {
"key": "athletics",
"name": "ECRY.ui.athletics",
"max": 0,
"value": 0
},
"driving": {
"key": "driving",
"name": "ECRY.ui.driving",
"max": 0,
"value": 0
},
"fencing": {
"key": "fencing",
"name": "ECRY.ui.fencing",
"max": 0,
"value": 0
},
"brawling": {
"key": "brawling",
"name": "ECRY.ui.brawling",
"max": 0,
"value": 0
},
"shooting": {
"key": "shooting",
"name": "ECRY.ui.shooting",
"max": 0,
"value": 0
@ -64,34 +57,28 @@
},
"mental": {
"name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": {
"anthropomecanology": {
"key": "anthropomecanology",
"name": "ECRY.ui.anthropomecanology",
"value": 0,
"max": 10
},
"ecrymology": {
"key": "ecrymology",
"name": "ECRY.ui.ecrymology",
"value": 0,
"max": 10
},
"traumatology": {
"key": "traumatology",
"name": "ECRY.ui.traumatology",
"value": 0,
"max": 10
},
"traversology": {
"key": "traversology",
"name": "ECRY.ui.traversology",
"value": 0,
"max": 10
},
"urbatechnology": {
"key": "urbatechnology",
"name": "ECRY.ui.urbatechnology",
"value": 0,
"max": 10
@ -100,34 +87,28 @@
},
"social": {
"name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": {
"quibbling": {
"key": "quibbling",
"name": "ECRY.ui.quibbling",
"value": 0,
"max": 10
},
"creativity": {
"key": "creativity",
"name": "ECRY.ui.creativity",
"value": 0,
"max": 10
},
"loquacity": {
"key": "loquacity",
"name": "ECRY.ui.loquacity",
"value": 0,
"max": 10
},
"guile": {
"key": "guile",
"name": "ECRY.ui.guile",
"value": 0,
"max": 10
},
"performance": {
"key": "performance",
"name": "ECRY.ui.performance",
"value": 0,
"max": 10
@ -192,34 +173,7 @@
"npccore": {
"npctype": "",
"description": ""
},
"annency": {
"base": {
"iscollective": false,
"ismultiple": false,
"characters": [],
"location": {"1": "", "2": "", "3":"", "4":"", "5":"" },
"description": "",
"enhancements": ""
},
"boheme": {
"name": "",
"ideals": "",
"politic": "",
"description": ""
}
}
},
"annency": {
"templates": [
"annency"
]
},
"npc": {
"templates": [
"biodata",
"core"
]
},
"pc": {
"templates": [
@ -234,7 +188,10 @@
"trait",
"weapon",
"specialization",
"maneuver"
"annency",
"boheme",
"contact",
"confrontation"
],
"templates": {
"common": {
@ -246,11 +203,6 @@
"costunit": ""
}
},
"maneuver": {
"templates": [
"common"
]
},
"confrontation": {
"templates": [
"common"
@ -285,7 +237,6 @@
"effect": 0
},
"specialization": {
"bonus": 2,
"templates": [
"common"
],

View File

@ -15,40 +15,27 @@
<div class="flexrow">
<ul>
<li class="flexrow item" data-item-id="{{spleen.id}}">
<label class="item-field-label-short">Spleen :</label>
<label class="item-name-label-medium">Spleen :</label>
<label class="item-name-label-long">{{spleen.name}}</label>
<div class="item-filler">&nbsp;</div>
{{#if spleen}}
<div class="item-controls item-controls-fixed-full">
<a class="item-control item-add" data-type="trait" title="Create Trait"><i
class="fas fa-plus"></i></a>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" data-type="trait" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
class="fas fa-trash"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i class="fas fa-plus"></i></a>
</div>
{{/if}}
</li>
<li class="item flexrow" data-item-id="{{ideal.id}}">
<label class="item-field-label-short">Ideal :</label>
<label class="item-name-label-medium">Ideal :</label>
<label class="item-name-label-long">{{ideal.name}}</label>
<div class="item-filler">&nbsp;</div>
{{#if ideal}}
<div class="item-controls item-controls-fixed-full">
<a class="item-control item-add" data-type="trait" title="Create Trait"><i
class="fas fa-plus"></i></a>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" data-type="trait" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
class="fas fa-trash"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i class="fas fa-plus"></i></a>
</div>
{{/if}}
</li>
<li class="item flexrow flexrow-no-expand flexrow-start ">
<label class="item-name-label-short">Traits :</label>
{{#each traits as |trait key|}}
<label class="item-name-label-free"><a data-item-id="{{trait._id}}" class="item-edit">{{trait.name}}</a>,&nbsp;</label>
{{/each}}
</li>
</ul>
</div>
@ -64,9 +51,6 @@
<a class="item" data-tab="competences">{{localize "ECRY.ui.skills"}}</a>
<a class="item" data-tab="traits">{{localize "ECRY.ui.traits"}}</a>
<a class="item" data-tab="combat">{{localize "ECRY.ui.healthcombat"}}</a>
{{#if hasCephaly}}
<a class="item" data-tab="cephaly">{{localize "ECRY.ui.cephaly"}}</a>
{{/if}}
<a class="item" data-tab="equipements">{{localize "ECRY.ui.equipment"}}</a>
<a class="item" data-tab="biodata">{{localize "ECRY.ui.bionotes"}}</a>
</nav>
@ -85,29 +69,10 @@
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header impact-title">
<h3>
{{#if (eq @root.type "npc")}}
<a class="roll-skill-confront" data-category-key="{{categkey}}" data-skill-key="rawnpc">
<i class="fa-regular fa-swords"></i>
</a>
<a class="roll-skill" data-category-key="{{categkey}}" data-skill-key="rawnpc">
<i class="fa-solid fa-dice-d6"></i>
{{/if}}
<label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus
categkey}})</label>
{{#if (eq @root.type "npc")}}
</a>
<select class="item-field-label-short-header" type="text"
name="system.skills.{{categkey}}.pnjvalue" value="{{category.pnjvalue}}"
data-dtype="Number">
{{selectOptions @root.config.skillLevel selected=category.pnjvalue}}
</select>
{{/if}}
</h3>
<h3><label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus
categkey}})</label></h3>
</span>
</li>
{{#each category.skilllist as |skill skillkey|}}
<li class="item flexrow list-item">
<span class="item-name-label-long">
@ -121,23 +86,26 @@
<select class="item-field-label-short" type="text"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}"
data-dtype="Number">
{{selectOptions @root.config.skillLevel selected=skill.value}}
{{#select skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="item flexrow list-item">
<ul class="ul-level1">
{{#each skill.spec as |spec idx|}}
<li class="item flexrow list-item" data-item-id="{{spec._id}}" data-item-type="specialization">
<a class="roll-spec" data-category-key="{{categkey}}" data-skill-key="{{skillkey}}"
data-spec-id="{{spec._id}}">
<a class="roll-spec" data-spec-id="{{spec._id}}">
<i class="fa-solid fa-dice-d6"></i>
{{spec.name}}
</a>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" data-type="specialization" title="Edit Item"><i
class="fas fa-edit"></i></a>
<a class="item-control item-delete" data-type="specialization" title="Delete Item"><i
class="fas fa-trash"></i></a>
<a class="item-control item-add" data-type="specialization" title="Delete Item"><i
class="fas fa-plus"></i></a>
</div>
</li>
{{/each}}
@ -151,52 +119,6 @@
</div>
{{#if hasCephaly}}
{{!-- Cephaly Tab --}}
<div class="tab cephaly" data-group="primary" data-tab="cephaly">
<div class="grid grid-2col">
<div>
<h3>{{localize "ECRY.ui.cephaly"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each cephalySkills as |skill skillkey|}}
<li class="item flexrow list-item">
<span class="item-name-label-long">
<a class="roll-cephaly" data-category-key="cephaly" data-skill-key="{{skillkey}}">
<i class="fa-solid fa-dice-d6"></i>
{{localize skill.name}}
</a></span>
<select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value"
value="{{skill.value}}" data-dtype="Number">
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
</li>
{{/each}}
</ul>
</div>
<div>
{{#if annency}}
<h3>{{localize "ECRY.ui.annency"}} : <a class="open-annency"
data-annency-id="{{annency.id}}">{{annency.name}}<i class="fas fa-edit"></i></a></h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-long">
{{annency.system.base.description}}
</span>
</li>
</ul>
{{/if}}
</div>
</div>
</div>
{{/if}}
<div class="tab traits" data-group="primary" data-tab="traits">
@ -273,48 +195,61 @@
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header-long2">
<h3><label class="item-name-label-header-long2">{{localize "ECRY.ui.maneuvers"}}</label></h3>
</span>
</li>
{{#each maneuvers as |maneuver key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{maneuver._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{maneuver.img}}" /></a>
<span class="item-name-label-long2">
{{maneuver.name}}
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete maneuver"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
{{!-- Equipement Tab --}}
<div class="tab equipements" data-group="primary" data-tab="equipements">
<div class="tab equipment" data-group="primary" data-tab="equipment">
<span class="item-name-label-header items-title-bg">
<h3><label class="items-title-text">{{localize "ECRY.ui.equipmentfree"}}</label></h3>
<h3><label class="items-title-text">Equipements (saisie libre)</label></h3>
</span>
<div class="form-group small-editor">
{{editor equipementlibre target="system.equipmentfree" button=true owner=owner editable=editable}}
{{editor equipementlibre target="system.equipementlibre" button=true owner=owner editable=editable}}
</div>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">{{localize "ECRY.ui.equipment"}}s</label></h3>
<h3><label class="items-title-text">Armes</label></h3>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">{{localize "ECRY.ui.weight"}}</label>
<label class="item-field-label-medium">Normaux</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Particulier</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Critique</label>
</span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="weapon" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each armes as |arme key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{arme._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{arme.img}}" /></a>
<span class="item-name-label">{{arme.name}}</span>
<span class="item-field-label-medium"><label>{{arme.system.dommagenormale}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagepart}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagecritique}}</label></span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Equipements (Items)</label></h3>
</span>
<span class="item-field-label-long">
<label class="short-label">Q.</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
@ -322,12 +257,11 @@
</div>
</li>
{{#each equipments as |equip key|}}
{{#each equipements as |equip key|}}
<li class="item list-item flexrow list-item-shadow" data-item-id="{{equip._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{equip.img}}" /></a>
<span class="item-name-label">{{equip.name}}</span>
<span class="item-field-label-medium">{{equip.system.weight}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
@ -337,6 +271,36 @@
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Sortilèges</label></h3>
</span>
<span class="item-field-label-medium">
<label class="short-label">Seuil</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="equipment" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each sorts as |sort key|}}
<li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{sort.img}}" /></a>
<span class="item-name-label">{{sort.name}}</span>
<span class="item-field-label-medium">
<label class="short-label">{{sort.system.seuil}}</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<hr>
</div>
@ -348,7 +312,7 @@
<div>
<ul class="item-list alternate-list">
<li class="item flexrow">
<label class="item-name-label-medium">{{localize "ECRY.ui.bornplace"}}</label>
<label class="item-name-label-medium">Lieu de naissance</label>
<input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}"
data-dtype="String" />
</li>
@ -357,27 +321,22 @@
<input type="text" class="" name="system.biodata.age" value="{{system.biodata.age}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">Profession</label>
<input type="text" class="" name="system.biodata.profession" value="{{system.biodata.profession}}"
data-dtype="String" />
</li>
</ul>
</div>
<div>
<ul>
<li class="item flexrow">
<label class="item-name-label-medium">{{localize "ECRY.ui.residence"}}</label>
<label class="item-name-label-medium">Résidence</label>
<input type="text" class="" name="system.biodata.residence" value="{{system.biodata.residence}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">{{localize "ECRY.ui.origin"}}</label>
<label class="item-name-label-medium">Nationalité</label>
<input type="text" class="" name="system.biodata.nationalite" value="{{system.biodata.nationalite}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">{{localize "ECRY.ui.childhood"}}</label>
<label class="item-name-label-medium">Enfance</label>
<input type="text" class="" name="system.biodata.enfance" value="{{system.biodata.enfance}}"
data-dtype="String" />
</li>

View File

@ -1,138 +0,0 @@
<form class="{{cssClass}}" autocomplete="off">
{{!-- Sheet Header --}}
<header class="sheet-header">
<div class="header-fields">
<div class="flexrow">
<div class="profile-img-container">
<img class="profile-img" src="{{img}}" data-edit="img" title="{{name}}" />
</div>
<div class="flexcol">
<h1 class="charname margin-right"><input name="name" type="text" value="{{name}}" placeholder="Name" /></h1>
<div class="flexrow">
<ul>
<li class="flexrow item" data-item-id="{{spleen.id}}">
<label class="item-name-label-medium">Description :</label>
<textarea class="textarea-default" rows="3" name="system.base.description">{{system.base.description}}</textarea>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
{{#if hasCephaly}}
<a class="item" data-tab="annency">{{localize "ECRY.ui.annency"}}</a>
{{/if}}
{{#if hasBoheme}}
<a class="item" data-tab="boheme">{{localize "ECRY.ui.boheme"}}</a>
{{/if}}
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{#if hasCephaly}}
{{!-- Cephaly Tab --}}
<div class="tab annency" data-group="primary" data-tab="annency">
<div class="grid grid-2col">
<div>
<h3>{{localize "ECRY.ui.annency"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-short">
{{localize "ECRY.ui.iscollective"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.base.iscollective"
value="{{system.base.iscollective}}" {{checked system.base.iscollective}} />
<span class="item-name-label-short">
{{localize "ECRY.ui.ismultiple"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.base.ismultiple"
value="{{system.base.ismultiple}}" {{checked system.base.ismultiple}} />
</li>
</ul>
<h3>{{localize "ECRY.ui.characters"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each characters as |character id|}}
<li class="item flexrow " data-actor-id="{{character.id}}" >
<img class="item-name-img" src="{{character.img}}" />
<span class="item-name-label competence-name">{{character.name}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control actor-edit" title="Edit Actor"><i class="fas fa-edit"></i></a>
<a class="item-control actor-delete" title="Delete Actor"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
</div>
<div>
<h3>{{localize "ECRY.ui.location"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each system.base.location as |location index|}}
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.location"}} {{index}}
</span>
<textarea class="textarea-default" rows="3" name="system.base.location.{{index}}">{{location}}</textarea>
</li>
{{/each}}
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.enhancements"}}
</span>
<textarea class="textarea-default" rows="3" name="system.base.enhancements">{{system.base.enhancements}}</textarea>
</li>
</ul>
</div>
</div>
</div>
{{/if}}
{{#if hasBoheme}}
<div class="tab boheme" data-group="primary" data-tab="boheme">
<h3>{{localize "ECRY.ui.oniricform"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.name"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.name" value="{{system.boheme.name}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.ideals"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.ideals" value="{{system.boheme.ideals}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.politic"}}</span>
<input type="text" class="item-field-label-long" name="system.boheme.politic" value="{{system.boheme.politic}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.description"}}</span>
<textarea class="textarea-default" rows="3" name="system.boheme.description">{{system.boheme.description}}</textarea>
</li>
</ul>
</div>
{{/if}}
</section>
</form>

View File

@ -1,37 +0,0 @@
<div class="chat-message-header">
{{#if actorImg}}
<img class="actor-icon" src="{{actorImg}}" alt="{{alias}}" />
{{/if}}
<h4 class="chat-actor-name">{{alias}}</h4>
</div>
<hr>
{{#if img}}
<div>
<img class="chat-icon" src="{{img}}" alt="{{alias}}" />
</div>
{{/if}}
<div>
<ul>
<li>{{localize "ECRY.ui.cephaly"}} : {{localize skill.name}}</li>
{{#if annency}}
<li>{{localize "ECRY.ui.annencybonus"}} {{annency.name}}: {{annencyBonus}}</li>
{{/if}}
{{#if (gt marginExecution 0)}}
<li>{{localize "ECRY.ui.execution"}} {{executionTotal}} vs {{difficulty}} : {{marginExecution}}</li>
<li>{{localize cephalySuccess}}</li>
{{/if}}
{{#if (gt marginPreservation 0)}}
<li>{{localize "ECRY.ui.preservation"}} {{preservationTotal}} vs {{difficulty}} : {{marginPreservation}}</li>
<li>{{localize cephalyFailure}}</li>
{{/if}}
</ul>
</div>
</div>

View File

@ -15,58 +15,13 @@
<div>
<ul>
{{#if (eq mode "cephaly")}}
<li>{{localize "ECRY.ui.cephaly"}} : {{localize skill.name}} </li>
{{else}}
<li>Confrontation : {{alias}} </li>
{{/if}}
<li>{{localize skill.name}}: {{skill.value}} </li>
{{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}}) </li>
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+2) </li>
{{/if}}
{{#each traitsBonus as |trait idx|}}
{{#if trait.activated}}
<li>{{localize "ECRY.chat.traitbonus"}}: {{trait.name}} ({{trait.system.level}}) </li>
{{/if}}
{{/each}}
{{#each traitsMalus as |trait idx|}}
{{#if trait.activated}}
<li>{{localize "ECRY.chat.traitmalus"}}: {{trait.name}} ({{trait.system.level}}) </li>
{{/if}}
{{/each}}
{{#if bonusMalusTraits}}
<li>{{localize "ECRY.chat.bonusmalustraits"}}: {{bonusMalusTraits}} </li>
{{/if}}
{{#if (isGM)}}
{{else}}
<li>{{localize "ECRY.ui.execution"}} : {{executionTotal}}</li>
<li>{{localize "ECRY.ui.preservation"}} : {{preservationTotal}}</li>
{{/if}}
</ul>
{{#if (isGM)}}
{{#if (eq mode "cephaly")}}
<div>
<span>{{localize "ECRY.chat.difficulty"}}</span>
<select id="{{rollId}}-cephaly-difficulty" name="cephaly-difficulty">
{{#for 1 20 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
</select>
</div>
<button class="button-apply-cephaly-difficulty">{{localize "ECRY.ui.cephalydifficulty"}}</button>
{{else}}
<button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button>
{{/if}}
{{else}}
<div>
{{localize "ECRY.chat.sentogm"}}
</div>
{{/if}}
</div>
</div>

View File

@ -21,7 +21,7 @@
{{#if skill}}
<li>{{localize skill.name}}: {{skill.value}} </li>
{{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}}) </li>
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+2) </li>
{{/if}}
{{/if}}

View File

@ -14,6 +14,7 @@
<h3>{{localize "ECRY.ui.execution"}} : <span id="execution-total">{{executionTotal}}</span> </h3>
<div id="confront-execution" class="flexrow confront-area confront-execution-area">
{{> systems/fvtt-ecryme/templates/dialogs/partial-confront-dice-area.hbs filter="execution"}}
<br>
{{> systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs filter="execution"}}
</div>
</div>
@ -55,32 +56,37 @@
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
<select class="" id="roll-select-transcendence" data-type="Number">
{{selectOptions config.skillLevel selected=skillTranscendence}}
{{#select skillTranscendence}}
{{#for 0 skill.value 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
{{/select}}
</select>
</div>
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.transcendapply"}} : </span>
<select class="" id="roll-apply-transcendence" data-type="String">
{{selectOptions config.transcendanceOptions selected=applyTranscendence localize=true}}
{{#select applyTranscendence}}
<option value="execution">{{localize "ECRY.ui.execution"}}</option>
<option value="preservation">{{localize "ECRY.ui.preservation"}}</option>
{{/select}}
</select>
</div>
{{#if skill.spec}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.spec"}} : </span>
<select class="" id="roll-specialization" data-type="String" multiple>
{{#each skill.spec as |spec idx|}}
<option value="{{spec.id}}" {{#if (eq spec.name @root.spec.name)}}selected{{/if}}>{{spec.name}}</option>
<option value="{{spec.id}}">{{spec.name}}</option>
{{/each}}
</select>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.traitbonus"}} : </span>
<select class="" id="roll-trait-bonus" data-type="String" multiple>
{{#each traitsBonus as |trait idx|}}
<option value="{{trait._id}}" {{#if trait.activated}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{#each traits as | trait idx|}}
<option value="{{trait._id}}" {{#if trait.isBonus}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{/each}}
</select>
</div>
@ -88,34 +94,25 @@
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.traitmalus"}} : </span>
<select class="" id="roll-trait-malus" data-type="String" multiple>
{{#each traitsMalus as |trait idx|}}
<option value="{{trait._id}}" {{#if trait.activated}}selected{{/if}}>{{trait.name}} ({{trait.system.level}})</option>
{{#each traits as | trait idx|}}
<option value="{{trait._id}}" {{#if trait.isMalus}}selected{{/if}}">{{trait.name}} ({{trait.system.level}})</option>
{{/each}}
</select>
</div>
{{#if annency}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.annency"}} : {{annency.name}}</span>
<span class="roll-dialog-label">{{annency.system.base.description}}</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.annencybonus"}}</span>
<select class="" id="annency-bonus" name="annencyBonus" data-type="String">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso">
{{#select bonusMalusPerso}}
<option value="-3">-3</option>
<option value="-2">-2</option>
<option value="-1">-1</option>
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
<option value="4">+4</option>
<option value="5">+5</option>
</select>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso" type="text" data-dtype="String">
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
{{/select}}
</select>
</div>

View File

@ -14,25 +14,22 @@
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
<select class="" id="roll-select-transcendence" data-type="Number">
{{selectOptions config.skillLevel selected=skillTranscendence}}
{{#select skillTranscendence}}
{{#for 0 skill.value 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
{{/select}}
</select>
</div>
{{#if forcedSpec}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.spec"}} : </span>
<span class="roll-dialog-label">{{forcedSpec.name}} (+{{forcedSpec.system.bonus}})</span>
</div>
{{else}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.spec"}} : </span>
<select class="" id="roll-specialization" data-type="String" multiple>
{{#each skill.spec as |spec idx|}}
<option value="{{spec.id}}">{{spec.name}} (+{{spec.system.bonus}})</option>
<option value="{{spec.id}}">{{spec.name}}</option>
{{/each}}
</select>
</div>
{{/if}}
{{#if spleen}}
<div class="flexrow">
@ -71,8 +68,16 @@
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select type="text" id="bonusMalusPerso" name="bonusMalusPerso" data-dtype="String">
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
<select id="bonusMalusPerso" name="bonusMalusPerso">
{{#select bonusMalusPerso}}
<option value="-3">-3</option>
<option value="-2">-2</option>
<option value="-1">-1</option>
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
{{/select}}
</select>
</div>

View File

@ -12,8 +12,13 @@
<div class="flexrow">
<span class="roll-dialog-label">Difficulté : </span>
<select class="" type="text" id="roll-difficulty" data-dtype="String">
{{selectOptions config.difficulty selected=difficulty localize=true labelAttr="difficulty"}}
<select class="" type="text" id="roll-difficulty" value="{{difficulty}}" data-dtype="Number">
{{#select difficulty}}
{{#each config.difficulty as |diffData value| }}
<option value="{{diffData.value}}">{{localize diffData.difficulty}} / {{localize diffData.frequency}}
({{diffData.value}})</option>
{{/each}}
{{/select}}
</select>
</div>

View File

@ -1,25 +0,0 @@
<form class="{{cssClass}}" autocomplete="off">
<header class="sheet-header">
<img class="item-sheet-img" src="{{img}}" data-edit="img" title="{{name}}"/>
<div class="header-fields">
<h1 class="charname"><input name="name" type="text" value="{{name}}" placeholder="Name"/></h1>
</div>
</header>
{{> systems/fvtt-ecryme/templates/items/partial-item-nav.hbs}}
{{!-- Sheet Body --}}
<section class="sheet-body">
{{> systems/fvtt-ecryme/templates/items/partial-item-description.hbs}}
<div class="tab details" data-group="primary" data-tab="details">
{{> systems/fvtt-ecryme/templates/items/partial-item-equipment.hbs}}
</div>
</div>
</section>
</form>

View File

@ -22,14 +22,22 @@
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.impactType"}}</label>
<select class="item-field-label-medium" type="text" name="system.impacttype" value="{{system.impacttype}}" data-dtype="String">
{{selectOptions config.impactTypes selected=system.impacttype localize=true }}
{{#select system.impacttype}}
{{#each config.impactTypes as |type key| }}
<option value="{{key}}">{{localize type}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.impactLevel"}}</label>
<select class="item-field-label-medium" type="text" name="system.impactlevel" value="{{system.impactlevel}}" data-dtype="String">
{{selectOptions config.impactLevels selected=system.impactlevel localize=true }}
{{#select system.impactlevel}}
{{#each config.impactLevels as |level key| }}
<option value="{{key}}">{{localize level}}</option>
{{/each}}
{{/select}}
</select>
</li>
</ul>

View File

@ -22,15 +22,14 @@
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.skill"}}</label>
<select class="item-field-label-medium" type="text" name="system.skillkey" value="{{system.skillkey}}" data-dtype="String">
{{selectOptions config.skills selected=system.skillkey localize=true valueAttr="key" labelAttr="name"}}
{{#select system.skillkey}}
{{#each config.skills as |skill key| }}
<option value="{{key}}">{{localize skill.name}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.bonus"}}</label>
<input type="text" class="item-field-label-short" name="system.bonus" value="{{system.bonus}}" data-dtype="Number"/>
</li>
</ul>
</div>
</div>

View File

@ -22,14 +22,23 @@
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.traitType"}}</label>
<select class="item-field-label-medium" type="text" name="system.traitype" value="{{system.traitype}}" data-dtype="String">
{{selectOptions config.traitTypes selected=system.traitype}}
{{#select system.traitype}}
{{#each config.traitTypes as |type key| }}
<option value="{{key}}">{{type}}</option>
{{/each}}
{{/select}}
</select>
</li>
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.niveauTrait"}}</label>
<select class="item-field-label-medium" type="text" name="system.level" value="{{system.level}}" data-dtype="String">
{{selectOptions config.traitLevel selected=system.level labelAttr="text"}}
<select class="item-field-label-medium" type="text" name="system.level" value="{{system.level}}" data-dtype="Number">
{{#select system.level}}
{{#each config.traitLevel as |level key| }}
<option value="{{level.value}}">{{level.text}}</option>
{{/each}}
{{/select}}
</select>
</li>
</ul>
</div>

View File

@ -22,7 +22,11 @@
<li class="flexrow">
<label class="item-name-label-long">{{localize "ECRY.ui.weapontype"}}</label>
<select class="item-field-label-medium" type="text" name="system.weapontype" value="{{system.weapontype}}" data-dtype="String">
{{selectOptions config.weaponTypes selected=system.weapontype localize=true}}
{{#select system.weapontype}}
{{#each config.weaponTypes as |type key| }}
<option value="{{key}}">{{localize type}}</option>
{{/each}}
{{/select}}
</select>
</li>

View File

@ -8,7 +8,11 @@
<label class="item-field-label-long">{{localize "ECRY.ui.cost"}}</label>
<input type="text" class="item-field-label-short" name="system.cost" value="{{system.cost}}" data-dtype="Number" />
<select class="item-field-label-medium" type="text" name="system.costunit" value="{{system.costunit}}" data-dtype="String">
{{selectOptions config.costUnits selected=system.costunit localize=true labelAttr="name"}}
{{#select system.costunit}}
{{#each config.costUnits as |unit key| }}
<option value="{{key}}">{{localize unit.name}}</option>
{{/each}}
{{/select}}
</select>
</li>

View File

@ -1,676 +0,0 @@
{
"label": "Equipement",
"mapping": {
"description": "system.description"
},
"folders": {
"Armor": "Armure",
"Weapons": "Armes",
"Clothing": "Vêtements",
"Food": "Nourriture",
"Lighting": "Eclairage",
"Miscellany" : "Divers",
"Musical instruments": "Instruments de musique",
"Reading, writing, recording": "Lecture, écriture, enregistrement",
"Travel equipment": "Equipement de voyage",
"Vehicle": "Véhicule"
},
"entries": {
"Absinthe": {
"name": "Absinthe",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Accordion": {
"name": "Accordéon",
"description": ""
},
"Airship": {
"name": "Dirigeable",
"description": ""
},
"Animal skin parchment": {
"name": "Parchemin de peau",
"description": ""
},
"Automobile": {
"name": "Automobile",
"description": ""
},
"Axe": {
"name": "Hache",
"description": ""
},
"Bag": {
"name": "Sac",
"description": ""
},
"Ball of string": {
"name": "Pelote de ficelle",
"description": ""
},
"Bar of base metal (1 kg)": {
"name": "Lingot de vil métal (1 kg)",
"description": ""
},
"Bare hand": {
"name": "Mains nues",
"description": ""
},
"Barrel organ": {
"name": "Orgue",
"description": ""
},
"Battleaxe": {
"name": "Hache de bataille",
"description": ""
},
"Beer (1 glass)": {
"name": "Bière (1 verre)",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Beet stein": {
"name": "Chope (étain)",
"description": ""
},
"Bicycle": {
"name": "Vélo",
"description": ""
},
"Blacksmith's toolkit": {
"name": "Outils de forgeron",
"description": ""
},
"Blanket": {
"name": "Couverture",
"description": ""
},
"Blowpipe": {
"name": "Sarbacane",
"description": ""
},
"Blunderbuss": {
"name": "Tromblon",
"description": ""
},
"Book (printed)": {
"name": "Livre (imprimé)",
"description": ""
},
"Bow": {
"name": "Arc",
"description": ""
},
"Bower hat": {
"name": "Chapeau melon",
"description": ""
},
"Box camera": {
"name": "Appareil photographique (boîtier)",
"description": ""
},
"Bracelet": {
"name": "Bracelet",
"description": ""
},
"Brandy": {
"name": "Brandy",
"description": "<p>A 5 pence deposit is paid for bottles. This sum is paid back if the empty bottle is returned.</p>"
},
"Brooch": {
"name": "Broche",
"description": ""
},
"Butter": {
"name": "Beurre",
"description": ""
},
"Butterfly net": {
"name": "Filet à papillons",
"description": ""
},
"Cake": {
"name": "Gâteau",
"description": ""
},
"Candle": {
"name": "Bougie",
"description": ""
},
"Cane": {
"name": "Canne",
"description": ""
},
"Cape": {
"name": "Cape",
"description": ""
},
"Carriage": {
"name": "Carriole",
"description": ""
},
"Cestus": {
"name": "Ceste",
"description": ""
},
"Chain": {
"name": "Chaîne",
"description": ""
},
"Chain mail": {
"name": "Chemise de maille",
"description": ""
},
"Chestpplate": {
"name": "Cuirasse",
"description": ""
},
"Cigarettes": {
"name": "Cigarettes",
"description": ""
},
"Coffee, tea": {
"name": "Café, thé",
"description": ""
},
"Compass": {
"name": "Boussole",
"description": ""
},
"Corset": {
"name": "Corset",
"description": ""
},
"Crowbar": {
"name": "Pied de biche",
"description": ""
},
"Crude oil (1 l)": {
"name": "Huile lourde (1 l)",
"description": ""
},
"Cudgel": {
"name": "Gourdin",
"description": ""
},
"Dagger": {
"name": "Dague",
"description": ""
},
"Dirk": {
"name": "Poignard",
"description": ""
},
"Disk": {
"name": "Disque",
"description": ""
},
"Dissection kit": {
"name": "Nécessaire de dissection ",
"description": ""
},
"Dress, skirt": {
"name": "Robe, jupe",
"description": ""
},
"Drum": {
"name": "Tambour",
"description": ""
},
"Earrings (pair)": {
"name": "Boucles d'oreille (paire)",
"description": ""
},
"Egg": {
"name": "Oeuf",
"description": ""
},
"Evening dress": {
"name": "Robe de soirée",
"description": ""
},
"Evening shirt": {
"name": "Chemise de soirée",
"description": ""
},
"Film": {
"name": "Pellicule, développement et tirage",
"description": ""
},
"Flail": {
"name": "Fléau",
"description": ""
},
"Flat cap": {
"name": "Casquette gavroche",
"description": ""
},
"Glasses": {
"name": "Lunettes",
"description": ""
},
"Grappling hook": {
"name": "Grapin",
"description": ""
},
"Halberd": {
"name": "Hallebarde",
"description": ""
},
"Hammer and chisel": {
"name": "Marteau et burin",
"description": ""
},
"Handbag": {
"name": "Sac à main",
"description": ""
},
"Handheld crossbow": {
"name": "Arbalète de poing",
"description": ""
},
"Handheld lamp": {
"name": "Lampe tempête",
"description": ""
},
"Harpsichord": {
"name": "Clavecin",
"description": ""
},
"High heels shoes": {
"name": "Escarpins",
"description": ""
},
"Horse-drawn cart": {
"name": "Chariot",
"description": ""
},
"Hot air balloon": {
"name": "Ballon",
"description": ""
},
"Illustrated manuscript (cheap)": {
"name": "Manuscrit enluminé (bon marché) ",
"description": ""
},
"Illustrated manuscript (rich)": {
"name": "Manuscrit enluminé (cher)",
"description": ""
},
"Improvised weapon": {
"name": "Armes improvisées",
"description": ""
},
"Inkpot": {
"name": "Encrier",
"description": ""
},
"Iron flask": {
"name": "Flasque de fer",
"description": ""
},
"Jar (glass)": {
"name": "Conserve (verre)",
"description": ""
},
"Jaw harp": {
"name": "Guimbarde",
"description": ""
},
"Kettle": {
"name": "Bouilloire",
"description": ""
},
"Knife": {
"name": "Couteau",
"description": ""
},
"Lamp oil": {
"name": "Huile (lamp)",
"description": ""
},
"Lantern": {
"name": "Lanterne",
"description": ""
},
"Leather boots (pair)": {
"name": "Leather boots (pair)",
"description": ""
},
"Leather chest piece": {
"name": "Gilet de cuir",
"description": ""
},
"Leather overcoat": {
"name": "Manteau de conduite en cuir ",
"description": ""
},
"Lighter": {
"name": "Briquet",
"description": ""
},
"Loaf of bread": {
"name": "Miche de pain",
"description": ""
},
"Log": {
"name": "Bûche",
"description": ""
},
"Lute": {
"name": "Luth",
"description": ""
},
"Lyre": {
"name": "Lyre",
"description": ""
},
"Mace": {
"name": "Masse d'armes",
"description": ""
},
"Magnifying glass": {
"name": "Lunette, télescope",
"description": ""
},
"Mander parchment": {
"name": "Parchemin de mandre",
"description": ""
},
"Mandolin": {
"name": "Mandoline",
"description": ""
},
"Meat (beef, horse, chicken)": {
"name": "Viande (boeuf, cheval, poulet)",
"description": ""
},
"Meat (fullige, snake, pigeon) (Copy)": {
"name": "Viande (fulige, serpent, pigeon)",
"description": ""
},
"Meat (rat)": {
"name": "Viande (rat)",
"description": ""
},
"Messenger bag": {
"name": "Besace",
"description": ""
},
"Metal crossbow": {
"name": "Arbalète métallique",
"description": ""
},
"Metal cutlery": {
"name": "Couverts en métal",
"description": ""
},
"Metal plaque": {
"name": "Plaque de métal",
"description": "<p>(+8 de caution)</p>"
},
"Mushroom bread": {
"name": "Pain de champignons",
"description": ""
},
"Mushroom spirit": {
"name": "Eau-de-vie de champignons",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Musical saw": {
"name": "Scie musicale",
"description": ""
},
"Musket": {
"name": "Mousquet",
"description": ""
},
"Necklace": {
"name": "Collier",
"description": ""
},
"Organ": {
"name": "Orgue",
"description": ""
},
"Overcoat": {
"name": "Manteau",
"description": ""
},
"Pack of cards": {
"name": "Jeu de cartes",
"description": ""
},
"Petticoat": {
"name": "Jupon",
"description": ""
},
"Phonographic recorder": {
"name": "phonoéditeur",
"description": ""
},
"Pike": {
"name": "Pique",
"description": ""
},
"Pistol": {
"name": "Pistolet",
"description": ""
},
"Pocket watch": {
"name": "Montre à gousset",
"description": ""
},
"Poor quality stilts": {
"name": "Chaussures à talons-aiguille de basse qualité",
"description": ""
},
"Port, wine": {
"name": "Porto, vin",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Portable first aid kit": {
"name": "Trousse médicale de voyage ",
"description": ""
},
"Portable phonographic recorder": {
"name": "Phonoenregistreur de voyage",
"description": ""
},
"Portable stove": {
"name": "Réchaud à alcool",
"description": ""
},
"Pot of jam": {
"name": "Pot de confiture",
"description": ""
},
"Quill": {
"name": "Plume",
"description": ""
},
"Rapier": {
"name": "Rapière",
"description": ""
},
"Razor blade": {
"name": "Lame de rasoir",
"description": ""
},
"Recorder": {
"name": "Flûte à bec",
"description": ""
},
"Revolver": {
"name": "Révolver",
"description": ""
},
"Riding boots (pair)": {
"name": "Botte de cavalier (paire)",
"description": ""
},
"Ring": {
"name": "Anneau",
"description": ""
},
"Rope (hemp)": {
"name": "Corde (chanvre)",
"description": ""
},
"Rum": {
"name": "Rhum",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Scarf, shawl": {
"name": "Echarpe, châle",
"description": ""
},
"Shoes": {
"name": "Chaussures",
"description": ""
},
"Sighted rifle": {
"name": "Fusil à lunette",
"description": ""
},
"Silk stockings": {
"name": "Bas de soie",
"description": ""
},
"Silver bar": {
"name": "Lingot dargent ",
"description": ""
},
"Skis": {
"name": "Skis",
"description": ""
},
"Sleeping bag": {
"name": "Sac de couchage",
"description": ""
},
"Sling": {
"name": "Fronde",
"description": ""
},
"Soft brimmed hat": {
"name": "Chapeau mou",
"description": ""
},
"Spear": {
"name": "Lance",
"description": ""
},
"Spirit": {
"name": "Liqueur",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Staff": {
"name": "Bâton",
"description": ""
},
"Stylus for wax plaque": {
"name": "Stylet pour plaque de cire",
"description": ""
},
"Sword": {
"name": "Epée",
"description": ""
},
"Tambourine": {
"name": "Tambourin",
"description": ""
},
"Telescope": {
"name": "Télescope",
"description": ""
},
"Telescopic stilts": {
"name": "Échasses télescopiques",
"description": ""
},
"Thief's toolkit": {
"name": "Outils de voleur",
"description": ""
},
"Top hat": {
"name": "Haut-de-forme",
"description": ""
},
"Torch": {
"name": "Torche",
"description": ""
},
"Train (locomotive)": {
"name": "Train (locomotive)",
"description": ""
},
"Train (wagons)": {
"name": "Train (wagons)",
"description": ""
},
"Trumpet": {
"name": "Trompette",
"description": ""
},
"Truncheon": {
"name": "Matraque",
"description": ""
},
"Underwear": {
"name": "Sous-vêtements",
"description": ""
},
"Uniform": {
"name": "Uniforme",
"description": ""
},
"Viol": {
"name": "Viole",
"description": ""
},
"Violin": {
"name": "Violon",
"description": ""
},
"Walking stick": {
"name": "Bâton de marche",
"description": ""
},
"Watch": {
"name": "Montre",
"description": ""
},
"Wax plaque": {
"name": "Plaque de cire",
"description": "<p>+3 de caution</p>"
},
"Whiskey": {
"name": "Whisky",
"description": "<p>Les bouteilles vides sont consignées, 5 sous par bouteille</p>"
},
"Whistle": {
"name": "Sifflet",
"description": ""
},
"White shirt": {
"name": "Chemise blanche",
"description": ""
},
"Wooden crossbow": {
"name": "Arbalète en bois",
"description": ""
},
"Wooden sedan chair": {
"name": "Chaise à porteurs (bois)",
"description": ""
},
"Wooden trunk": {
"name": "Malle de bois",
"description": ""
},
"Writing material": {
"name": "Matériel décriture",
"description": ""
}
}
}

View File

@ -1,68 +0,0 @@
{
"label": "Manoeuvres",
"mapping": {
"description": "system.description"
},
"entries": {
"Coup de Jarnac": {
"name": "Coup de Jarnac",
"description": "<p>Marge de 4 en Accomplissement </p>\n<p>Ce coup violent, déloyal et pernicieux, a été rendu célèbre par Guy Chabot de Jarnac, qui la porté pour la première fois lors dun duel judiciaire, à Éole, en 954. Il consiste à blesser la jambe ou le tendon dAchille de ladversaire, lempêchant de se déplacer normalement. En plus de lImpact, la victime se voit affublée du Trait <em>Estropié -1</em>.</p>"
},
"Doesnt even hurt": {
"name": "Même pas mal",
"description": "<p>Par le contrôle de sa respiration et une volonté inébranlable, le combattant apprend à faire fi de ses blessures. Non seulement il ne souffre daucun malus dû aux Impacts subis mais, mieux encore, ces derniers lui permettent de se surpasser et deviennent des bonus proportionnels. Ainsi, au lieu de subir un malus de -4 pour un Impact majeur, le personnage bénéficiera dun bonus de +4. Il peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"Double impact": {
"name": "Double impact",
"description": "<p>Aggressif</p>\n<p>deux armes sont nécessaires</p>\n<p>Cette botte demande une extrême célérité au maître darmes qui augmente sa cadence de frappe. Durant un même échange de coups, il est ainsi capable dinfliger son Impact deux fois (deux Impacts graves au lieu dun par exemple). Le retour de flamme est cependant périlleux, car, par son agressivité, le maître darmes se découvre. Lui aussi subit des Impacts doublés.</p>"
},
"It's the winning, not the taking part that counts": {
"name": "Limportant nest pas de participer mais de gagner",
"description": "<p>impossibilité dutiliser cette botte en duel</p>\n<p>Lescrimeur a appris à tirer profit de toutes les occasions, privilégiant lefficacité au style. Il se sert de tout ce qui lui tombe sous la main pour en tirer avantage. Entre ses mains, un élément improvisé utilisé pour se battre est doté dune Incidence de +3, mais il se brise après usage.</p>"
},
"Perforation": {
"name": "Perforation",
"description": "<p>Cette manœuvre est particulièrement usitée au sein des seigneuries traversières, où les armures demeurent courantes. Dun coup précis, le maître darmes cible le point faible de la protection de son opposant et sy engouffre, faisant fi du bonus de cette dernière.</p>"
},
"Point blank": {
"name": "À bout portant",
"description": "<p>nécessite Spécialization <em>Mousquet</em></p>\n<p>Le maître darmes est un artiste martial, capable de faire feu avec son mousquet lors dun combat au corps à corps. Durant un même échange de coups, il peut porter un coup de baïonnette (Incidence du poignard) et faire feu avec le mousquet (Incidence darme à feu).</p>"
},
"Ribbon Dance": {
"name": "Danse des rubans",
"description": "<p>Agressif</p>\n<p>Par tranche de 2, nécessite une Spécialisation en arme articulée (fouet, chaînes, fléaux, rubans lestés de plomb ou lames métalliques), de réussir son test de Préservation et davoir suffisamment de place pour se battre En effectuant de longues et complexes arabesques, le maître darmes produit une sphère mortelle tournoyante autour de lui. Il peut alors ajouter sa Marge de Préservation, par tranche de 2, à sa Marge dAccomplissement. La Marge dAccomplissement produit alors de nombreuses blessures superficielles (1 par Marge de 2).</p>"
},
"The Chimeric Defense": {
"name": "Défense chimérique",
"description": "<p>&ldquo;Défensif uniquement&rdquo;&ndash;par tranches de 2&ndash;</p>\n<p>Pour réussir cette manœuvre, le personnage doit obtenir une Marge dau moins 4 en Accomplissement ET en Préservation. En cas de réussite, elle permet dajouter tout ou partie de sa Marge de Préservation, par tranches de 2, à sa Marge dAccomplissement. Alors quil esquive ou pare, le défenseur en profite pour porter un coup à laide dun membre, dun élément improvisé, dun bouclier, etc. Cela demande une réflexion tactique, car augmenter son Accomplissement en recourant à cette botte affaiblit sa Préservation. Le combattant peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"The Dead mans Hold": {
"name": "Létreinte de lhomme mort",
"description": "<p>Lescrimeur choisit de subir des blessures en optant pour un score de Préservation bas. En acceptant ces Impacts, il est en retour capable de déjouer la garde de son adversaire et lui fait subir en retour des dégâts identiques, en plus de ceux quil a infligés normalement durant cette passe darmes, pour un total pouvant dépasser sa Marge autorisée de Compétence.</p>"
},
"The jeering master": {
"name": "Maître persifleur",
"description": "<p>Cette technique permet de provoquer son adversaire, voire de lhumilier, avant de lachever. Par ses piques et ses railleries, le maître darmes impose à son adversaire de placer son plus haut score possible en Accomplissement, ce qui dégarnit grandement sa Préservation (pour les seconds rôles, faites +4/-4 par défaut). </p>"
},
"The Madmans step": {
"name": "Le pas de lhomme fou",
"description": "<p>Le style Rojo nest pas enseigné par dans les écoles davocats-duellistes, mais dans les caravanes traversières. Lescrimeur adopte un style fait de mouvements erratiques et imprévisibles, désorientant son adversaire et le rendant plus difficile à toucher. Le bretteur ajoute +4 à sa Préservation et peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"The Nevers Attack": {
"name": "La botte de Nevers",
"description": "<p>Marge de 4 en Accomplissement et ladversaire ne doit pas posséder de protection à la tête</p>\n<p>Inventée par Philippe de Nevers, un sabreur parisien, cette botte exige une extrême précision mais se révèle dévastatrice. En cas de réussite, lépéiste élimine son adversaire sur le coup en lui infligeant une blessure entre les deux yeux (équivalent dun Impact majeur).</p>"
},
"The partner switch": {
"name": "Changement de partenaire",
"description": "<p>Cette botte peut être employée par un escrimeur confronté à plusieurs adversaires. Ce dernier a la possibilité dengager une cible supplémentaire au dernier moment (avant le calcul des Incidences). Il peut demander au conteur de lorienter vers un personnage à portée de fleuret ou de désigner son opposant avec le plus faible ou le plus fort score en Préservation. Le score de Préservation de lescrimeur sapplique aux deux adversaires désignés.</p>"
},
"The Scarlet Dance": {
"name": "La danse écarlate",
"description": "<p>Cette botte est linvention de la duelliste Bramon dÉole. Véritable némésis de Marcel Rubempré, maître darmes des anciens nobles avant quils ne soient chassés sur les traverses, sa technique entra dans la légende lors de la révolution industrielle. Elle combine un mélange de pas de danse et de coups destoc et de taille. Se laissant aller au rythme de sa musique intérieure, lépéiste finit dans un état de transe lui permettant dajouter son score dAthlétisme à son Incidence. Il peut dépasser la Marge autorisée par sa Compétence.</p>"
},
"Two-handed attack": {
"name": "À deux mains",
"description": "<p>Porter le coup avec les deux mains sur le pommeau de larme, avoir un score dAccomplissement supérieur à celui de Préservation Le combattant frappe de toutes ses forces afin de percer la défense de son adversaire. Il peut remplacer lIncidence de son arme par son score en <em>Athlétisme</em>.</p>"
}
}
}

View File

@ -1,393 +0,0 @@
{
"label": "Spécialisation",
"mapping": {
"description": "system.description"
},
"folders": {
"Mental": "Mentale",
"Physical": "Physique",
"Spocial": "Sociale"
},
"entries": {
"Aircraft": {
"name": "brûleur daérostat",
"description": ""
},
"Airplane": {
"name": "Aéroplane",
"description": ""
},
"Airship": {
"name": "Dirigeable",
"description": ""
},
"Amputation": {
"name": "Amputation",
"description": ""
},
"Architecture": {
"name": "Architecture",
"description": ""
},
"Armlock": {
"name": "Clef de bras",
"description": ""
},
"Automobile": {
"name": "Automobile",
"description": ""
},
"Axe": {
"name": "Hache",
"description": ""
},
"Bartering": {
"name": "Marchander",
"description": ""
},
"Blowpipe": {
"name": "Sarbacane",
"description": ""
},
"Bow": {
"name": "Arc",
"description": ""
},
"Boxing": {
"name": "Boxe",
"description": ""
},
"Camouflage": {
"name": "Camouflage",
"description": ""
},
"Carriage": {
"name": "Calèche",
"description": ""
},
"Carrying": {
"name": "Porter",
"description": "<p>Le personnage a la force et l'habitude de porter des charges lourdes.</p>"
},
"Cavalry saber": {
"name": "Sabre de cavalerie",
"description": ""
},
"Charm": {
"name": "Charmer",
"description": ""
},
"Chemystry": {
"name": "Chimie",
"description": ""
},
"Clarinet": {
"name": "Clarinette",
"description": ""
},
"Climbing": {
"name": "Escalader",
"description": "<p>Le personnage a appris à escalader différents types de surfaces.</p>"
},
"Clocks": {
"name": "Horloges",
"description": ""
},
"Collecting gossip": {
"name": "Collecter des ragots",
"description": ""
},
"Communication": {
"name": "Communication",
"description": ""
},
"Dagger": {
"name": "Dague",
"description": ""
},
"Decoction": {
"name": "Décoction",
"description": ""
},
"Dosage of medicine": {
"name": "Posologie",
"description": ""
},
"Electric": {
"name": "Electric",
"description": ""
},
"Environment (Alley)": {
"name": "Environnement (ruelle)",
"description": ""
},
"Environment (traverse)": {
"name": "Environnement (traverse)",
"description": ""
},
"Escape": {
"name": "Filer",
"description": ""
},
"Foil": {
"name": "Fleuret",
"description": ""
},
"Giving commands": {
"name": "Commander",
"description": ""
},
"Glider": {
"name": "Cerf-volant",
"description": ""
},
"Halberd": {
"name": "Hallebarde",
"description": ""
},
"Herbalism": {
"name": "Herbalisme",
"description": ""
},
"History": {
"name": "Histoire",
"description": ""
},
"Horse": {
"name": "Cheval",
"description": ""
},
"Hot air balloon": {
"name": "Ballon",
"description": ""
},
"Hydrocryme production": {
"name": "Production d'hydrocryme",
"description": ""
},
"Hydropower": {
"name": "Hydraulique",
"description": ""
},
"Impressing people": {
"name": "Impressionner",
"description": ""
},
"Improvised combat": {
"name": "Combat improvisé",
"description": ""
},
"Interrogation": {
"name": "Interrogation",
"description": ""
},
"Intervention": {
"name": "Intervention",
"description": ""
},
"Intimidation": {
"name": "Intimidation",
"description": ""
},
"Investigation": {
"name": "Investigation",
"description": ""
},
"Iron work": {
"name": "Ferronnerie",
"description": ""
},
"Jumping": {
"name": "sauter",
"description": "<p>Le personnage a la dextérité et la coordination pour sauter loin, haut, et atterrir sur ses pieds.</p>"
},
"Kickboxing": {
"name": "Savate",
"description": ""
},
"Lock picking": {
"name": "Crocheter",
"description": ""
},
"Lock systems": {
"name": "Serrures",
"description": ""
},
"Locomotive": {
"name": "Locomotive",
"description": ""
},
"Locomotives": {
"name": "Locomotives",
"description": ""
},
"Lying": {
"name": "Mentir",
"description": ""
},
"Making a good impression": {
"name": "Faire une bonne impression",
"description": ""
},
"Making mushroom paper": {
"name": "Fabriquer du papier à base de champignons",
"description": ""
},
"Milieu knowledge": {
"name": "Connaissance du milieu (...)",
"description": ""
},
"Music": {
"name": "Musique",
"description": ""
},
"Musical composition": {
"name": "Composition musicale",
"description": ""
},
"Musket": {
"name": "Mousquet",
"description": ""
},
"Neighborhood knowledge": {
"name": "Connaissance du quartier",
"description": ""
},
"Opera": {
"name": "Opéra",
"description": ""
},
"Organ": {
"name": "Orgue",
"description": ""
},
"Painting": {
"name": "Peinture",
"description": ""
},
"Pharmacology": {
"name": "Pharmacologie",
"description": ""
},
"Playwriting": {
"name": "Ecriture théâtrale",
"description": ""
},
"Pottery": {
"name": "Poterie",
"description": ""
},
"Rapier": {
"name": "Rapière",
"description": ""
},
"Religion": {
"name": "Religion",
"description": ""
},
"Rhetoric": {
"name": "Rhétorique",
"description": ""
},
"Running": {
"name": "Courir",
"description": "<p>Le personnage peut courir vite et longtemps.</p>"
},
"Sculpture": {
"name": "Sculpture",
"description": ""
},
"Sleight of hand": {
"name": "Escamoter",
"description": ""
},
"Sling": {
"name": "Fronde",
"description": ""
},
"Spear": {
"name": "Lance",
"description": ""
},
"Spreading false information": {
"name": "Propager de fausses informations",
"description": ""
},
"Strangling": {
"name": "Etrangler",
"description": ""
},
"Streetcar": {
"name": "Tramway",
"description": ""
},
"Surgery": {
"name": "Chirurgie",
"description": ""
},
"Swordstick": {
"name": "Canne-épée",
"description": ""
},
"Theater": {
"name": "Théâtre",
"description": ""
},
"Thermal": {
"name": "Thermique",
"description": ""
},
"Threatening": {
"name": "Menacer",
"description": ""
},
"Throwing knife": {
"name": "Couteau de lancer",
"description": ""
},
"Traverse architecture": {
"name": "Architecture des traverses",
"description": ""
},
"Traverse geography": {
"name": "Géographie des traverses",
"description": ""
},
"Traverse History": {
"name": "Histoire des traverses",
"description": ""
},
"Traverse mapmaking": {
"name": "Cartographie des traverses",
"description": ""
},
"Traverse mythology": {
"name": "Mythologie des traverses",
"description": ""
},
"Traverse sociology": {
"name": "Socilogie des traverses",
"description": ""
},
"Traverser flute": {
"name": "Flute des traverses",
"description": ""
},
"Tripping": {
"name": "Croc-en-jambe",
"description": ""
},
"Wind power": {
"name": "Eolien",
"description": ""
},
"Wrestling": {
"name": "Lutte",
"description": ""
},
"Writing": {
"name": "Ecriture",
"description": ""
}
}
}

View File

@ -1,107 +0,0 @@
{
"label": "Traits",
"mapping": {
"description": "system.description"
},
"folders": {
"Maneuvers": "Manoeuvres"
},
"entries": {
"Ability to stay calm": {
"name": "Facilité à rester calme",
"description": ""
},
"Comfortable on airships": {
"name": "A l'aise en dirigeable",
"description": ""
},
"Comfortable using a mapmaker's helmet": {
"name": "Virtuose du casque de cartographe",
"description": ""
},
"Comfortable walking on stilts": {
"name": "A l'aise en échasses",
"description": ""
},
"Cultured": {
"name": "Cultivé",
"description": ""
},
"Deaf": {
"name": "Sourd",
"description": "<p>Le personnage a grandi dans une usine, et le vacarme permanent des machines l'a rendu sourd. (-3).</p>"
},
"Disregard for death": {
"name": "Ne craint pas la mort",
"description": ""
},
"Excellent glider pilot": {
"name": "Excellent pilote de cerf-volant",
"description": ""
},
"Extremely good eyesight": {
"name": "Excellente vue",
"description": "<p>La vue de ce personnage est si développée qu'elle lui permet de &ldquo;lire&rdquo; les disques&nbsp;</p>"
},
"Famous with (...)": {
"name": "Connu dans le milieu des (...)",
"description": ""
},
"Foremimes language": {
"name": "Connait le langage des contremimes",
"description": ""
},
"Guild member": {
"name": "Membre de la guilde (...)",
"description": ""
},
"Guild member (high rank)": {
"name": "Membre de haut rang de la guilde (...)",
"description": ""
},
"Intuitively feels the damage on their vehicle": {
"name": "Sent intuitivement les dommages sur son véhicule",
"description": ""
},
"Keen intellect": {
"name": "Intellect affûté",
"description": ""
},
"Knowledge of upper classes of their city": {
"name": "Connaissance des classes huppées de la ville (...)",
"description": ""
},
"Knows how to encircle a target": {
"name": "Sait encercler une cible",
"description": ""
},
"Lipreading": {
"name": "Lit sur les lèvres",
"description": ""
},
"Preacher": {
"name": "Prêcheur",
"description": ""
},
"Preacher (great)": {
"name": "Prêcheur (excellent)",
"description": ""
},
"Rational mind": {
"name": "Rationnel",
"description": ""
},
"Rich": {
"name": "Riche",
"description": ""
},
"Sharpshooter": {
"name": "Tireur d'élite",
"description": "<p>Le personnage sait tirer partie d'un fusil à lunette.</p>"
},
"Skilled with explosives": {
"name": "Manieur d'explosifs",
"description": ""
}
}
}