Compare commits

...

23 Commits

Author SHA1 Message Date
0ef689bf1b Fix specialization again 2025-03-11 23:47:08 +01:00
c6dcc187d8 Fix babele 2025-03-11 22:29:24 +01:00
e2f24405af Fix waring about grid 2025-02-14 13:36:52 +01:00
0487893f47 Fix v12 issue + remove warnings 2024-04-27 09:33:22 +02:00
d7b7bccbdf Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:31:30 +02:00
dbf4b17afb Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:28:57 +02:00
51e5a409c4 Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:28:28 +02:00
1e4692e850 Ajout des traits dans le header + gestion plus simple des PNJs 2024-03-19 09:16:08 +01:00
40e12c1bba Ajout des traits dans le header + gestion plus simple des PNJs 2024-03-19 09:15:30 +01:00
2450dce46c Fix traits bonus/malus and pictures in journals 2024-03-18 21:57:15 +01:00
67c1066194 Fix traits bonus/malus and pictures in journals 2024-03-18 21:56:10 +01:00
65fe498572 Fix background+landing pages 2024-03-15 12:12:02 +01:00
e1990f88b4 Fix background+landing pages 2024-03-15 12:10:44 +01:00
f99abb0966 Enhance stats 2024-02-08 13:02:57 +01:00
ec6e6be231 Fix confrontation with players 2023-10-12 08:28:30 +02:00
9d26d7bfad Amélirations des specialisations 2023-10-10 20:04:02 +02:00
81848155e5 Amélirations des specialisations 2023-10-10 20:02:13 +02:00
6778a9aa0b Release fix 2023-08-26 21:49:32 +02:00
63aa49c77f Fix CI/CD 2023-08-26 19:18:07 +02:00
0a3265419a Move repo to public area 2023-08-26 09:57:43 +02:00
f5093980b0 Move repo to public area 2023-08-26 09:53:14 +02:00
062a597b70 Various fixes in equipment, biodata 2023-08-25 09:18:45 +02:00
1d0d123947 Various fixes in equipment, biodata 2023-08-25 09:09:21 +02:00
93 changed files with 569 additions and 397 deletions

View File

@ -28,9 +28,9 @@ jobs:
files: 'system.json' files: 'system.json'
env: env:
version: ${{steps.get_version.outputs.version-without-v}} version: ${{steps.get_version.outputs.version-without-v}}
url: https://www.uberwald.me/gitea/uberwald/fvtt-ecryme url: https://www.uberwald.me/gitea/public/fvtt-ecryme
manifest: https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/releases/latest/module.json manifest: https://www.uberwald.me/gitea/public/fvtt-ecryme/releases/latest/system.json
download: https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/releases/download/${{github.event.release.tag_name}}/fvtt-ecryme.zip 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 # Create a zip file with all files required by the module to add to the release
- run: | - run: |

View File

@ -1,10 +1,12 @@
# Ecryme v2 system for FoundryVTT (French RPG, Open Sesam Games, Official) # Ecryme v2 system for FoundryVTT (French RPG, Open Sesam Games, Official)
This is a base game system with functionnal character sheets for the game Ecryme, powered by the Engrenage system. 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 You can join the kickstarter and obtain the base books here : https://www.kickstarter.com/projects/osg-us/ecryme
# System overview # System overview
The game system in Foundry offers the following features : The game system in Foundry offers the following features :
- PC/NPC sheet - PC/NPC sheet
- Skill rolls - Skill rolls
@ -13,7 +15,7 @@ The game system in Foundry offers the following features :
- Weapon rolls - Weapon rolls
- Trait management, with Spleen and Ideal also. - Trait management, with Spleen and Ideal also.
- Compendiums of items for the game - Compendiums of items for the game
-
![System Snapshot](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/08/ecryme_snapshot_01.webp "System Snapshot") ![System Snapshot](https://www.lahiette.com/leratierbretonnien/wp-content/uploads/2023/08/ecryme_snapshot_01.webp "System Snapshot")

View File

@ -1,3 +1,29 @@
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 v11.0.30
Snapshot and more detailed README Snapshot and more detailed README

4
images/.directory Normal file
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

4
images/ui/.directory Normal file
View 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

View File

@ -33,7 +33,9 @@
"traitbonus": "Bonus trait", "traitbonus": "Bonus trait",
"traitmalus": "Malus trait", "traitmalus": "Malus trait",
"bonusmalustraits": "Traits Bonus/Malus", "bonusmalustraits": "Traits Bonus/Malus",
"spectranscend": "Self-Transcend : " "spectranscend": "Self-Transcend : ",
"confrontselect": "Selected for confrontation",
"sentogm": "Confrontation has been sent to GM"
}, },
"rule": { "rule": {
"cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1", "cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1",
@ -51,6 +53,7 @@
"notenoughdice": "Execution and Preservation must have 2 dices allocated" "notenoughdice": "Execution and Preservation must have 2 dices allocated"
}, },
"ui": { "ui": {
"equipmentfree": "Equipments (free input)",
"traitType": "Trait type", "traitType": "Trait type",
"niveauTrait": "Trait level", "niveauTrait": "Trait level",
"weight": "Weight", "weight": "Weight",
@ -160,7 +163,12 @@
"ideals": "Ideals", "ideals": "Ideals",
"politic": "Political ideal", "politic": "Political ideal",
"boheme": "Boheme", "boheme": "Boheme",
"annencybonus": "Annency bonus" "annencybonus": "Annency bonus",
"bornplace": "Born place",
"residence": "Residence",
"origin": "Origin",
"childhood": "Childhood",
"bonus": "Bonus"
} }
} }
} }

View File

@ -33,7 +33,9 @@
"traitbonus": "Trait bonus", "traitbonus": "Trait bonus",
"traitmalus": "Trait malus", "traitmalus": "Trait malus",
"bonusmalustraits": "Bonus/Malus des Traits", "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": { "rule": {
"cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1", "cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1",
@ -52,6 +54,7 @@
"notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun" "notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun"
}, },
"ui": { "ui": {
"equipmentfree": "Equipements (saisie libre)",
"traitType": "Type de trait", "traitType": "Type de trait",
"niveauTrait": "Niveau du trait", "niveauTrait": "Niveau du trait",
"effect": "Incidence", "effect": "Incidence",
@ -161,7 +164,12 @@
"ideals": "Idéaux", "ideals": "Idéaux",
"politic": "Idéaux politiques", "politic": "Idéaux politiques",
"boheme": "Bohême", "boheme": "Bohême",
"annencybonus": "Bonus d'Anence" "annencybonus": "Bonus d'Anence",
"bornplace": "Lieu de naissance",
"residence": "Résidence",
"origin": "Origine",
"childhood": "Enfance",
"bonus": "Bonus"
} }
} }
} }

View File

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

View File

@ -29,7 +29,7 @@ export class EcrymeActor extends Actor {
if (data instanceof Array) { if (data instanceof Array) {
return super.create(data, options); 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) { if (data.items) {
let actor = super.create(data, options); let actor = super.create(data, options);
return actor; return actor;
@ -73,7 +73,7 @@ export class EcrymeActor extends Actor {
return comp; return comp;
} }
getArchetype() { 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) { if (comp?.system) {
comp.tarot = EcrymeUtility.getTarot(comp.system.lametutelaire) comp.tarot = EcrymeUtility.getTarot(comp.system.lametutelaire)
} }
@ -92,7 +92,7 @@ export class EcrymeActor extends Actor {
} }
/* ----------------------- --------------------- */ /* ----------------------- --------------------- */
addAnnencyActor(actorId) { addAnnencyActor(actorId) {
let members = duplicate(this.system.base.characters) let members = foundry.utils.duplicate(this.system.base.characters)
members.push(actorId) members.push(actorId)
this.update({ 'system.base.characters': members }) this.update({ 'system.base.characters': members })
} }
@ -103,7 +103,8 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getAnnency() { getAnnency() {
return game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id)) let annency = game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id))
return annency || {}
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getConfrontations() { getConfrontations() {
@ -135,7 +136,7 @@ export class EcrymeActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
prepareSkills() { prepareSkills() {
let skills = duplicate(this.system.skills) let skills = foundry.utils.duplicate(this.system.skills)
for (let categKey in skills) { for (let categKey in skills) {
let category = skills[categKey] let category = skills[categKey]
for (let skillKey in category.skilllist) { for (let skillKey in category.skilllist) {
@ -147,22 +148,22 @@ export class EcrymeActor extends Actor {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getCephalySkills() { getCephalySkills() {
let skills = duplicate(this.system.cephaly.skilllist) let skills = foundry.utils.duplicate(this.system.cephaly.skilllist)
return skills return skills
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getImpacts() { 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; return comp;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
getWeapons() { 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) EcrymeUtility.sortArrayObjectsByName(comp)
return comp; return comp;
} }
getManeuvers() { getManeuvers() {
let comp = duplicate(this.items.filter(item => item.type == 'maneuver') || []) let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'maneuver') || [])
EcrymeUtility.sortArrayObjectsByName(comp) EcrymeUtility.sortArrayObjectsByName(comp)
return comp; return comp;
} }
@ -170,7 +171,7 @@ export class EcrymeActor extends Actor {
getItemById(id) { getItemById(id) {
let item = this.items.find(item => item.id == id); let item = this.items.find(item => item.id == id);
if (item) { if (item) {
item = duplicate(item) item = foundry.utils.duplicate(item)
} }
return item; return item;
} }
@ -200,12 +201,12 @@ export class EcrymeActor extends Actor {
/* ------------------------------------------- */ /* ------------------------------------------- */
getEquipments() { getEquipments() {
return this.items.filter(item => item.type == 'equipement') return this.items.filter(item => item.type == 'equipment')
} }
/* ------------------------------------------- */ /* ------------------------------------------- */
async buildContainerTree() { 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) { for (let equip1 of equipments) {
if (equip1.system.iscontainer) { if (equip1.system.iscontainer) {
equip1.system.contents = [] equip1.system.contents = []
@ -300,13 +301,13 @@ export class EcrymeActor extends Actor {
getSubActors() { getSubActors() {
let subActors = []; let subActors = [];
for (let id of this.system.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; return subActors;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
async addSubActor(subActorId) { async addSubActor(subActorId) {
let subActors = duplicate(this.system.subactors); let subActors = foundry.utils.duplicate(this.system.subactors);
subActors.push(subActorId); subActors.push(subActorId);
await this.update({ 'system.subactors': subActors }); await this.update({ 'system.subactors': subActors });
} }
@ -377,9 +378,10 @@ export class EcrymeActor extends Actor {
rollData.actorId = this.id rollData.actorId = this.id
rollData.img = this.img rollData.img = this.img
rollData.isReroll = false rollData.isReroll = false
rollData.traits = duplicate(this.getRollTraits()) rollData.config = game.system.ecryme.config
rollData.spleen = duplicate(this.getSpleen() || {}) rollData.traits = foundry.utils.duplicate(this.getRollTraits())
rollData.ideal = duplicate(this.getIdeal() || {}) rollData.spleen = foundry.utils.duplicate(this.getSpleen() || {})
rollData.ideal = foundry.utils.duplicate(this.getIdeal() || {})
rollData.confrontBonus = this.getBonusList() rollData.confrontBonus = this.getBonusList()
return rollData return rollData
@ -387,14 +389,30 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */ /* -------------------------------------------- */
getCommonSkill(categKey, skillKey) { getCommonSkill(categKey, skillKey) {
let skill = this.system.skills[categKey].skilllist[skillKey]
let rollData = this.getCommonRollData() 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.categKey = categKey
skill.skillKey = skillKey skill.skillKey = skillKey
skill.spec = this.getSpecializations(skillKey)
rollData.skill = skill rollData.skill = skill
rollData.img = skill.img rollData.img = skill.img
rollData.impactMalus = this.getImpactMalus(categKey) rollData.impactMalus = this.getImpactMalus(categKey)
@ -410,6 +428,17 @@ export class EcrymeActor extends Actor {
this.startRoll(rollData).catch("Error on startRoll") 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) { async rollSkillConfront(categKey, skillKey) {
let rollData = this.getCommonSkill(categKey, skillKey) let rollData = this.getCommonSkill(categKey, skillKey)
@ -418,8 +447,9 @@ export class EcrymeActor extends Actor {
rollData.executionTotal = rollData.skill.value rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value rollData.preservationTotal = rollData.skill.value
rollData.applyTranscendence = "execution" rollData.applyTranscendence = "execution"
rollData.traitsBonus = duplicate(rollData.traits) rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits) rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
console.log("ROLLDATA", rollData)
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true) confrontStartDialog.render(true)
} }
@ -427,17 +457,16 @@ export class EcrymeActor extends Actor {
async rollCephalySkillConfront(skillKey) { async rollCephalySkillConfront(skillKey) {
let rollData = this.getCommonRollData() let rollData = this.getCommonRollData()
rollData.mode = "cephaly" rollData.mode = "cephaly"
rollData.skill = duplicate(this.system.cephaly.skilllist[skillKey]) rollData.skill = foundry.utils.duplicate(this.system.cephaly.skilllist[skillKey])
rollData.annency = duplicate(this.getAnnency()) rollData.annency = foundry.utils.duplicate(this.getAnnency())
rollData.img = rollData.skill.img rollData.img = rollData.skill.img
rollData.skill.categKey = "cephaly" rollData.skill.categKey = "cephaly"
rollData.skill.skillKey = skillKey rollData.skill.skillKey = skillKey
//rollData.impactMalus = this.getImpactMalus(categKey)
rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name) rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = duplicate(rollData.traits) rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits) rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
rollData.applyTranscendence = "execution" rollData.applyTranscendence = "execution"
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true) confrontStartDialog.render(true)
@ -453,12 +482,12 @@ export class EcrymeActor extends Actor {
rollData = this.getCommonSkill("physical", "shooting") rollData = this.getCommonSkill("physical", "shooting")
} }
rollData.mode = "weapon" 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.title = game.i18n.localize("ECRY.ui.confrontation") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = duplicate(rollData.traits) rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits) rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
rollData.applyTranscendence = "execution" rollData.applyTranscendence = "execution"
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true) confrontStartDialog.render(true)
@ -468,12 +497,12 @@ export class EcrymeActor extends Actor {
rollWeapon(weaponId) { rollWeapon(weaponId) {
let weapon = this.items.get(weaponId) let weapon = this.items.get(weaponId)
if (weapon) { if (weapon) {
weapon = duplicate(weapon) weapon = foundry.utils.duplicate(weapon)
let rollData = this.getCommonRollData() let rollData = this.getCommonRollData()
if (weapon.system.armetype == "mainsnues" || weapon.system.armetype == "epee") { 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) } rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor((this.getPhysiqueMalus() + this.system.attributs.physique.value + this.system.attributs.habilite.value) / 2) }
} else { } else {
rollData.attr = duplicate(this.system.attributs.habilite) rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite)
} }
rollData.mode = "weapon" rollData.mode = "weapon"
rollData.weapon = weapon rollData.weapon = weapon

View File

@ -11,7 +11,7 @@ export class EcrymeAnnencySheet extends ActorSheet {
/** @override */ /** @override */
static get defaultOptions() { static get defaultOptions() {
return mergeObject(super.defaultOptions, { return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "actor"], classes: ["fvtt-ecryme", "sheet", "actor"],
template: "systems/fvtt-ecryme/templates/actors/annency-sheet.hbs", template: "systems/fvtt-ecryme/templates/actors/annency-sheet.hbs",
width: 640, width: 640,
@ -33,9 +33,9 @@ export class EcrymeAnnencySheet extends ActorSheet {
name: this.actor.name, name: this.actor.name,
editable: this.isEditable, editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked", cssClass: this.isEditable ? "editable" : "locked",
system: duplicate(this.object.system), system: foundry.utils.duplicate(this.object.system),
limited: this.object.limited, limited: this.object.limited,
config: duplicate(game.system.ecryme.config), config: foundry.utils.duplicate(game.system.ecryme.config),
hasCephaly: EcrymeUtility.hasCephaly(), hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(), hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(), hasAmertume: EcrymeUtility.hasAmertume(),

View File

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

View File

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

View File

@ -97,6 +97,7 @@ export class EcrymeUtility {
"level_b": game.i18n.localize("ECRY.settings.boheme"), "level_b": game.i18n.localize("ECRY.settings.boheme"),
"level_a": game.i18n.localize("ECRY.settings.amertume"), "level_a": game.i18n.localize("ECRY.settings.amertume"),
}, },
default: "level_a",
restricted: true restricted: true
}) })
@ -126,7 +127,7 @@ export class EcrymeUtility {
for (let categKey in game.data.template.Actor.templates.core.skills) { for (let categKey in game.data.template.Actor.templates.core.skills) {
let category = game.data.template.Actor.templates.core.skills[categKey] let category = game.data.template.Actor.templates.core.skills[categKey]
for (let skillKey in category.skilllist) { 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 skill.categKey = categKey // Auto reference the category
game.system.ecryme.config.skills[skillKey] = skill game.system.ecryme.config.skills[skillKey] = skill
} }
@ -215,7 +216,7 @@ export class EcrymeUtility {
confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation)) confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation))
} }
if (confront.marginPreservation > 0) { if (confront.marginPreservation > 0) {
confront.bonus1 = -confront.marginPreservation confront.bonus1 = confront.marginPreservation
} }
let msg = await this.createChatWithRollMode(this.confrontData1.alias, { let msg = await this.createChatWithRollMode(this.confrontData1.alias, {
@ -275,7 +276,7 @@ export class EcrymeUtility {
let message = game.messages.get(li.attr("data-message-id")) let message = game.messages.get(li.attr("data-message-id"))
let rollData = message.getFlag("world", "rolldata") let rollData = message.getFlag("world", "rolldata")
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>>> Menu !!!!", 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 true
} }
return false return false
@ -300,6 +301,7 @@ export class EcrymeUtility {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget) let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId) let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata") let rollData = message.getFlag("world", "ecryme-rolldata")
ui.notifications.info( game.i18n.localize("ECRY.chat.confrontselect"))
EcrymeUtility.manageConfrontation(rollData) EcrymeUtility.manageConfrontation(rollData)
}) })
html.on("click", '.button-apply-cephaly-difficulty', event => { html.on("click", '.button-apply-cephaly-difficulty', event => {
@ -403,16 +405,21 @@ export class EcrymeUtility {
let id = rollData.rollId let id = rollData.rollId
let oldRollData = this.rollDataStore[id] || {} let oldRollData = this.rollDataStore[id] || {}
let newRollData = mergeObject(oldRollData, rollData) let newRollData = foundry.utils.mergeObject(oldRollData, rollData)
this.rollDataStore[id] = newRollData this.rollDataStore[id] = newRollData
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async onSocketMesssage(msg) { static async onSocketMesssage(msg) {
console.log("SOCKET MESSAGE", msg.name) console.log("SOCKET MESSAGE", msg)
if (msg.name == "msg-draw-card") { if (msg.name == "msg_gm_chat_message") {
if (game.user.isGM && game.system.ecryme.currentTirage) { let rollData = msg.data.rollData
game.system.ecryme.currentTirage.addCard(msg.data.msgId) 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)
} }
} }
} }
@ -516,7 +523,7 @@ export class EcrymeUtility {
} }
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) { if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0]) rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0])
diceFormula += "+2" diceFormula += "+" + (String(rollData.spec.system?.bonus) || "2")
} }
rollData.bonusMalusTraits = 0 rollData.bonusMalusTraits = 0
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) { if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
@ -525,7 +532,7 @@ export class EcrymeUtility {
let trait = actor.getTrait(id) let trait = actor.getTrait(id)
console.log(trait, id) console.log(trait, id)
rollData.traitsBonusList.push(trait) rollData.traitsBonusList.push(trait)
rollData.bonusMalusTraits += trait.system.level rollData.bonusMalusTraits += Math.abs(trait.system.level)
} }
} }
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) { if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
@ -533,7 +540,7 @@ export class EcrymeUtility {
for (let id of rollData.traitsMalus) { for (let id of rollData.traitsMalus) {
let trait = actor.getTrait(id) let trait = actor.getTrait(id)
rollData.traitsMalusList.push(trait) rollData.traitsMalusList.push(trait)
rollData.bonusMalusTraits -= trait.system.level rollData.bonusMalusTraits -= Math.abs(trait.system.level)
} }
} }
diceFormula += "+" + rollData.bonusMalusTraits diceFormula += "+" + rollData.bonusMalusTraits
@ -551,7 +558,7 @@ export class EcrymeUtility {
let actor = game.actors.get(rollData.actorId) let actor = game.actors.get(rollData.actorId)
// Fix difficulty // Fix difficulty
if (!rollData.difficulty || rollData.difficulty == "-") { if (!rollData.difficulty || rollData.difficulty == "-1") {
rollData.difficulty = 0 rollData.difficulty = 0
} }
rollData.difficulty = Number(rollData.difficulty) rollData.difficulty = Number(rollData.difficulty)
@ -559,9 +566,9 @@ export class EcrymeUtility {
let diceFormula = this.computeRollFormula(rollData, actor) let diceFormula = this.computeRollFormula(rollData, actor)
// Performs roll // 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")) await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = duplicate(myRoll) rollData.roll = foundry.utils.duplicate(myRoll)
rollData.total = myRoll.total rollData.total = myRoll.total
rollData.diceSum = myRoll.terms[0].total rollData.diceSum = myRoll.terms[0].total
@ -631,12 +638,10 @@ export class EcrymeUtility {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static blindMessageToGM(chatOptions) { static blindMessageToGM(chatData) {
let chatGM = duplicate(chatOptions); chatData.whisper = this.getUsers(user => user.isGM);
chatGM.whisper = this.getUsers(user => user.isGM); console.log("blindMessageToGM", chatData);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content; game.socket.emit("system.fvtt-ecryme", { name: "msg_gm_chat_message", data: chatData });
console.log("blindMessageToGM", chatGM);
game.socket.emit("system.fvtt-ecryme", { msg: "msg_gm_chat_message", data: chatGM });
} }
@ -656,18 +661,14 @@ export class EcrymeUtility {
} }
return array; return array;
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
static async createChatMessage(name, rollMode, chatOptions) { static async createChatMessage(name, rollMode, chatOptions) {
switch (rollMode) { switch (rollMode) {
case "blindroll": // GM only case "blindroll": // GM only
if (!game.user.isGM) { if (!game.user.isGM) {
this.blindMessageToGM(chatOptions);
chatOptions.whisper = [game.user.id]; chatOptions.whisper = [game.user.id];
chatOptions.content = "Message only to the GM"; } else {
}
else {
chatOptions.whisper = this.getUsers(user => user.isGM); chatOptions.whisper = this.getUsers(user => user.isGM);
} }
break; break;
@ -682,20 +683,20 @@ export class EcrymeUtility {
/* -------------------------------------------- */ /* -------------------------------------------- */
static getBasicRollData() { static getBasicRollData() {
let rollData = { let rollData = {
rollId: randomID(16), rollId: foundry.utils.randomID(16),
type: "roll-data", type: "roll-data",
bonusMalusPerso: 0, bonusMalusPerso: "0",
bonusMalusSituation: 0, bonusMalusSituation: 0,
bonusMalusDef: 0, bonusMalusDef: 0,
annencyBonus: 0, annencyBonus: 0,
bonusMalusPortee: 0, bonusMalusPortee: 0,
skillTranscendence: 0, skillTranscendence: 0,
rollMode: game.settings.get("core", "rollMode"), rollMode: game.settings.get("core", "rollMode"),
difficulty: "-", difficulty: "-1",
useSpleen: false, useSpleen: false,
useIdeal: false, useIdeal: false,
impactMalus: 0, impactMalus: 0,
config: duplicate(game.system.ecryme.config) config: foundry.utils.duplicate(game.system.ecryme.config)
} }
EcrymeUtility.updateWithTarget(rollData) EcrymeUtility.updateWithTarget(rollData)
return rollData return rollData

View File

@ -6,7 +6,7 @@ export class EcrymeConfrontDialog extends Dialog {
/* -------------------------------------------- */ /* -------------------------------------------- */
static async create(actor, rollData) { static async create(actor, rollData) {
let options = mergeObject(super.defaultOptions, { let options = foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme ecryme-confrontation-dialog"], classes: ["fvtt-ecryme ecryme-confrontation-dialog"],
dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }], dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }],
width: 620, height: 'fit-content', 'z-index': 99999 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", { let msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData) 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) console.log("MSG", this.rollData)
msg.setFlag("world", "ecryme-rolldata", this.rollData) msg.setFlag("world", "ecryme-rolldata", this.rollData)
} }
@ -82,13 +83,24 @@ export class EcrymeConfrontDialog extends Dialog {
let button = this.buttonDisabled let button = this.buttonDisabled
setTimeout(function () { $(".launchConfront").attr("disabled", button) }, 180) 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) { _onDragStart(event) {
console.log("DRAGSTART::::", event)
super._onDragStart(event) super._onDragStart(event)
let dragType = $(event.srcElement).data("drag-type") let dragType = $(event.srcElement).data("drag-type")
let diceData = {} let diceData = {}
//console.log("DRAGTYPE", dragType) console.log("DRAGTYPE", dragType)
if (dragType == "dice") { if (dragType == "dice") {
diceData = { diceData = {
dragType: "dice", dragType: "dice",
@ -111,7 +123,7 @@ export class EcrymeConfrontDialog extends Dialog {
let data = JSON.parse(dataJSON) let data = JSON.parse(dataJSON)
if ( data.dragType == "dice") { if ( data.dragType == "dice") {
let idx = Number(data.diceIndex) 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") && if (event.srcElement.className.includes("execution") &&
this.rollData.availableDices.filter(d => d.location == "execution").length < 2) { this.rollData.availableDices.filter(d => d.location == "execution").length < 2) {
this.rollData.availableDices[idx].location = "execution" this.rollData.availableDices[idx].location = "execution"
@ -151,9 +163,9 @@ export class EcrymeConfrontDialog extends Dialog {
// Apply Transcend if needed // Apply Transcend if needed
if (this.rollData.skillTranscendence > 0) { if (this.rollData.skillTranscendence > 0) {
if (this.rollData.applyTranscendence == "execution") { if (this.rollData.applyTranscendence == "execution") {
this.rollData.executionTotal += this.rollData.skillTranscendence this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
} else { } 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() this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) { 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.specApplied = true
rollData.executionTotal += 2 rollData.executionTotal += 2
rollData.preservationTotal += 2 rollData.preservationTotal += 2
@ -200,19 +212,19 @@ export class EcrymeConfrontDialog extends Dialog {
for (let id of rollData.traitsBonusSelected) { for (let id of rollData.traitsBonusSelected) {
let trait = rollData.traitsBonus.find(t => t._id == id) let trait = rollData.traitsBonus.find(t => t._id == id)
trait.activated = true trait.activated = true
rollData.bonusMalusTraits += trait.system.level rollData.bonusMalusTraits += Number(trait.system.level)
} }
} }
if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) { if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) {
for (let id of rollData.traitsMalusSelected) { for (let id of rollData.traitsMalusSelected) {
let trait = rollData.traitsMalus.find(t => t._id == id) let trait = rollData.traitsMalus.find(t => t._id == id)
trait.activated = true trait.activated = true
rollData.bonusMalusTraits -= trait.system.level rollData.bonusMalusTraits -= Number(trait.system.level)
} }
} }
rollData.executionTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.preservationTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso rollData.preservationTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
this.refreshDialog() this.refreshDialog()
} }
@ -222,7 +234,7 @@ export class EcrymeConfrontDialog extends Dialog {
super.activateListeners(html); super.activateListeners(html);
html.find('#bonusMalusPerso').change((event) => { html.find('#bonusMalusPerso').change((event) => {
this.rollData.bonusMalusPerso = Number(event.currentTarget.value) this.rollData.bonusMalusPerso = event.currentTarget.value
this.computeTotals() this.computeTotals()
}) })
html.find('#roll-specialization').change((event) => { html.find('#roll-specialization').change((event) => {

View File

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

View File

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

View File

@ -67,7 +67,6 @@ Hooks.once("init", async function () {
EcrymeUtility.init() EcrymeUtility.init()
console.log("Babele INIT!")
Babele.get().setSystemTranslationsDir("translated") Babele.get().setSystemTranslationsDir("translated")
}); });
@ -84,28 +83,13 @@ function welcomeMessage() {
} }
/* -------------------------------------------- */ /* -------------------------------------------- */
// Register world usage statistics async function importDefaultScene() {
function registerUsageCount(registerKey) { let exists = game.scenes.find(j => j.name == "Landing page 1");
if (game.user.isGM) { if (!exists) {
game.settings.register(registerKey, "world-key", { const scenes = await EcrymeUtility.loadCompendium("fvtt-ecryme.scenes")
name: "Unique world key", let newDocuments = scenes.filter(i => i.name == "Landing page 1");
scope: "world", await game.scenes.documentClass.create(newDocuments);
config: false, game.scenes.find(i => i.name == "Landing page 1").activate();
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)
} }
} }
@ -114,6 +98,9 @@ function registerUsageCount(registerKey) {
/* -------------------------------------------- */ /* -------------------------------------------- */
Hooks.once("ready", function () { Hooks.once("ready", function () {
// Load trranslations
Babele.get().setSystemTranslationsDir("translated")
// User warning // User warning
if (!game.user.isGM && game.user.character == undefined) { if (!game.user.isGM && game.user.character == undefined) {
ui.notifications.info("Attention ! Aucun personnage relié au joueur !"); ui.notifications.info("Attention ! Aucun personnage relié au joueur !");
@ -123,10 +110,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(); welcomeMessage();
EcrymeUtility.ready() EcrymeUtility.ready();
EcrymeCharacterSummary.ready() EcrymeCharacterSummary.ready();
importDefaultScene();
}) })

View File

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

Binary file not shown.

BIN
packs/equipment/000171.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000070 MANIFEST-000184

View File

@ -1,7 +1,7 @@
2023/08/22-08:18:29.415756 7f4f609fd6c0 Recovering log #68 2025/03/11-23:44:54.691022 7f24c57fa6c0 Recovering log #182
2023/08/22-08:18:29.426603 7f4f609fd6c0 Delete type=3 #66 2025/03/11-23:44:54.761305 7f24c57fa6c0 Delete type=3 #180
2023/08/22-08:18:29.426655 7f4f609fd6c0 Delete type=0 #68 2025/03/11-23:44:54.761368 7f24c57fa6c0 Delete type=0 #182
2023/08/22-08:21:44.533362 7f4ccb7fe6c0 Level-0 table #73: started 2025/03/11-23:45:54.472551 7f24c4bff6c0 Level-0 table #187: started
2023/08/22-08:21:44.533404 7f4ccb7fe6c0 Level-0 table #73: 0 bytes OK 2025/03/11-23:45:54.472575 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2023/08/22-08:21:44.540850 7f4ccb7fe6c0 Delete type=0 #71 2025/03/11-23:45:54.479092 7f24c4bff6c0 Delete type=0 #185
2023/08/22-08:21:44.560122 7f4ccb7fe6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.491718 7f24c4bff6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/08/17-08:30:06.224452 7fa0dcff96c0 Recovering log #64 2025/03/11-23:33:32.501703 7f24c5ffb6c0 Recovering log #178
2023/08/17-08:30:06.244297 7fa0dcff96c0 Delete type=3 #62 2025/03/11-23:33:32.511734 7f24c5ffb6c0 Delete type=3 #176
2023/08/17-08:30:06.244357 7fa0dcff96c0 Delete type=0 #64 2025/03/11-23:33:32.511785 7f24c5ffb6c0 Delete type=0 #178
2023/08/17-08:31:03.278842 7f9e3ffff6c0 Level-0 table #69: started 2025/03/11-23:44:47.591299 7f24c4bff6c0 Level-0 table #183: started
2023/08/17-08:31:03.278870 7f9e3ffff6c0 Level-0 table #69: 0 bytes OK 2025/03/11-23:44:47.591363 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2023/08/17-08:31:03.285336 7f9e3ffff6c0 Delete type=0 #67 2025/03/11-23:44:47.624590 7f24c4bff6c0 Delete type=0 #181
2023/08/17-08:31:03.285445 7f9e3ffff6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) 2025/03/11-23:44:47.748676 7f24c4bff6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/help/000108.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000006 MANIFEST-000121

View File

@ -1,8 +1,8 @@
2023/08/22-08:18:29.469195 7f4f611fe6c0 Recovering log #4 2025/03/11-23:44:54.948819 7f24c67fc6c0 Recovering log #119
2023/08/22-08:18:29.483356 7f4f611fe6c0 Delete type=3 #2 2025/03/11-23:44:55.014909 7f24c67fc6c0 Delete type=3 #117
2023/08/22-08:18:29.483413 7f4f611fe6c0 Delete type=0 #4 2025/03/11-23:44:55.015006 7f24c67fc6c0 Delete type=0 #119
2023/08/22-08:21:44.524795 7f4ccb7fe6c0 Level-0 table #9: started 2025/03/11-23:45:54.515413 7f24c4bff6c0 Level-0 table #124: started
2023/08/22-08:21:44.524832 7f4ccb7fe6c0 Level-0 table #9: 0 bytes OK 2025/03/11-23:45:54.515443 7f24c4bff6c0 Level-0 table #124: 0 bytes OK
2023/08/22-08:21:44.533220 7f4ccb7fe6c0 Delete type=0 #7 2025/03/11-23:45:54.522097 7f24c4bff6c0 Delete type=0 #122
2023/08/22-08:21:44.560099 7f4ccb7fe6c0 Manual compaction at level-0 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.522287 7f24c4bff6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2023/08/22-08:21:44.560175 7f4ccb7fe6c0 Manual compaction at level-1 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.522303 7f24c4bff6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

View File

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

Binary file not shown.

BIN
packs/help/MANIFEST-000121 Normal file

Binary file not shown.

Binary file not shown.

BIN
packs/maneuvers/000171.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000070 MANIFEST-000184

View File

@ -1,7 +1,7 @@
2023/08/22-08:18:29.434436 7f4ccbfff6c0 Recovering log #68 2025/03/11-23:44:54.883993 7f24c5ffb6c0 Recovering log #182
2023/08/22-08:18:29.469056 7f4ccbfff6c0 Delete type=3 #66 2025/03/11-23:44:54.946077 7f24c5ffb6c0 Delete type=3 #180
2023/08/22-08:18:29.469125 7f4ccbfff6c0 Delete type=0 #68 2025/03/11-23:44:54.946154 7f24c5ffb6c0 Delete type=0 #182
2023/08/22-08:21:44.540974 7f4ccb7fe6c0 Level-0 table #73: started 2025/03/11-23:45:54.498184 7f24c4bff6c0 Level-0 table #187: started
2023/08/22-08:21:44.541011 7f4ccb7fe6c0 Level-0 table #73: 0 bytes OK 2025/03/11-23:45:54.498223 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2023/08/22-08:21:44.552192 7f4ccb7fe6c0 Delete type=0 #71 2025/03/11-23:45:54.505537 7f24c4bff6c0 Delete type=0 #185
2023/08/22-08:21:44.560142 7f4ccb7fe6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.522269 7f24c4bff6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/08/17-08:30:06.246354 7fa0de7fc6c0 Recovering log #64 2025/03/11-23:33:32.540154 7f24c67fc6c0 Recovering log #178
2023/08/17-08:30:06.257748 7fa0de7fc6c0 Delete type=3 #62 2025/03/11-23:33:32.549680 7f24c67fc6c0 Delete type=3 #176
2023/08/17-08:30:06.257814 7fa0de7fc6c0 Delete type=0 #64 2025/03/11-23:33:32.549720 7f24c67fc6c0 Delete type=0 #178
2023/08/17-08:31:03.285529 7f9e3ffff6c0 Level-0 table #69: started 2025/03/11-23:44:47.624705 7f24c4bff6c0 Level-0 table #183: started
2023/08/17-08:31:03.285609 7f9e3ffff6c0 Level-0 table #69: 0 bytes OK 2025/03/11-23:44:47.624728 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2023/08/17-08:31:03.291891 7f9e3ffff6c0 Delete type=0 #67 2025/03/11-23:44:47.667991 7f24c4bff6c0 Delete type=0 #181
2023/08/17-08:31:03.309552 7f9e3ffff6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) 2025/03/11-23:44:47.748692 7f24c4bff6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/scenes/000055.ldb Normal file

Binary file not shown.

1
packs/scenes/CURRENT Normal file
View File

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

8
packs/scenes/LOG Normal file
View File

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

8
packs/scenes/LOG.old Normal file
View File

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

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

View File

@ -1 +1 @@
MANIFEST-000070 MANIFEST-000184

View File

@ -1,7 +1,7 @@
2023/08/22-08:18:29.415768 7f4f619ff6c0 Recovering log #68 2025/03/11-23:44:54.615643 7f24c6ffd6c0 Recovering log #182
2023/08/22-08:18:29.430277 7f4f619ff6c0 Delete type=3 #66 2025/03/11-23:44:54.688425 7f24c6ffd6c0 Delete type=3 #180
2023/08/22-08:18:29.430403 7f4f619ff6c0 Delete type=0 #68 2025/03/11-23:44:54.688509 7f24c6ffd6c0 Delete type=0 #182
2023/08/22-08:21:44.516245 7f4ccb7fe6c0 Level-0 table #73: started 2025/03/11-23:45:54.466489 7f24c4bff6c0 Level-0 table #187: started
2023/08/22-08:21:44.516287 7f4ccb7fe6c0 Level-0 table #73: 0 bytes OK 2025/03/11-23:45:54.466525 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2023/08/22-08:21:44.524497 7f4ccb7fe6c0 Delete type=0 #71 2025/03/11-23:45:54.472451 7f24c4bff6c0 Delete type=0 #185
2023/08/22-08:21:44.524682 7f4ccb7fe6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.491700 7f24c4bff6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/08/17-08:30:06.224380 7fa0dd7fa6c0 Recovering log #64 2025/03/11-23:33:32.488591 7f24c57fa6c0 Recovering log #178
2023/08/17-08:30:06.241271 7fa0dd7fa6c0 Delete type=3 #62 2025/03/11-23:33:32.499216 7f24c57fa6c0 Delete type=3 #176
2023/08/17-08:30:06.241353 7fa0dd7fa6c0 Delete type=0 #64 2025/03/11-23:33:32.499268 7f24c57fa6c0 Delete type=0 #178
2023/08/17-08:31:03.262782 7f9e3ffff6c0 Level-0 table #69: started 2025/03/11-23:44:47.713953 7f24c4bff6c0 Level-0 table #183: started
2023/08/17-08:31:03.262832 7f9e3ffff6c0 Level-0 table #69: 0 bytes OK 2025/03/11-23:44:47.713983 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2023/08/17-08:31:03.268889 7f9e3ffff6c0 Delete type=0 #67 2025/03/11-23:44:47.748547 7f24c4bff6c0 Delete type=0 #181
2023/08/17-08:31:03.285415 7f9e3ffff6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end) 2025/03/11-23:44:47.748713 7f24c4bff6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/traits/000171.ldb Normal file

Binary file not shown.

0
packs/traits/000186.log Normal file
View File

View File

@ -1 +1 @@
MANIFEST-000070 MANIFEST-000184

View File

@ -1,7 +1,7 @@
2023/08/22-08:18:29.432772 7f4f609fd6c0 Recovering log #68 2025/03/11-23:44:54.764214 7f24c5ffb6c0 Recovering log #182
2023/08/22-08:18:29.459891 7f4f609fd6c0 Delete type=3 #66 2025/03/11-23:44:54.823309 7f24c5ffb6c0 Delete type=3 #180
2023/08/22-08:18:29.460035 7f4f609fd6c0 Delete type=0 #68 2025/03/11-23:44:54.823390 7f24c5ffb6c0 Delete type=0 #182
2023/08/22-08:21:44.552339 7f4ccb7fe6c0 Level-0 table #73: started 2025/03/11-23:45:54.485457 7f24c4bff6c0 Level-0 table #187: started
2023/08/22-08:21:44.552379 7f4ccb7fe6c0 Level-0 table #73: 0 bytes OK 2025/03/11-23:45:54.485489 7f24c4bff6c0 Level-0 table #187: 0 bytes OK
2023/08/22-08:21:44.559932 7f4ccb7fe6c0 Delete type=0 #71 2025/03/11-23:45:54.491568 7f24c4bff6c0 Delete type=0 #185
2023/08/22-08:21:44.560159 7f4ccb7fe6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) 2025/03/11-23:45:54.491736 7f24c4bff6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/08/17-08:30:06.243329 7fa0ddffb6c0 Recovering log #64 2025/03/11-23:33:32.514118 7f24c67fc6c0 Recovering log #178
2023/08/17-08:30:06.257748 7fa0ddffb6c0 Delete type=3 #62 2025/03/11-23:33:32.524830 7f24c67fc6c0 Delete type=3 #176
2023/08/17-08:30:06.257816 7fa0ddffb6c0 Delete type=0 #64 2025/03/11-23:33:32.525025 7f24c67fc6c0 Delete type=0 #178
2023/08/17-08:31:03.292149 7f9e3ffff6c0 Level-0 table #69: started 2025/03/11-23:44:47.668164 7f24c4bff6c0 Level-0 table #183: started
2023/08/17-08:31:03.292214 7f9e3ffff6c0 Level-0 table #69: 0 bytes OK 2025/03/11-23:44:47.668203 7f24c4bff6c0 Level-0 table #183: 0 bytes OK
2023/08/17-08:31:03.298635 7f9e3ffff6c0 Delete type=0 #67 2025/03/11-23:44:47.713809 7f24c4bff6c0 Delete type=0 #181
2023/08/17-08:31:03.309589 7f9e3ffff6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) 2025/03/11-23:44:47.748703 7f24c4bff6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

View File

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

View File

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

View File

@ -3,8 +3,10 @@
"esmodules": [ "esmodules": [
"modules/ecryme-main.js" "modules/ecryme-main.js"
], ],
"gridDistance": 1, "grid": {
"gridUnits": "m", "distance": 2,
"units": "m"
},
"languages": [ "languages": [
{ {
"lang": "fr", "lang": "fr",
@ -62,6 +64,18 @@
"ASSISTANT": "OWNER" "ASSISTANT": "OWNER"
} }
}, },
{
"label": "Scenes",
"type": "Scene",
"name": "scenes",
"path": "packs/scenes",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{ {
"label": "Maneuvers", "label": "Maneuvers",
"type": "Item", "type": "Item",
@ -88,10 +102,10 @@
} }
], ],
"license": "LICENSE.txt", "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": { "compatibility": {
"minimum": "10", "minimum": "12",
"verified": "11" "verified": "12"
}, },
"id": "fvtt-ecryme", "id": "fvtt-ecryme",
"primaryTokenAttribute": "secondary.health", "primaryTokenAttribute": "secondary.health",
@ -110,8 +124,8 @@
] ]
}, },
"title": "Ecryme, le Jeu de Rôles", "title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme", "url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
"version": "11.0.20", "version": "12.0.3",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.20.zip", "download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v12.0.3.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp" "background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
} }

View File

@ -24,31 +24,38 @@
}, },
"core": { "core": {
"subactors": [], "subactors": [],
"equipmentfree": "",
"skills": { "skills": {
"physical": { "physical": {
"name": "ECRY.ui.physical", "name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": { "skilllist": {
"athletics": { "athletics": {
"key": "athletics",
"name": "ECRY.ui.athletics", "name": "ECRY.ui.athletics",
"max": 0, "max": 0,
"value": 0 "value": 0
}, },
"driving": { "driving": {
"key": "driving",
"name": "ECRY.ui.driving", "name": "ECRY.ui.driving",
"max": 0, "max": 0,
"value": 0 "value": 0
}, },
"fencing": { "fencing": {
"key": "fencing",
"name": "ECRY.ui.fencing", "name": "ECRY.ui.fencing",
"max": 0, "max": 0,
"value": 0 "value": 0
}, },
"brawling": { "brawling": {
"key": "brawling",
"name": "ECRY.ui.brawling", "name": "ECRY.ui.brawling",
"max": 0, "max": 0,
"value": 0 "value": 0
}, },
"shooting": { "shooting": {
"key": "shooting",
"name": "ECRY.ui.shooting", "name": "ECRY.ui.shooting",
"max": 0, "max": 0,
"value": 0 "value": 0
@ -57,28 +64,34 @@
}, },
"mental": { "mental": {
"name": "ECRY.ui.mental", "name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": { "skilllist": {
"anthropomecanology": { "anthropomecanology": {
"key": "anthropomecanology",
"name": "ECRY.ui.anthropomecanology", "name": "ECRY.ui.anthropomecanology",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"ecrymology": { "ecrymology": {
"key": "ecrymology",
"name": "ECRY.ui.ecrymology", "name": "ECRY.ui.ecrymology",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"traumatology": { "traumatology": {
"key": "traumatology",
"name": "ECRY.ui.traumatology", "name": "ECRY.ui.traumatology",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"traversology": { "traversology": {
"key": "traversology",
"name": "ECRY.ui.traversology", "name": "ECRY.ui.traversology",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"urbatechnology": { "urbatechnology": {
"key": "urbatechnology",
"name": "ECRY.ui.urbatechnology", "name": "ECRY.ui.urbatechnology",
"value": 0, "value": 0,
"max": 10 "max": 10
@ -87,28 +100,34 @@
}, },
"social": { "social": {
"name": "ECRY.ui.social", "name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": { "skilllist": {
"quibbling": { "quibbling": {
"key": "quibbling",
"name": "ECRY.ui.quibbling", "name": "ECRY.ui.quibbling",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"creativity": { "creativity": {
"key": "creativity",
"name": "ECRY.ui.creativity", "name": "ECRY.ui.creativity",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"loquacity": { "loquacity": {
"key": "loquacity",
"name": "ECRY.ui.loquacity", "name": "ECRY.ui.loquacity",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"guile": { "guile": {
"key": "guile",
"name": "ECRY.ui.guile", "name": "ECRY.ui.guile",
"value": 0, "value": 0,
"max": 10 "max": 10
}, },
"performance": { "performance": {
"key": "performance",
"name": "ECRY.ui.performance", "name": "ECRY.ui.performance",
"value": 0, "value": 0,
"max": 10 "max": 10
@ -266,6 +285,7 @@
"effect": 0 "effect": 0
}, },
"specialization": { "specialization": {
"bonus": 2,
"templates": [ "templates": [
"common" "common"
], ],

View File

@ -15,27 +15,40 @@
<div class="flexrow"> <div class="flexrow">
<ul> <ul>
<li class="flexrow item" data-item-id="{{spleen.id}}"> <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> <label class="item-name-label-long">{{spleen.name}}</label>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
{{#if spleen}} {{#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-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> </div>
{{/if}} {{/if}}
</li> </li>
<li class="item flexrow" data-item-id="{{ideal.id}}"> <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> <label class="item-name-label-long">{{ideal.name}}</label>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
{{#if ideal}} {{#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-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> </div>
{{/if}} {{/if}}
</li> </li>
<li class="item flexrow flexrow-no-expand flexrow-start ">
<label class="item-name-label-short">Traits :</label>
{{#each traits as |trait key|}}
<label class="item-name-label-free"><a data-item-id="{{trait._id}}" class="item-edit">{{trait.name}}</a>,&nbsp;</label>
{{/each}}
</li>
</ul> </ul>
</div> </div>
@ -72,10 +85,29 @@
<ul class="stat-list alternate-list item-list"> <ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header impact-title"> <span class="item-name-label-header impact-title">
<h3><label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus <h3>
categkey}})</label></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> </span>
</li> </li>
{{#each category.skilllist as |skill skillkey|}} {{#each category.skilllist as |skill skillkey|}}
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<span class="item-name-label-long"> <span class="item-name-label-long">
@ -89,26 +121,23 @@
<select class="item-field-label-short" type="text" <select class="item-field-label-short" type="text"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}" name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}"
data-dtype="Number"> data-dtype="Number">
{{#select skill.value}} {{selectOptions @root.config.skillLevel selected=skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
</select> </select>
</li> </li>
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<ul class="ul-level1"> <ul class="ul-level1">
{{#each skill.spec as |spec idx|}} {{#each skill.spec as |spec idx|}}
<li class="item flexrow list-item" data-item-id="{{spec._id}}" data-item-type="specialization"> <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> <i class="fa-solid fa-dice-d6"></i>
{{spec.name}} {{spec.name}}
</a> </a>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
<a class="item-control item-edit" data-type="specialization" title="Edit Item"><i <a class="item-control item-edit" data-type="specialization" title="Edit Item"><i
class="fas fa-edit"></i></a> class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="specialization" title="Delete Item"><i <a class="item-control item-delete" data-type="specialization" title="Delete Item"><i
class="fas fa-plus"></i></a> class="fas fa-trash"></i></a>
</div> </div>
</li> </li>
{{/each}} {{/each}}
@ -141,11 +170,7 @@
</a></span> </a></span>
<select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value" <select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value"
value="{{skill.value}}" data-dtype="Number"> value="{{skill.value}}" data-dtype="Number">
{{#select skill.value}} {{selectOptions @root.config.skillLevel selected=skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
</select> </select>
</li> </li>
{{/each}} {{/each}}
@ -155,7 +180,8 @@
<div> <div>
{{#if annency}} {{#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> <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"> <ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item"> <li class="item flexrow list-item">
<span class="item-name-label-long"> <span class="item-name-label-long">
@ -273,57 +299,22 @@
{{!-- Equipement Tab --}} {{!-- 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"> <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> </span>
<div class="form-group small-editor"> <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> </div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg"> <li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header"> <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>
<span class="item-field-label-medium"> <span class="item-field-label-medium">
<label class="item-field-label-medium">Normaux</label> <label class="item-field-label-medium">{{localize "ECRY.ui.weight"}}</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Particulier</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Critique</label>
</span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="weapon" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each armes as |arme key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{arme._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{arme.img}}" /></a>
<span class="item-name-label">{{arme.name}}</span>
<span class="item-field-label-medium"><label>{{arme.system.dommagenormale}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagepart}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagecritique}}</label></span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Equipements (Items)</label></h3>
</span>
<span class="item-field-label-long">
<label class="short-label">Q.</label>
</span> </span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
@ -331,11 +322,12 @@
</div> </div>
</li> </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}}"> <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" <a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{equip.img}}" /></a> src="{{equip.img}}" /></a>
<span class="item-name-label">{{equip.name}}</span> <span class="item-name-label">{{equip.name}}</span>
<span class="item-field-label-medium">{{equip.system.weight}}</span>
<div class="item-filler">&nbsp;</div> <div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed"> <div class="item-controls item-controls-fixed">
@ -345,36 +337,6 @@
{{/each}} {{/each}}
</ul> </ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Sortilèges</label></h3>
</span>
<span class="item-field-label-medium">
<label class="short-label">Seuil</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="equipment" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each sorts as |sort key|}}
<li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{sort.img}}" /></a>
<span class="item-name-label">{{sort.name}}</span>
<span class="item-field-label-medium">
<label class="short-label">{{sort.system.seuil}}</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<hr> <hr>
</div> </div>
@ -386,7 +348,7 @@
<div> <div>
<ul class="item-list alternate-list"> <ul class="item-list alternate-list">
<li class="item flexrow"> <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}}" <input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}"
data-dtype="String" /> data-dtype="String" />
</li> </li>
@ -395,22 +357,27 @@
<input type="text" class="" name="system.biodata.age" value="{{system.biodata.age}}" <input type="text" class="" name="system.biodata.age" value="{{system.biodata.age}}"
data-dtype="String" /> data-dtype="String" />
</li> </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> </ul>
</div> </div>
<div> <div>
<ul> <ul>
<li class="item flexrow"> <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}}" <input type="text" class="" name="system.biodata.residence" value="{{system.biodata.residence}}"
data-dtype="String" /> data-dtype="String" />
</li> </li>
<li class="item flexrow"> <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}}" <input type="text" class="" name="system.biodata.nationalite" value="{{system.biodata.nationalite}}"
data-dtype="String" /> data-dtype="String" />
</li> </li>
<li class="item flexrow"> <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}}" <input type="text" class="" name="system.biodata.enfance" value="{{system.biodata.enfance}}"
data-dtype="String" /> data-dtype="String" />
</li> </li>

View File

@ -23,7 +23,7 @@
<li>{{localize skill.name}}: {{skill.value}} </li> <li>{{localize skill.name}}: {{skill.value}} </li>
{{#if spec}} {{#if spec}}
<li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+2) </li> <li>{{localize "ECRY.chat.specialization"}} {{spec.name}} (+{{spec.system.bonus}}) </li>
{{/if}} {{/if}}
{{#each traitsBonus as |trait idx|}} {{#each traitsBonus as |trait idx|}}
@ -40,7 +40,14 @@
<li>{{localize "ECRY.chat.bonusmalustraits"}}: {{bonusMalusTraits}} </li> <li>{{localize "ECRY.chat.bonusmalustraits"}}: {{bonusMalusTraits}} </li>
{{/if}} {{/if}}
{{#if (isGM)}}
{{else}}
<li>{{localize "ECRY.ui.execution"}} : {{executionTotal}}</li>
<li>{{localize "ECRY.ui.preservation"}} : {{preservationTotal}}</li>
{{/if}}
</ul> </ul>
{{#if (isGM)}} {{#if (isGM)}}
{{#if (eq mode "cephaly")}} {{#if (eq mode "cephaly")}}
<div> <div>
@ -55,6 +62,10 @@
{{else}} {{else}}
<button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button> <button class="button-select-confront">{{localize "ECRY.ui.selectconfront"}}</button>
{{/if}} {{/if}}
{{else}}
<div>
{{localize "ECRY.chat.sentogm"}}
</div>
{{/if}} {{/if}}
</div> </div>

View File

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

View File

@ -55,20 +55,13 @@
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span> <span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
<select class="" id="roll-select-transcendence" data-type="Number"> <select class="" id="roll-select-transcendence" data-type="Number">
{{#select skillTranscendence}} {{selectOptions config.skillLevel selected=skillTranscendence}}
{{#for 0 skill.value 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
{{/select}}
</select> </select>
</div> </div>
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.transcendapply"}} : </span> <span class="roll-dialog-label">{{localize "ECRY.ui.transcendapply"}} : </span>
<select class="" id="roll-apply-transcendence" data-type="String"> <select class="" id="roll-apply-transcendence" data-type="String">
{{#select applyTranscendence}} {{selectOptions config.transcendanceOptions selected=applyTranscendence localize=true}}
<option value="execution">{{localize "ECRY.ui.execution"}}</option>
<option value="preservation">{{localize "ECRY.ui.preservation"}}</option>
{{/select}}
</select> </select>
</div> </div>
@ -121,16 +114,8 @@
<div class="flexrow"> <div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span> <span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso"> <select id="bonusMalusPerso" name="bonusMalusPerso" type="text" data-dtype="String">
{{#select bonusMalusPerso}} {{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
<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> </select>
</div> </div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,18 @@
"label": "Equipement", "label": "Equipement",
"mapping": { "mapping": {
"description": "system.description" "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": { "entries": {
"Absinthe": { "Absinthe": {

View File

@ -2,6 +2,11 @@
"label": "Spécialisation", "label": "Spécialisation",
"mapping": { "mapping": {
"description": "system.description" "description": "system.description"
},
"folders": {
"Mental": "Mentale",
"Physical": "Physique",
"Spocial": "Sociale"
}, },
"entries": { "entries": {
"Aircraft": { "Aircraft": {

View File

@ -2,6 +2,9 @@
"label": "Traits", "label": "Traits",
"mapping": { "mapping": {
"description": "system.description" "description": "system.description"
},
"folders": {
"Maneuvers": "Manoeuvres"
}, },
"entries": { "entries": {
"Ability to stay calm": { "Ability to stay calm": {