Compare commits
43 Commits
fvtt-ecrym
...
master
Author | SHA1 | Date | |
---|---|---|---|
0487893f47 | |||
d7b7bccbdf | |||
dbf4b17afb | |||
51e5a409c4 | |||
1e4692e850 | |||
40e12c1bba | |||
2450dce46c | |||
67c1066194 | |||
65fe498572 | |||
e1990f88b4 | |||
f99abb0966 | |||
ec6e6be231 | |||
9d26d7bfad | |||
81848155e5 | |||
6778a9aa0b | |||
63aa49c77f | |||
0a3265419a | |||
f5093980b0 | |||
062a597b70 | |||
1d0d123947 | |||
bf94dc30b8 | |||
fc3b83cfc2 | |||
19b88c3de9 | |||
d669059403 | |||
45d419115d | |||
b9e2a77e88 | |||
5dca748bf3 | |||
98f9e1e2a6 | |||
1a90be13be | |||
e2f97762b9 | |||
de11053a9a | |||
3f7ce9918e | |||
919147b4af | |||
22953744ba | |||
6aee41b817 | |||
e7268a1578 | |||
0d25bbe764 | |||
554a1af531 | |||
b2219c0f81 | |||
61a1a4a904 | |||
06ef98bed9 | |||
b0834469a1 | |||
166f3367fb |
54
.gitea/workflows/main.yml
Normal file
@ -0,0 +1,54 @@
|
||||
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}}'
|
7
LICENSE.txt
Normal file
@ -0,0 +1,7 @@
|
||||
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.
|
43
README.md
@ -1,6 +1,43 @@
|
||||
# Système Foundry pour Ecryme v2 (French RPG, Open Sesam Games, Official)
|
||||
# Ecryme v2 system for FoundryVTT (French RPG, Open Sesam Games, Official)
|
||||
|
||||
# Developmement
|
||||
|
||||
Uberwald
|
||||
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
|
||||
|
||||
|
33
changelog.md
Normal file
@ -0,0 +1,33 @@
|
||||
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
|
4
images/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2024,3,15,11,30,15.103
|
||||
Version=4
|
||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
4
images/assets/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2024,3,15,11,30,26.235
|
||||
Version=4
|
||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
BIN
images/assets/ecryme_cephalie_01.png
Normal file
After Width: | Height: | Size: 208 KiB |
BIN
images/assets/ecryme_cephalie_02.png
Normal file
After Width: | Height: | Size: 55 KiB |
BIN
images/assets/ecryme_cephalie_03.png
Normal file
After Width: | Height: | Size: 63 KiB |
BIN
images/assets/ecryme_confrontation_01.png
Normal file
After Width: | Height: | Size: 171 KiB |
BIN
images/assets/ecryme_confrontation_02.png
Normal file
After Width: | Height: | Size: 353 KiB |
BIN
images/assets/ecryme_confrontation_03.png
Normal file
After Width: | Height: | Size: 100 KiB |
BIN
images/assets/ecryme_confrontation_04.png
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
images/assets/ecryme_landing_01.webp
Normal file
After Width: | Height: | Size: 388 KiB |
BIN
images/assets/ecryme_level.png
Normal file
After Width: | Height: | Size: 248 KiB |
4
images/ui/.directory
Normal file
@ -0,0 +1,4 @@
|
||||
[Dolphin]
|
||||
Timestamp=2024,3,15,11,30,19.681
|
||||
Version=4
|
||||
VisibleRoles=Details_text,Details_size,Details_modificationtime,Details_creationtime,CustomizedDetails
|
55
lang/en.json
@ -1,12 +1,16 @@
|
||||
{
|
||||
"TYPES": {
|
||||
"Actor": {
|
||||
"Personnage": "PC"
|
||||
"pc": "Player Character",
|
||||
"npc": "Non-Player Character",
|
||||
"annency": "Annency"
|
||||
},
|
||||
"Item": {
|
||||
"Trait": "Trait",
|
||||
"Weapon": "Weapon",
|
||||
"Equipment": "Equipment"
|
||||
"trait": "Trait",
|
||||
"weapon": "Weapon",
|
||||
"equipment": "Equipment",
|
||||
"maneuver": "Maneuver",
|
||||
"specialization": "Specialization"
|
||||
}
|
||||
},
|
||||
"ECRY": {
|
||||
@ -14,7 +18,8 @@
|
||||
"cogs": "Cogs",
|
||||
"cephaly": "Cephaly",
|
||||
"boheme": "Boheme",
|
||||
"amertume": "Amertume"
|
||||
"amertume": "Amertume",
|
||||
"gamelevel": "Game level"
|
||||
},
|
||||
"chat": {
|
||||
"formula": "Formula",
|
||||
@ -28,12 +33,27 @@
|
||||
"traitbonus": "Bonus trait",
|
||||
"traitmalus": "Malus trait",
|
||||
"bonusmalustraits": "Traits Bonus/Malus",
|
||||
"spectranscend": "Self-Transcend : "
|
||||
"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"
|
||||
},
|
||||
"warn": {
|
||||
"notenoughdice": "Execution and Preservation must have 2 dices allocated"
|
||||
},
|
||||
"ui": {
|
||||
"equipmentfree": "Equipments (free input)",
|
||||
"traitType": "Trait type",
|
||||
"niveauTrait": "Trait level",
|
||||
"weight": "Weight",
|
||||
@ -45,7 +65,7 @@
|
||||
"goldcoin": "Gold coin",
|
||||
"lige": "Lige",
|
||||
"hurle": "Howl",
|
||||
"coin": "Coin",
|
||||
"coin": "Penny",
|
||||
"notes": "Notes",
|
||||
"bio": "Bio",
|
||||
"bionotes": "Bio&Notes",
|
||||
@ -129,7 +149,26 @@
|
||||
"entelechy": "Entelechy",
|
||||
"mekany": "Mekany",
|
||||
"psyche": "Psyche",
|
||||
"scoria": "Scoria"
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
54
lang/fr.json
@ -1,12 +1,16 @@
|
||||
{
|
||||
"TYPES": {
|
||||
"Actor":{
|
||||
"Personnage": "PJ"
|
||||
"pc": "Personnage Joueur",
|
||||
"npc": "Personnage Non Joueur",
|
||||
"annency": "Anence"
|
||||
},
|
||||
"Item": {
|
||||
"Trait": "Trait",
|
||||
"Weapon": "Arme",
|
||||
"Equipment": "Equipement"
|
||||
"trait": "Trait",
|
||||
"weapon": "Arme",
|
||||
"equipment": "Equipement",
|
||||
"maneuver": "Manoeuvre",
|
||||
"specialization": "Spécialisation"
|
||||
}
|
||||
},
|
||||
"ECRY": {
|
||||
@ -14,7 +18,8 @@
|
||||
"cogs": "Engrenages",
|
||||
"cephaly": "Céphalie",
|
||||
"boheme": "Bohême",
|
||||
"amertume": "Amertume"
|
||||
"amertume": "Amertume",
|
||||
"gamelevel": "Niveau de jeu"
|
||||
},
|
||||
"chat": {
|
||||
"formula": "Formule",
|
||||
@ -28,12 +33,28 @@
|
||||
"traitbonus": "Trait bonus",
|
||||
"traitmalus": "Trait malus",
|
||||
"bonusmalustraits": "Bonus/Malus des Traits",
|
||||
"spectranscend": "Dépassement de soi : "
|
||||
"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"
|
||||
|
||||
},
|
||||
"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",
|
||||
@ -129,7 +150,26 @@
|
||||
"entelechy": "Entéléchie",
|
||||
"mekany": "Mekanë",
|
||||
"psyche": "Psyché",
|
||||
"scoria": "Scorie"
|
||||
"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"
|
||||
}
|
||||
}
|
||||
}
|
@ -11,7 +11,7 @@ export class EcrymeActorSheet extends ActorSheet {
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.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: duplicate(this.object.system),
|
||||
system: foundry.utils.duplicate(this.object.system),
|
||||
limited: this.object.limited,
|
||||
skills: this.actor.prepareSkills(),
|
||||
traits: this.actor.getRollTraits(),
|
||||
@ -41,17 +41,21 @@ export class EcrymeActorSheet extends ActorSheet {
|
||||
ideal: this.actor.getIdeal(),
|
||||
spleen: this.actor.getSpleen(),
|
||||
impacts: this.object.getImpacts(),
|
||||
config: duplicate(game.system.ecryme.config),
|
||||
config: foundry.utils.duplicate(game.system.ecryme.config),
|
||||
weapons: this.actor.getWeapons(),
|
||||
maneuvers: this.actor.getManeuvers(),
|
||||
impactsMalus: this.actor.getImpactsMalus(),
|
||||
archetype: duplicate(this.actor.getArchetype()),
|
||||
equipements: this.actor.getEquipments(),
|
||||
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: 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 }),
|
||||
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 }),
|
||||
options: this.options,
|
||||
owner: this.document.isOwner,
|
||||
editScore: this.options.editScore,
|
||||
@ -76,10 +80,19 @@ 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);
|
||||
});
|
||||
@ -119,6 +132,12 @@ 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")
|
||||
|
@ -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 duplicated actors) bypass the new actor creation logic
|
||||
// If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic
|
||||
if (data.items) {
|
||||
let actor = super.create(data, options);
|
||||
return actor;
|
||||
@ -54,6 +54,18 @@ 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');
|
||||
@ -61,13 +73,39 @@ export class EcrymeActor extends Actor {
|
||||
return comp;
|
||||
}
|
||||
getArchetype() {
|
||||
let comp = duplicate(this.items.find(item => item.type == 'archetype') || { name: "Pas d'archetype" })
|
||||
let comp = foundry.utils.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")
|
||||
@ -98,7 +136,7 @@ export class EcrymeActor extends Actor {
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
prepareSkills() {
|
||||
let skills = duplicate(this.system.skills)
|
||||
let skills = foundry.utils.duplicate(this.system.skills)
|
||||
for (let categKey in skills) {
|
||||
let category = skills[categKey]
|
||||
for (let skillKey in category.skilllist) {
|
||||
@ -110,17 +148,22 @@ export class EcrymeActor extends Actor {
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getCephalySkills() {
|
||||
let skills = duplicate(this.system.cephaly.skilllist)
|
||||
let skills = foundry.utils.duplicate(this.system.cephaly.skilllist)
|
||||
return skills
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getImpacts() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'impact') || [])
|
||||
let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'impact') || [])
|
||||
return comp;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
getWeapons() {
|
||||
let comp = duplicate(this.items.filter(item => item.type == 'weapon') || [])
|
||||
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') || [])
|
||||
EcrymeUtility.sortArrayObjectsByName(comp)
|
||||
return comp;
|
||||
}
|
||||
@ -128,7 +171,7 @@ export class EcrymeActor extends Actor {
|
||||
getItemById(id) {
|
||||
let item = this.items.find(item => item.id == id);
|
||||
if (item) {
|
||||
item = duplicate(item)
|
||||
item = foundry.utils.duplicate(item)
|
||||
}
|
||||
return item;
|
||||
}
|
||||
@ -158,12 +201,12 @@ export class EcrymeActor extends Actor {
|
||||
|
||||
/* ------------------------------------------- */
|
||||
getEquipments() {
|
||||
return this.items.filter(item => item.type == 'equipement')
|
||||
return this.items.filter(item => item.type == 'equipment')
|
||||
}
|
||||
|
||||
/* ------------------------------------------- */
|
||||
async buildContainerTree() {
|
||||
let equipments = duplicate(this.items.filter(item => item.type == "equipment") || [])
|
||||
let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || [])
|
||||
for (let equip1 of equipments) {
|
||||
if (equip1.system.iscontainer) {
|
||||
equip1.system.contents = []
|
||||
@ -258,13 +301,13 @@ export class EcrymeActor extends Actor {
|
||||
getSubActors() {
|
||||
let subActors = [];
|
||||
for (let id of this.system.subactors) {
|
||||
subActors.push(duplicate(game.actors.get(id)))
|
||||
subActors.push(foundry.utils.duplicate(game.actors.get(id)))
|
||||
}
|
||||
return subActors;
|
||||
}
|
||||
/* -------------------------------------------- */
|
||||
async addSubActor(subActorId) {
|
||||
let subActors = duplicate(this.system.subactors);
|
||||
let subActors = foundry.utils.duplicate(this.system.subactors);
|
||||
subActors.push(subActorId);
|
||||
await this.update({ 'system.subactors': subActors });
|
||||
}
|
||||
@ -306,7 +349,7 @@ export class EcrymeActor extends Actor {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
modifyConfrontBonus( modifier ) {
|
||||
let newBonus = this.system.internals.confrontbonus + bonus
|
||||
let newBonus = this.system.internals.confrontbonus + modifier
|
||||
this.update({'system.internals.confrontbonus': newBonus})
|
||||
}
|
||||
|
||||
@ -335,9 +378,10 @@ export class EcrymeActor extends Actor {
|
||||
rollData.actorId = this.id
|
||||
rollData.img = this.img
|
||||
rollData.isReroll = false
|
||||
rollData.traits = duplicate(this.getRollTraits())
|
||||
rollData.spleen = duplicate(this.getSpleen() || {})
|
||||
rollData.ideal = duplicate(this.getIdeal() || {})
|
||||
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.confrontBonus = this.getBonusList()
|
||||
|
||||
return rollData
|
||||
@ -345,14 +389,30 @@ 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)
|
||||
}
|
||||
|
||||
skill = duplicate(skill)
|
||||
rollData.skillLevelOptions = [];
|
||||
for (let i=0; i<=skill.value; i++) {
|
||||
rollData.skillLevelOptions[i] = `${i}`
|
||||
}
|
||||
|
||||
skill.categKey = categKey
|
||||
skill.skillKey = skillKey
|
||||
skill.spec = this.getSpecializations(skillKey)
|
||||
|
||||
rollData.skill = skill
|
||||
rollData.img = skill.img
|
||||
rollData.impactMalus = this.getImpactMalus(categKey)
|
||||
@ -368,6 +428,17 @@ 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)
|
||||
@ -376,8 +447,9 @@ export class EcrymeActor extends Actor {
|
||||
rollData.executionTotal = rollData.skill.value
|
||||
rollData.preservationTotal = rollData.skill.value
|
||||
rollData.applyTranscendence = "execution"
|
||||
rollData.traitsBonus = duplicate(rollData.traits)
|
||||
rollData.traitsMalus = duplicate(rollData.traits)
|
||||
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)
|
||||
}
|
||||
@ -385,19 +457,21 @@ export class EcrymeActor extends Actor {
|
||||
async rollCephalySkillConfront(skillKey) {
|
||||
let rollData = this.getCommonRollData()
|
||||
rollData.mode = "cephaly"
|
||||
rollData.skill = duplicate(this.system.cephaly.skilllist[skillKey])
|
||||
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.impactMalus = this.getImpactMalus(categKey)
|
||||
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)
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
async rollWeaponConfront(weaponId) {
|
||||
let weapon = this.items.get(weaponId)
|
||||
@ -408,10 +482,12 @@ export class EcrymeActor extends Actor {
|
||||
rollData = this.getCommonSkill("physical", "shooting")
|
||||
}
|
||||
rollData.mode = "weapon"
|
||||
rollData.weapon = duplicate(weapon)
|
||||
rollData.weapon = foundry.utils.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)
|
||||
@ -421,12 +497,12 @@ export class EcrymeActor extends Actor {
|
||||
rollWeapon(weaponId) {
|
||||
let weapon = this.items.get(weaponId)
|
||||
if (weapon) {
|
||||
weapon = duplicate(weapon)
|
||||
weapon = foundry.utils.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 = duplicate(this.system.attributs.habilite)
|
||||
rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite)
|
||||
}
|
||||
rollData.mode = "weapon"
|
||||
rollData.weapon = weapon
|
||||
|
143
modules/actors/ecryme-annency-sheet.js
Normal file
@ -0,0 +1,143 @@
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
}
|
@ -43,7 +43,7 @@ export class EcrymeCharacterSummary extends Application {
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
||||
template: "systems/fvtt-ecryme/templates/dialogs/character-summary.hbs",
|
||||
popOut: true,
|
||||
resizable: true,
|
||||
|
@ -10,14 +10,14 @@ export const ECRYME_CONFIG = {
|
||||
"melee": "ECRY.ui.melee",
|
||||
"ranged": "ECRY.ui.ranged"
|
||||
},
|
||||
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"}
|
||||
],
|
||||
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"}
|
||||
},
|
||||
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": {difficulty: "ECRY.ui.none", frequency: "ECRY.ui.none", value: "-1"},
|
||||
"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,6 +57,19 @@ 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"}
|
||||
}
|
||||
|
||||
}
|
@ -4,7 +4,32 @@ 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 __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 {
|
||||
|
||||
@ -56,6 +81,9 @@ 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"),
|
||||
@ -69,6 +97,7 @@ export class EcrymeUtility {
|
||||
"level_b": game.i18n.localize("ECRY.settings.boheme"),
|
||||
"level_a": game.i18n.localize("ECRY.settings.amertume"),
|
||||
},
|
||||
default: "level_a",
|
||||
restricted: true
|
||||
})
|
||||
|
||||
@ -81,6 +110,16 @@ export class EcrymeUtility {
|
||||
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() {
|
||||
@ -88,7 +127,7 @@ export class EcrymeUtility {
|
||||
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 = duplicate(category.skilllist[skillKey])
|
||||
let skill = foundry.utils.duplicate(category.skilllist[skillKey])
|
||||
skill.categKey = categKey // Auto reference the category
|
||||
game.system.ecryme.config.skills[skillKey] = skill
|
||||
}
|
||||
@ -141,10 +180,10 @@ export class EcrymeUtility {
|
||||
// Compute margin
|
||||
confront.marginExecution = this.confrontData1.executionTotal - this.confrontData2.preservationTotal
|
||||
confront.marginPreservation = this.confrontData1.preservationTotal - this.confrontData2.executionTotal
|
||||
console.log(confront.marginExecution, confront.marginPreservation)
|
||||
console.log(confront.marginExecution, confront.marginPreservation)
|
||||
// Filter margin
|
||||
let maxMargin // Dummy max
|
||||
if ( confront.marginExecution > 0) { // Successful hit
|
||||
if (confront.marginExecution > 0) { // Successful hit
|
||||
// Limit with skill+spec
|
||||
maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0)
|
||||
confront.marginExecution = Math.min(confront.marginExecution, maxMargin)
|
||||
@ -153,7 +192,7 @@ export class EcrymeUtility {
|
||||
confront.marginExecution = -Math.min(Math.abs(confront.marginExecution), maxMargin)
|
||||
}
|
||||
|
||||
if ( confront.marginPreservation > 0) { // Successful defense
|
||||
if (confront.marginPreservation > 0) { // Successful defense
|
||||
// Limit with skill+spec
|
||||
maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0)
|
||||
confront.marginPreservation = Math.min(confront.marginPreservation, maxMargin)
|
||||
@ -167,8 +206,8 @@ export class EcrymeUtility {
|
||||
if (confront.rollData1.weapon && confront.marginExecution > 0) {
|
||||
confront.effectExecution += confront.rollData1.weapon.system.effect
|
||||
confront.impactExecution = this.getImpactFromEffect(confront.effectExecution)
|
||||
}
|
||||
if ( confront.marginExecution < 0) {
|
||||
}
|
||||
if (confront.marginExecution < 0) {
|
||||
confront.bonus2 = -confront.marginExecution
|
||||
}
|
||||
confront.effectPreservation = confront.marginPreservation
|
||||
@ -176,18 +215,39 @@ export class EcrymeUtility {
|
||||
confront.effectPreservation = - (Math.abs(confront.marginPreservation) + confront.rollData2.weapon.system.effect)
|
||||
confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation))
|
||||
}
|
||||
if ( confront.marginPreservation > 0) {
|
||||
confront.bonus1 = -confront.marginPreservation
|
||||
if (confront.marginPreservation > 0) {
|
||||
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)
|
||||
})
|
||||
msg.setFlag("world", "ecryme-rolldata", confront)
|
||||
await 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) {
|
||||
@ -216,7 +276,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 && i <= rollData.skill.value && !rollData.transcendUsed && rollData.spec) {
|
||||
if (rollData.skill && rollData.skill.value >= i && !rollData.transcendUsed && rollData.spec) {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
@ -241,23 +301,27 @@ 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)
|
||||
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
|
||||
actor.modifyImpact($(event.currentTarget).data("impact-type"), $(event.currentTarget).data("impact"), 1)
|
||||
})
|
||||
})
|
||||
html.on("click", '.button-apply-bonus', event => {
|
||||
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
|
||||
let message = game.messages.get(messageId)
|
||||
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)
|
||||
actor.modifyConfrontBonus($(event.currentTarget).data("bonus"))
|
||||
})
|
||||
|
||||
}
|
||||
@ -341,16 +405,21 @@ export class EcrymeUtility {
|
||||
|
||||
let id = rollData.rollId
|
||||
let oldRollData = this.rollDataStore[id] || {}
|
||||
let newRollData = mergeObject(oldRollData, rollData)
|
||||
let newRollData = foundry.utils.mergeObject(oldRollData, rollData)
|
||||
this.rollDataStore[id] = newRollData
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async onSocketMesssage(msg) {
|
||||
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)
|
||||
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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -430,7 +499,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)
|
||||
}
|
||||
}
|
||||
@ -454,7 +523,7 @@ export class EcrymeUtility {
|
||||
}
|
||||
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
|
||||
rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0])
|
||||
diceFormula += "+2"
|
||||
diceFormula += "+" + (String(rollData.spec.system?.bonus) || "2")
|
||||
}
|
||||
rollData.bonusMalusTraits = 0
|
||||
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
|
||||
@ -463,7 +532,7 @@ export class EcrymeUtility {
|
||||
let trait = actor.getTrait(id)
|
||||
console.log(trait, id)
|
||||
rollData.traitsBonusList.push(trait)
|
||||
rollData.bonusMalusTraits += trait.system.level
|
||||
rollData.bonusMalusTraits += Math.abs(trait.system.level)
|
||||
}
|
||||
}
|
||||
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
|
||||
@ -471,12 +540,15 @@ export class EcrymeUtility {
|
||||
for (let id of rollData.traitsMalus) {
|
||||
let trait = actor.getTrait(id)
|
||||
rollData.traitsMalusList.push(trait)
|
||||
rollData.bonusMalusTraits -= trait.system.level
|
||||
rollData.bonusMalusTraits -= Math.abs(trait.system.level)
|
||||
}
|
||||
}
|
||||
diceFormula += "+" + rollData.bonusMalusTraits
|
||||
diceFormula += "+" + rollData.bonusMalusPerso
|
||||
diceFormula += "+" + rollData.impactMalus
|
||||
if (rollData.annency) {
|
||||
diceFormula += "+" + rollData.annencyBonus
|
||||
}
|
||||
rollData.diceFormula = diceFormula
|
||||
return diceFormula
|
||||
}
|
||||
@ -486,7 +558,7 @@ export class EcrymeUtility {
|
||||
|
||||
let actor = game.actors.get(rollData.actorId)
|
||||
// Fix difficulty
|
||||
if (!rollData.difficulty || rollData.difficulty == "-") {
|
||||
if (!rollData.difficulty || rollData.difficulty == "-1") {
|
||||
rollData.difficulty = 0
|
||||
}
|
||||
rollData.difficulty = Number(rollData.difficulty)
|
||||
@ -494,9 +566,9 @@ export class EcrymeUtility {
|
||||
let diceFormula = this.computeRollFormula(rollData, actor)
|
||||
|
||||
// Performs roll
|
||||
let myRoll = new Roll(diceFormula).roll({ async: false })
|
||||
let myRoll = await new Roll(diceFormula).roll()
|
||||
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
||||
rollData.roll = duplicate(myRoll)
|
||||
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||
rollData.total = myRoll.total
|
||||
rollData.diceSum = myRoll.terms[0].total
|
||||
|
||||
@ -505,7 +577,7 @@ export class EcrymeUtility {
|
||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
|
||||
})
|
||||
msg.setFlag("world", "ecryme-rolldata", rollData)
|
||||
await msg.setFlag("world", "ecryme-rolldata", rollData)
|
||||
console.log("Rolldata result", rollData)
|
||||
}
|
||||
|
||||
@ -522,7 +594,7 @@ export class EcrymeUtility {
|
||||
let msg = await this.createChatWithRollMode(rollData.alias, {
|
||||
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
|
||||
})
|
||||
msg.setFlag("world", "ecryme-rolldata", rollData)
|
||||
await msg.setFlag("world", "ecryme-rolldata", rollData)
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -566,12 +638,10 @@ export class EcrymeUtility {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
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 });
|
||||
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 });
|
||||
}
|
||||
|
||||
|
||||
@ -591,18 +661,14 @@ export class EcrymeUtility {
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
|
||||
/* -------------------------------------------- */
|
||||
static async createChatMessage(name, rollMode, chatOptions) {
|
||||
switch (rollMode) {
|
||||
case "blindroll": // GM only
|
||||
if (!game.user.isGM) {
|
||||
this.blindMessageToGM(chatOptions);
|
||||
|
||||
chatOptions.whisper = [game.user.id];
|
||||
chatOptions.content = "Message only to the GM";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
chatOptions.whisper = this.getUsers(user => user.isGM);
|
||||
}
|
||||
break;
|
||||
@ -617,19 +683,20 @@ export class EcrymeUtility {
|
||||
/* -------------------------------------------- */
|
||||
static getBasicRollData() {
|
||||
let rollData = {
|
||||
rollId: randomID(16),
|
||||
rollId: foundry.utils.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: "-",
|
||||
difficulty: "-1",
|
||||
useSpleen: false,
|
||||
useIdeal: false,
|
||||
impactMalus: 0,
|
||||
config: duplicate(game.system.ecryme.config)
|
||||
config: foundry.utils.duplicate(game.system.ecryme.config)
|
||||
}
|
||||
EcrymeUtility.updateWithTarget(rollData)
|
||||
return rollData
|
||||
|
@ -6,7 +6,7 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
/* -------------------------------------------- */
|
||||
static async create(actor, rollData) {
|
||||
|
||||
let options = mergeObject(super.defaultOptions, {
|
||||
let options = foundry.utils.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,6 +50,7 @@ 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)
|
||||
}
|
||||
@ -82,13 +83,24 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
let button = this.buttonDisabled
|
||||
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 = {}
|
||||
//console.log("DRAGTYPE", dragType)
|
||||
console.log("DRAGTYPE", dragType)
|
||||
if (dragType == "dice") {
|
||||
diceData = {
|
||||
dragType: "dice",
|
||||
@ -111,7 +123,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"
|
||||
@ -151,9 +163,9 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
// Apply Transcend if needed
|
||||
if (this.rollData.skillTranscendence > 0) {
|
||||
if (this.rollData.applyTranscendence == "execution") {
|
||||
this.rollData.executionTotal += this.rollData.skillTranscendence
|
||||
this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
|
||||
} else {
|
||||
this.rollData.preservationTotal += this.rollData.skillTranscendence
|
||||
this.rollData.preservationTotal += Number(this.rollData.skillTranscendence)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -180,7 +192,7 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
this.processTranscendence()
|
||||
|
||||
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
|
||||
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
|
||||
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
|
||||
rollData.specApplied = true
|
||||
rollData.executionTotal += 2
|
||||
rollData.preservationTotal += 2
|
||||
@ -200,19 +212,19 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
for (let id of rollData.traitsBonusSelected) {
|
||||
let trait = rollData.traitsBonus.find(t => t._id == id)
|
||||
trait.activated = true
|
||||
rollData.bonusMalusTraits += trait.system.level
|
||||
rollData.bonusMalusTraits += Number(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 -= trait.system.level
|
||||
rollData.bonusMalusTraits -= Number(trait.system.level)
|
||||
}
|
||||
}
|
||||
|
||||
rollData.executionTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
|
||||
rollData.preservationTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
|
||||
rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
|
||||
rollData.preservationTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
|
||||
|
||||
this.refreshDialog()
|
||||
}
|
||||
@ -222,7 +234,7 @@ export class EcrymeConfrontDialog extends Dialog {
|
||||
super.activateListeners(html);
|
||||
|
||||
html.find('#bonusMalusPerso').change((event) => {
|
||||
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
|
||||
this.rollData.bonusMalusPerso = event.currentTarget.value
|
||||
this.computeTotals()
|
||||
})
|
||||
html.find('#roll-specialization').change((event) => {
|
||||
@ -245,7 +257,9 @@ 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)
|
||||
})
|
||||
|
||||
}
|
||||
}
|
@ -50,15 +50,15 @@ export class EcrymeConfrontStartDialog extends Dialog {
|
||||
/* -------------------------------------------- */
|
||||
async rollConfront( diceFormula ) {
|
||||
// Do the initial roll
|
||||
let myRoll = new Roll(diceFormula).roll({async: false})
|
||||
let myRoll = await new Roll(diceFormula).roll()
|
||||
await EcrymeUtility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
|
||||
// Fill the available dice table
|
||||
let rollData = this.rollData
|
||||
rollData.roll = duplicate(myRoll)
|
||||
rollData.roll = foundry.utils.duplicate(myRoll)
|
||||
rollData.availableDices = []
|
||||
for (let result of myRoll.terms[0].results) {
|
||||
if ( !result.discarded) {
|
||||
let resultDup = duplicate(result)
|
||||
let resultDup = foundry.utils.duplicate(result)
|
||||
resultDup.location = "mainpool"
|
||||
rollData.availableDices.push(resultDup)
|
||||
}
|
||||
|
@ -58,6 +58,7 @@ 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) => {
|
||||
|
@ -11,6 +11,7 @@
|
||||
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";
|
||||
@ -58,13 +59,16 @@ 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", EcrymeNPCSheet, { types: ["pnj"], makeDefault: false });
|
||||
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["npc"], makeDefault: true });
|
||||
Actors.registerSheet("fvtt-ecryme", EcrymeAnnencySheet, { types: ["annency"], makeDefault: false });
|
||||
|
||||
Items.unregisterSheet("core", ItemSheet);
|
||||
Items.registerSheet("fvtt-ecryme", EcrymeItemSheet, { makeDefault: true });
|
||||
|
||||
EcrymeUtility.init()
|
||||
|
||||
Babele.get().setSystemTranslationsDir("translated")
|
||||
|
||||
});
|
||||
|
||||
/* -------------------------------------------- */
|
||||
@ -79,28 +83,13 @@ function welcomeMessage() {
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
// 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)
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,10 +107,17 @@ Hooks.once("ready", function () {
|
||||
});
|
||||
}
|
||||
|
||||
registerUsageCount(game.system.id)
|
||||
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.")
|
||||
)
|
||||
|
||||
welcomeMessage();
|
||||
EcrymeUtility.ready()
|
||||
EcrymeCharacterSummary.ready()
|
||||
EcrymeUtility.ready();
|
||||
EcrymeCharacterSummary.ready();
|
||||
importDefaultScene();
|
||||
|
||||
})
|
||||
|
||||
|
@ -8,7 +8,7 @@ export class EcrymeItemSheet extends ItemSheet {
|
||||
|
||||
/** @override */
|
||||
static get defaultOptions() {
|
||||
return mergeObject(super.defaultOptions, {
|
||||
return foundry.utils.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: duplicate(this.object.system),
|
||||
config: duplicate(game.system.ecryme.config),
|
||||
system: foundry.utils.duplicate(this.object.system),
|
||||
config: foundry.utils.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 = duplicate(this.item)
|
||||
let chatData = foundry.utils.duplicate(this.item)
|
||||
if (this.actor) {
|
||||
chatData.actor = { id: this.actor.id };
|
||||
}
|
||||
|
BIN
packs/equipment/000158.ldb
Normal file
0
packs/equipment/000165.log
Normal file
1
packs/equipment/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000163
|
0
packs/equipment/LOCK
Normal file
7
packs/equipment/LOG
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/27-08:47:55.410828 7fc5c4c006c0 Recovering log #161
|
||||
2024/04/27-08:47:55.422094 7fc5c4c006c0 Delete type=3 #159
|
||||
2024/04/27-08:47:55.422190 7fc5c4c006c0 Delete type=0 #161
|
||||
2024/04/27-09:26:42.196858 7fc5bfe006c0 Level-0 table #166: started
|
||||
2024/04/27-09:26:42.196924 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
|
||||
2024/04/27-09:26:42.203539 7fc5bfe006c0 Delete type=0 #164
|
||||
2024/04/27-09:26:42.227249 7fc5bfe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
|
7
packs/equipment/LOG.old
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/26-19:22:08.707793 7f89060006c0 Recovering log #156
|
||||
2024/04/26-19:22:08.718085 7f89060006c0 Delete type=3 #154
|
||||
2024/04/26-19:22:08.718160 7f89060006c0 Delete type=0 #156
|
||||
2024/04/26-19:25:18.674002 7f88ffe006c0 Level-0 table #162: started
|
||||
2024/04/26-19:25:18.674046 7f88ffe006c0 Level-0 table #162: 0 bytes OK
|
||||
2024/04/26-19:25:18.715930 7f88ffe006c0 Delete type=0 #160
|
||||
2024/04/26-19:25:18.747436 7f88ffe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
|
BIN
packs/equipment/MANIFEST-000163
Normal file
BIN
packs/help/000095.ldb
Normal file
0
packs/help/000102.log
Normal file
1
packs/help/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000100
|
0
packs/help/LOCK
Normal file
8
packs/help/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/04/27-08:47:55.474153 7fc5c56006c0 Recovering log #98
|
||||
2024/04/27-08:47:55.484458 7fc5c56006c0 Delete type=3 #96
|
||||
2024/04/27-08:47:55.484547 7fc5c56006c0 Delete type=0 #98
|
||||
2024/04/27-09:26:42.227493 7fc5bfe006c0 Level-0 table #103: started
|
||||
2024/04/27-09:26:42.227557 7fc5bfe006c0 Level-0 table #103: 0 bytes OK
|
||||
2024/04/27-09:26:42.234320 7fc5bfe006c0 Delete type=0 #101
|
||||
2024/04/27-09:26:42.234536 7fc5bfe006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
|
||||
2024/04/27-09:26:42.234577 7fc5bfe006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
|
8
packs/help/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/04/26-19:22:08.762783 7f89074006c0 Recovering log #93
|
||||
2024/04/26-19:22:08.773921 7f89074006c0 Delete type=3 #91
|
||||
2024/04/26-19:22:08.774007 7f89074006c0 Delete type=0 #93
|
||||
2024/04/26-19:25:18.785678 7f88ffe006c0 Level-0 table #99: started
|
||||
2024/04/26-19:25:18.785720 7f88ffe006c0 Level-0 table #99: 0 bytes OK
|
||||
2024/04/26-19:25:18.821605 7f88ffe006c0 Delete type=0 #97
|
||||
2024/04/26-19:25:18.901806 7f88ffe006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-19:25:18.901870 7f88ffe006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
|
BIN
packs/help/MANIFEST-000100
Normal file
BIN
packs/maneuvers/000158.ldb
Normal file
0
packs/maneuvers/000165.log
Normal file
1
packs/maneuvers/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000163
|
0
packs/maneuvers/LOCK
Normal file
7
packs/maneuvers/LOG
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/27-08:47:55.459426 7fc5c4c006c0 Recovering log #161
|
||||
2024/04/27-08:47:55.470519 7fc5c4c006c0 Delete type=3 #159
|
||||
2024/04/27-08:47:55.470616 7fc5c4c006c0 Delete type=0 #161
|
||||
2024/04/27-09:26:42.211453 7fc5bfe006c0 Level-0 table #166: started
|
||||
2024/04/27-09:26:42.211516 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
|
||||
2024/04/27-09:26:42.218445 7fc5bfe006c0 Delete type=0 #164
|
||||
2024/04/27-09:26:42.227295 7fc5bfe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
|
7
packs/maneuvers/LOG.old
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/26-19:22:08.749669 7f8906a006c0 Recovering log #156
|
||||
2024/04/26-19:22:08.759716 7f8906a006c0 Delete type=3 #154
|
||||
2024/04/26-19:22:08.759885 7f8906a006c0 Delete type=0 #156
|
||||
2024/04/26-19:25:18.747562 7f88ffe006c0 Level-0 table #162: started
|
||||
2024/04/26-19:25:18.747596 7f88ffe006c0 Level-0 table #162: 0 bytes OK
|
||||
2024/04/26-19:25:18.785476 7f88ffe006c0 Delete type=0 #160
|
||||
2024/04/26-19:25:18.901779 7f88ffe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
|
BIN
packs/maneuvers/MANIFEST-000163
Normal file
BIN
packs/scenes/000042.ldb
Normal file
0
packs/scenes/000049.log
Normal file
1
packs/scenes/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000047
|
0
packs/scenes/LOCK
Normal file
8
packs/scenes/LOG
Normal file
@ -0,0 +1,8 @@
|
||||
2024/04/27-08:47:55.443420 7fc5c4c006c0 Recovering log #45
|
||||
2024/04/27-08:47:55.454090 7fc5c4c006c0 Delete type=3 #43
|
||||
2024/04/27-08:47:55.454232 7fc5c4c006c0 Delete type=0 #45
|
||||
2024/04/27-09:26:42.203748 7fc5bfe006c0 Level-0 table #50: started
|
||||
2024/04/27-09:26:42.203807 7fc5bfe006c0 Level-0 table #50: 0 bytes OK
|
||||
2024/04/27-09:26:42.211166 7fc5bfe006c0 Delete type=0 #48
|
||||
2024/04/27-09:26:42.227275 7fc5bfe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
|
||||
2024/04/27-09:26:42.227330 7fc5bfe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
|
8
packs/scenes/LOG.old
Normal file
@ -0,0 +1,8 @@
|
||||
2024/04/26-19:22:08.735377 7f89074006c0 Recovering log #40
|
||||
2024/04/26-19:22:08.745776 7f89074006c0 Delete type=3 #38
|
||||
2024/04/26-19:22:08.745887 7f89074006c0 Delete type=0 #40
|
||||
2024/04/26-19:25:18.595904 7f88ffe006c0 Level-0 table #46: started
|
||||
2024/04/26-19:25:18.595980 7f88ffe006c0 Level-0 table #46: 0 bytes OK
|
||||
2024/04/26-19:25:18.630930 7f88ffe006c0 Delete type=0 #44
|
||||
2024/04/26-19:25:18.747411 7f88ffe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
|
||||
2024/04/26-19:25:18.747487 7f88ffe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
|
BIN
packs/scenes/MANIFEST-000047
Normal file
BIN
packs/specialisation/000158.ldb
Normal file
0
packs/specialisation/000165.log
Normal file
1
packs/specialisation/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000163
|
0
packs/specialisation/LOCK
Normal file
7
packs/specialisation/LOG
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/27-08:47:55.395447 7fc5c56006c0 Recovering log #161
|
||||
2024/04/27-08:47:55.406766 7fc5c56006c0 Delete type=3 #159
|
||||
2024/04/27-08:47:55.406871 7fc5c56006c0 Delete type=0 #161
|
||||
2024/04/27-09:26:42.188991 7fc5bfe006c0 Level-0 table #166: started
|
||||
2024/04/27-09:26:42.189072 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
|
||||
2024/04/27-09:26:42.196426 7fc5bfe006c0 Delete type=0 #164
|
||||
2024/04/27-09:26:42.196728 7fc5bfe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
|
7
packs/specialisation/LOG.old
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/26-19:22:08.694940 7f89056006c0 Recovering log #156
|
||||
2024/04/26-19:22:08.705096 7f89056006c0 Delete type=3 #154
|
||||
2024/04/26-19:22:08.705158 7f89056006c0 Delete type=0 #156
|
||||
2024/04/26-19:25:18.631092 7f88ffe006c0 Level-0 table #162: started
|
||||
2024/04/26-19:25:18.631157 7f88ffe006c0 Level-0 table #162: 0 bytes OK
|
||||
2024/04/26-19:25:18.673806 7f88ffe006c0 Delete type=0 #160
|
||||
2024/04/26-19:25:18.747426 7f88ffe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
|
BIN
packs/specialisation/MANIFEST-000163
Normal file
BIN
packs/traits/000158.ldb
Normal file
0
packs/traits/000165.log
Normal file
1
packs/traits/CURRENT
Normal file
@ -0,0 +1 @@
|
||||
MANIFEST-000163
|
0
packs/traits/LOCK
Normal file
7
packs/traits/LOG
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/27-08:47:55.428744 7fc5c56006c0 Recovering log #161
|
||||
2024/04/27-08:47:55.439052 7fc5c56006c0 Delete type=3 #159
|
||||
2024/04/27-08:47:55.439149 7fc5c56006c0 Delete type=0 #161
|
||||
2024/04/27-09:26:42.218635 7fc5bfe006c0 Level-0 table #166: started
|
||||
2024/04/27-09:26:42.218676 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
|
||||
2024/04/27-09:26:42.227027 7fc5bfe006c0 Delete type=0 #164
|
||||
2024/04/27-09:26:42.227313 7fc5bfe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
|
7
packs/traits/LOG.old
Normal file
@ -0,0 +1,7 @@
|
||||
2024/04/26-19:22:08.721470 7f8906a006c0 Recovering log #156
|
||||
2024/04/26-19:22:08.732531 7f8906a006c0 Delete type=3 #154
|
||||
2024/04/26-19:22:08.732624 7f8906a006c0 Delete type=0 #156
|
||||
2024/04/26-19:25:18.716069 7f88ffe006c0 Level-0 table #162: started
|
||||
2024/04/26-19:25:18.716099 7f88ffe006c0 Level-0 table #162: 0 bytes OK
|
||||
2024/04/26-19:25:18.747273 7f88ffe006c0 Delete type=0 #160
|
||||
2024/04/26-19:25:18.747446 7f88ffe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
|
BIN
packs/traits/MANIFEST-000163
Normal file
@ -1265,6 +1265,7 @@ ul, li {
|
||||
min-width: 12rem;
|
||||
}
|
||||
.item-name-label-short {
|
||||
margin-top: 4px;
|
||||
flex-grow:1;
|
||||
max-width: 4rem;
|
||||
min-width: 4rem;
|
||||
@ -1275,6 +1276,16 @@ 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;
|
||||
@ -1287,10 +1298,17 @@ 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;
|
||||
@ -1321,12 +1339,21 @@ 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;
|
||||
|
@ -1245,6 +1245,7 @@ ul, li {
|
||||
min-width: 12rem;
|
||||
}
|
||||
.item-name-label-short {
|
||||
margin-top: 4px;
|
||||
flex-grow:1;
|
||||
max-width: 4rem;
|
||||
min-width: 4rem;
|
||||
@ -1255,6 +1256,16 @@ 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;
|
||||
@ -1267,10 +1278,17 @@ 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;
|
||||
@ -1301,12 +1319,21 @@ 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;
|
||||
|
93
system.json
@ -26,12 +26,84 @@
|
||||
}
|
||||
],
|
||||
"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/uberwald/fvtt-ecryme/raw/branch/master/system.json",
|
||||
"manifest": "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/system.json",
|
||||
"compatibility": {
|
||||
"minimum": "10",
|
||||
"verified": "11"
|
||||
"minimum": "11",
|
||||
"verified": "12"
|
||||
},
|
||||
"id": "fvtt-ecryme",
|
||||
"primaryTokenAttribute": "secondary.health",
|
||||
@ -40,9 +112,18 @@
|
||||
"styles": [
|
||||
"styles/ecryme.css"
|
||||
],
|
||||
"relationships": {
|
||||
"requires": [
|
||||
{
|
||||
"id": "babele",
|
||||
"type": "module",
|
||||
"compatibility": {}
|
||||
}
|
||||
]
|
||||
},
|
||||
"title": "Ecryme, le Jeu de Rôles",
|
||||
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme",
|
||||
"version": "11.0.7",
|
||||
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.7.zip",
|
||||
"url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
|
||||
"version": "12.0.1",
|
||||
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v12.0.1.zip",
|
||||
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
|
||||
}
|
@ -1,7 +1,7 @@
|
||||
{
|
||||
"Actor": {
|
||||
"types": [
|
||||
"pc"
|
||||
"pc","annency", "npc"
|
||||
],
|
||||
"templates": {
|
||||
"biodata": {
|
||||
@ -24,9 +24,11 @@
|
||||
},
|
||||
"core": {
|
||||
"subactors": [],
|
||||
"equipmentfree": "",
|
||||
"skills": {
|
||||
"physical": {
|
||||
"name": "ECRY.ui.physical",
|
||||
"pnjvalue": 0,
|
||||
"skilllist": {
|
||||
"athletics": {
|
||||
"name": "ECRY.ui.athletics",
|
||||
@ -57,6 +59,7 @@
|
||||
},
|
||||
"mental": {
|
||||
"name": "ECRY.ui.mental",
|
||||
"pnjvalue": 0,
|
||||
"skilllist": {
|
||||
"anthropomecanology": {
|
||||
"name": "ECRY.ui.anthropomecanology",
|
||||
@ -87,6 +90,7 @@
|
||||
},
|
||||
"social": {
|
||||
"name": "ECRY.ui.social",
|
||||
"pnjvalue": 0,
|
||||
"skilllist": {
|
||||
"quibbling": {
|
||||
"name": "ECRY.ui.quibbling",
|
||||
@ -173,8 +177,35 @@
|
||||
"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": [
|
||||
"biodata",
|
||||
@ -188,10 +219,7 @@
|
||||
"trait",
|
||||
"weapon",
|
||||
"specialization",
|
||||
"annency",
|
||||
"boheme",
|
||||
"contact",
|
||||
"confrontation"
|
||||
"maneuver"
|
||||
],
|
||||
"templates": {
|
||||
"common": {
|
||||
@ -203,6 +231,11 @@
|
||||
"costunit": ""
|
||||
}
|
||||
},
|
||||
"maneuver": {
|
||||
"templates": [
|
||||
"common"
|
||||
]
|
||||
},
|
||||
"confrontation": {
|
||||
"templates": [
|
||||
"common"
|
||||
@ -237,6 +270,7 @@
|
||||
"effect": 0
|
||||
},
|
||||
"specialization": {
|
||||
"bonus": 2,
|
||||
"templates": [
|
||||
"common"
|
||||
],
|
||||
|
@ -15,27 +15,40 @@
|
||||
<div class="flexrow">
|
||||
<ul>
|
||||
<li class="flexrow item" data-item-id="{{spleen.id}}">
|
||||
<label class="item-name-label-medium">Spleen :</label>
|
||||
<label class="item-field-label-short">Spleen :</label>
|
||||
<label class="item-name-label-long">{{spleen.name}}</label>
|
||||
<div class="item-filler"> </div>
|
||||
{{#if spleen}}
|
||||
<div class="item-controls item-controls-fixed">
|
||||
<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>
|
||||
<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-plus"></i></a>
|
||||
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
{{/if}}
|
||||
</li>
|
||||
<li class="item flexrow" data-item-id="{{ideal.id}}">
|
||||
<label class="item-name-label-medium">Ideal :</label>
|
||||
<label class="item-field-label-short">Ideal :</label>
|
||||
<label class="item-name-label-long">{{ideal.name}}</label>
|
||||
<div class="item-filler"> </div>
|
||||
{{#if ideal}}
|
||||
<div class="item-controls item-controls-fixed">
|
||||
<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>
|
||||
<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-plus"></i></a>
|
||||
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
|
||||
class="fas fa-trash"></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>, </label>
|
||||
{{/each}}
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
@ -72,10 +85,29 @@
|
||||
<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><label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus
|
||||
categkey}})</label></h3>
|
||||
<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>
|
||||
</span>
|
||||
</li>
|
||||
|
||||
{{#each category.skilllist as |skill skillkey|}}
|
||||
<li class="item flexrow list-item">
|
||||
<span class="item-name-label-long">
|
||||
@ -89,26 +121,23 @@
|
||||
<select class="item-field-label-short" type="text"
|
||||
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}"
|
||||
data-dtype="Number">
|
||||
{{#select skill.value}}
|
||||
{{#each @root.config.skillLevel as |level key| }}
|
||||
<option value="{{level}}">{{level}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions @root.config.skillLevel selected=skill.value}}
|
||||
</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-spec-id="{{spec._id}}">
|
||||
<a class="roll-spec" data-category-key="{{categkey}}" data-skill-key="{{skillkey}}"
|
||||
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-add" data-type="specialization" title="Delete Item"><i
|
||||
class="fas fa-plus"></i></a>
|
||||
<a class="item-control item-delete" data-type="specialization" title="Delete Item"><i
|
||||
class="fas fa-trash"></i></a>
|
||||
</div>
|
||||
</li>
|
||||
{{/each}}
|
||||
@ -125,8 +154,12 @@
|
||||
{{#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">
|
||||
@ -135,19 +168,33 @@
|
||||
<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">
|
||||
{{#select skill.value}}
|
||||
{{#each @root.config.skillLevel as |level key| }}
|
||||
<option value="{{level}}">{{level}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
<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}}
|
||||
|
||||
@ -226,61 +273,48 @@
|
||||
{{/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"> </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 equipment" data-group="primary" data-tab="equipment">
|
||||
<div class="tab equipements" data-group="primary" data-tab="equipements">
|
||||
|
||||
<span class="item-name-label-header items-title-bg">
|
||||
<h3><label class="items-title-text">Equipements (saisie libre)</label></h3>
|
||||
<h3><label class="items-title-text">{{localize "ECRY.ui.equipmentfree"}}</label></h3>
|
||||
</span>
|
||||
<div class="form-group small-editor">
|
||||
{{editor equipementlibre target="system.equipementlibre" button=true owner=owner editable=editable}}
|
||||
{{editor equipementlibre target="system.equipmentfree" 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">Armes</label></h3>
|
||||
<h3><label class="items-title-text">{{localize "ECRY.ui.equipment"}}s</label></h3>
|
||||
</span>
|
||||
<span class="item-field-label-medium">
|
||||
<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"> </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>
|
||||
<label class="item-field-label-medium">{{localize "ECRY.ui.weight"}}</label>
|
||||
</span>
|
||||
<div class="item-filler"> </div>
|
||||
<div class="item-controls item-controls-fixed">
|
||||
@ -288,11 +322,12 @@
|
||||
</div>
|
||||
|
||||
</li>
|
||||
{{#each equipements as |equip key|}}
|
||||
{{#each equipments 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"> </div>
|
||||
<div class="item-controls item-controls-fixed">
|
||||
@ -302,36 +337,6 @@
|
||||
{{/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"> </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"> </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>
|
||||
@ -343,7 +348,7 @@
|
||||
<div>
|
||||
<ul class="item-list alternate-list">
|
||||
<li class="item flexrow">
|
||||
<label class="item-name-label-medium">Lieu de naissance</label>
|
||||
<label class="item-name-label-medium">{{localize "ECRY.ui.bornplace"}}</label>
|
||||
<input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}"
|
||||
data-dtype="String" />
|
||||
</li>
|
||||
@ -352,22 +357,27 @@
|
||||
<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">Résidence</label>
|
||||
<label class="item-name-label-medium">{{localize "ECRY.ui.residence"}}</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">Nationalité</label>
|
||||
<label class="item-name-label-medium">{{localize "ECRY.ui.origin"}}</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">Enfance</label>
|
||||
<label class="item-name-label-medium">{{localize "ECRY.ui.childhood"}}</label>
|
||||
<input type="text" class="" name="system.biodata.enfance" value="{{system.biodata.enfance}}"
|
||||
data-dtype="String" />
|
||||
</li>
|
||||
|
138
templates/actors/annency-sheet.hbs
Normal file
@ -0,0 +1,138 @@
|
||||
<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"> </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>
|
37
templates/chat/chat-cephaly-result.hbs
Normal file
@ -0,0 +1,37 @@
|
||||
<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>
|
@ -15,13 +15,58 @@
|
||||
|
||||
<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}} (+2) </li>
|
||||
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}}) </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>
|
||||
<button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button>
|
||||
|
||||
{{#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>
|
@ -21,7 +21,7 @@
|
||||
{{#if skill}}
|
||||
<li>{{localize skill.name}}: {{skill.value}} </li>
|
||||
{{#if spec}}
|
||||
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+2) </li>
|
||||
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}}) </li>
|
||||
{{/if}}
|
||||
{{/if}}
|
||||
|
||||
|
@ -55,20 +55,13 @@
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
|
||||
<select class="" id="roll-select-transcendence" data-type="Number">
|
||||
{{#select skillTranscendence}}
|
||||
{{#for 0 skill.value 1}}
|
||||
<option value="{{this}}">{{this}}</option>
|
||||
{{/for}}
|
||||
{{/select}}
|
||||
{{selectOptions config.skillLevel selected=skillTranscendence}}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">{{localize "ECRY.ui.transcendapply"}} : </span>
|
||||
<select class="" id="roll-apply-transcendence" data-type="String">
|
||||
{{#select applyTranscendence}}
|
||||
<option value="execution">{{localize "ECRY.ui.execution"}}</option>
|
||||
<option value="preservation">{{localize "ECRY.ui.preservation"}}</option>
|
||||
{{/select}}
|
||||
{{selectOptions config.transcendanceOptions selected=applyTranscendence localize=true}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
@ -100,19 +93,29 @@
|
||||
{{/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">
|
||||
<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">
|
||||
{{#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 id="bonusMalusPerso" name="bonusMalusPerso" type="text" data-dtype="String">
|
||||
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
@ -14,22 +14,25 @@
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
|
||||
<select class="" id="roll-select-transcendence" data-type="Number">
|
||||
{{#select skillTranscendence}}
|
||||
{{#for 0 skill.value 1}}
|
||||
<option value="{{this}}">{{this}}</option>
|
||||
{{/for}}
|
||||
{{/select}}
|
||||
{{selectOptions config.skillLevel selected=skillTranscendence}}
|
||||
</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}}</option>
|
||||
<option value="{{spec.id}}">{{spec.name}} (+{{spec.system.bonus}})</option>
|
||||
{{/each}}
|
||||
</select>
|
||||
</div>
|
||||
{{/if}}
|
||||
|
||||
{{#if spleen}}
|
||||
<div class="flexrow">
|
||||
@ -68,16 +71,8 @@
|
||||
|
||||
<div class="flexrow">
|
||||
<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>
|
||||
{{/select}}
|
||||
<select type="text" id="bonusMalusPerso" name="bonusMalusPerso" data-dtype="String">
|
||||
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
@ -12,13 +12,8 @@
|
||||
|
||||
<div class="flexrow">
|
||||
<span class="roll-dialog-label">Difficulté : </span>
|
||||
<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 class="" type="text" id="roll-difficulty" data-dtype="String">
|
||||
{{selectOptions config.difficulty selected=difficulty localize=true labelAttr="difficulty"}}
|
||||
</select>
|
||||
</div>
|
||||
|
||||
|
@ -22,22 +22,14 @@
|
||||
<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">
|
||||
{{#select system.impacttype}}
|
||||
{{#each config.impactTypes as |type key| }}
|
||||
<option value="{{key}}">{{localize type}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.impactTypes selected=system.impacttype localize=true }}
|
||||
</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">
|
||||
{{#select system.impactlevel}}
|
||||
{{#each config.impactLevels as |level key| }}
|
||||
<option value="{{key}}">{{localize level}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.impactLevels selected=system.impactlevel localize=true }}
|
||||
</select>
|
||||
</li>
|
||||
</ul>
|
||||
|
27
templates/items/item-maneuver-sheet.hbs
Normal file
@ -0,0 +1,27 @@
|
||||
<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">
|
||||
|
||||
<div class="tab" data-group="primary">
|
||||
<ul>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
</form>
|
@ -22,14 +22,15 @@
|
||||
<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">
|
||||
{{#select system.skillkey}}
|
||||
{{#each config.skills as |skill key| }}
|
||||
<option value="{{key}}">{{localize skill.name}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.skills selected=system.skillkey localize=true valueAttr="key" labelAttr="name"}}
|
||||
</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>
|
||||
|
@ -22,23 +22,14 @@
|
||||
<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">
|
||||
{{#select system.traitype}}
|
||||
{{#each config.traitTypes as |type key| }}
|
||||
<option value="{{key}}">{{type}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.traitTypes selected=system.traitype}}
|
||||
</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="Number">
|
||||
{{#select system.level}}
|
||||
{{#each config.traitLevel as |level key| }}
|
||||
<option value="{{level.value}}">{{level.text}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
</select>
|
||||
<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"}}
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
@ -22,11 +22,7 @@
|
||||
<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">
|
||||
{{#select system.weapontype}}
|
||||
{{#each config.weaponTypes as |type key| }}
|
||||
<option value="{{key}}">{{localize type}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.weaponTypes selected=system.weapontype localize=true}}
|
||||
</select>
|
||||
</li>
|
||||
|
||||
|
@ -8,11 +8,7 @@
|
||||
<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">
|
||||
{{#select system.costunit}}
|
||||
{{#each config.costUnits as |unit key| }}
|
||||
<option value="{{key}}">{{localize unit.name}}</option>
|
||||
{{/each}}
|
||||
{{/select}}
|
||||
{{selectOptions config.costUnits selected=system.costunit localize=true labelAttr="name"}}
|
||||
</select>
|
||||
</li>
|
||||
|
||||
|
676
translated/fr/fvtt-ecryme.equipment.json
Normal file
@ -0,0 +1,676 @@
|
||||
{
|
||||
"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 d’argent ",
|
||||
"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": ""
|
||||
}
|
||||
}
|
||||
}
|
68
translated/fr/fvtt-ecryme.maneuvers.json
Normal file
@ -0,0 +1,68 @@
|
||||
{
|
||||
"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 l’a porté pour la première fois lors d’un duel judiciaire, à Éole, en 954. Il consiste à blesser la jambe ou le tendon d’Achille de l’adversaire, l’empêchant de se déplacer normalement. En plus de l’Impact, la victime se voit affublée du Trait <em>Estropié -1</em>.</p>"
|
||||
},
|
||||
"Doesn’t 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 d’aucun 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 d’un 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 d’armes qui augmente sa cadence de frappe. Durant un même échange de coups, il est ainsi capable d’infliger son Impact deux fois (deux Impacts graves au lieu d’un par exemple). Le retour de flamme est cependant périlleux, car, par son agressivité, le maître d’armes se découvre. Lui aussi subit des Impacts doublés.</p>"
|
||||
},
|
||||
"It's the winning, not the taking part that counts": {
|
||||
"name": "L’important n’est pas de participer mais de gagner",
|
||||
"description": "<p>impossibilité d’utiliser cette botte en duel</p>\n<p>L’escrimeur a appris à tirer profit de toutes les occasions, privilégiant l’efficacité 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é d’une 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. D’un coup précis, le maître d’armes cible le point faible de la protection de son opposant et s’y 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 d’armes est un artiste martial, capable de faire feu avec son mousquet lors d’un 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 d’arme à 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 d’avoir suffisamment de place pour se battre – En effectuant de longues et complexes arabesques, le maître d’armes produit une sphère mortelle tournoyante autour de lui. Il peut alors ajouter sa Marge de Préservation, par tranche de 2, à sa Marge d’Accomplissement. La Marge d’Accomplissement produit alors de nombreuses blessures superficielles (1 par Marge de 2).</p>"
|
||||
},
|
||||
"The Chimeric Defense": {
|
||||
"name": "Défense chimérique",
|
||||
"description": "<p>“Défensif uniquement ”–par tranches de 2–</p>\n<p>Pour réussir cette manœuvre, le personnage doit obtenir une Marge d’au moins 4 en Accomplissement ET en Préservation. En cas de réussite, elle permet d’ajouter tout ou partie de sa Marge de Préservation, par tranches de 2, à sa Marge d’Accomplissement. Alors qu’il esquive ou pare, le défenseur en profite pour porter un coup à l’aide d’un membre, d’un élément improvisé, d’un 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 man’s Hold": {
|
||||
"name": "L’étreinte de l’homme mort",
|
||||
"description": "<p>L’escrimeur 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 qu’il a infligés normalement durant cette passe d’armes, 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 l’humilier, avant de l’achever. Par ses piques et ses railleries, le maître d’armes 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 Madman’s step": {
|
||||
"name": "Le pas de l’homme fou",
|
||||
"description": "<p>Le style Rojo n’est pas enseigné par dans les écoles d’avocats-duellistes, mais dans les caravanes traversières. L’escrimeur 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 l’adversaire 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 d’un 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é d’engager une cible supplémentaire au dernier moment (avant le calcul des Incidences). Il peut demander au conteur de l’orienter 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 l’escrimeur s’applique aux deux adversaires désignés.</p>"
|
||||
},
|
||||
"The Scarlet Dance": {
|
||||
"name": "La danse écarlate",
|
||||
"description": "<p>Cette botte est l’invention de la duelliste Bramon d’Éole. Véritable némésis de Marcel Rubempré, maître d’armes des anciens nobles avant qu’ils 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 d’estoc et de taille. Se laissant aller au rythme de sa musique intérieure, l’épéiste finit dans un état de transe lui permettant d’ajouter son score d’Athlé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 l’arme, avoir un score d’Accomplissement 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 l’Incidence de son arme par son score en <em>Athlétisme</em>.</p>"
|
||||
}
|
||||
}
|
||||
}
|
393
translated/fr/fvtt-ecryme.specialisation.json
Normal file
@ -0,0 +1,393 @@
|
||||
{
|
||||
"label": "Spécialisation",
|
||||
"mapping": {
|
||||
"description": "system.description"
|
||||
},
|
||||
"folders": {
|
||||
"Mental": "Mentale",
|
||||
"Physical": "Physique",
|
||||
"Spocial": "Sociale"
|
||||
},
|
||||
"entries": {
|
||||
"Aircraft": {
|
||||
"name": "brûleur d’aé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": ""
|
||||
}
|
||||
}
|
||||
}
|
107
translated/fr/fvtt-ecryme.traits.json
Normal file
@ -0,0 +1,107 @@
|
||||
{
|
||||
"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 “lire” les disques </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": ""
|
||||
}
|
||||
}
|
||||
}
|