Compare commits

...

37 Commits

Author SHA1 Message Date
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
bf94dc30b8 Picture link 2023-08-22 08:35:02 +02:00
fc3b83cfc2 Picture link 2023-08-22 08:34:12 +02:00
19b88c3de9 Add changelog 2023-08-21 15:20:10 +02:00
d669059403 Corrections diverses 2023-08-17 08:31:22 +02:00
45d419115d Needs babele, fix translation, fix margine 2023-08-16 21:17:49 +02:00
b9e2a77e88 Needs babele, fix translation, fix margine 2023-08-16 21:17:34 +02:00
5dca748bf3 v11 ready 2023-08-16 20:52:48 +02:00
98f9e1e2a6 v11 ready 2023-08-16 20:49:26 +02:00
1a90be13be v11 ready 2023-08-16 20:45:23 +02:00
e2f97762b9 Add workflow 2023-08-14 17:39:39 +02:00
de11053a9a Add workflow 2023-08-14 17:02:40 +02:00
3f7ce9918e Add workflow 2023-08-14 16:59:00 +02:00
919147b4af Add workflow 2023-08-14 16:58:18 +02:00
22953744ba Add workflow 2023-08-14 16:55:43 +02:00
6aee41b817 Final import 2023-08-14 16:47:12 +02:00
e7268a1578 Fix NPC sheet 2023-08-09 20:44:25 +02:00
0d25bbe764 Ajout annence et NPC 2023-08-09 17:33:11 +02:00
554a1af531 Annence/Boheme 2023-08-08 18:05:10 +02:00
b2219c0f81 Annence/Boheme 2023-08-08 14:54:39 +02:00
94 changed files with 1097 additions and 441 deletions

54
.gitea/workflows/main.yml Normal file
View File

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

7
LICENSE.txt Normal file
View File

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

View File

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

28
changelog.md Normal file
View File

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

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

@ -1,7 +1,9 @@
{
"TYPES": {
"Actor": {
"Personnage": "PC"
"pc": "Player Character",
"npc": "Non-Player Character",
"annency": "Annency"
},
"Item": {
"trait": "Trait",
@ -16,7 +18,8 @@
"cogs": "Cogs",
"cephaly": "Cephaly",
"boheme": "Boheme",
"amertume": "Amertume"
"amertume": "Amertume",
"gamelevel": "Game level"
},
"chat": {
"formula": "Formula",
@ -30,7 +33,9 @@
"traitbonus": "Bonus trait",
"traitmalus": "Malus trait",
"bonusmalustraits": "Traits Bonus/Malus",
"spectranscend": "Self-Transcend : "
"spectranscend": "Self-Transcend : ",
"confrontselect": "Selected for confrontation",
"sentogm": "Confrontation has been sent to GM"
},
"rule": {
"cephaly-success-2": "Duration : 1 scene - Impact : Superficial - Bonus : 1 - Elegy : 1",
@ -48,6 +53,7 @@
"notenoughdice": "Execution and Preservation must have 2 dices allocated"
},
"ui": {
"equipmentfree": "Equipments (free input)",
"traitType": "Trait type",
"niveauTrait": "Trait level",
"weight": "Weight",
@ -155,7 +161,14 @@
"enhancements": "Enhancements",
"oniricform": "Oniric shape (Boheme)",
"ideals": "Ideals",
"politic": "Political ideal"
"politic": "Political ideal",
"boheme": "Boheme",
"annencybonus": "Annency bonus",
"bornplace": "Born place",
"residence": "Residence",
"origin": "Origin",
"childhood": "Childhood",
"bonus": "Bonus"
}
}
}

View File

@ -1,7 +1,9 @@
{
"TYPES": {
"Actor":{
"Personnage": "PJ"
"pc": "Personnage Joueur",
"npc": "Personnage Non Joueur",
"annency": "Anence"
},
"Item": {
"trait": "Trait",
@ -16,7 +18,8 @@
"cogs": "Engrenages",
"cephaly": "Céphalie",
"boheme": "Bohême",
"amertume": "Amertume"
"amertume": "Amertume",
"gamelevel": "Niveau de jeu"
},
"chat": {
"formula": "Formule",
@ -30,14 +33,16 @@
"traitbonus": "Trait bonus",
"traitmalus": "Trait malus",
"bonusmalustraits": "Bonus/Malus des Traits",
"spectranscend": "Dépassement de soi : "
"spectranscend": "Dépassement de soi : ",
"confrontselected": "Confrontation selectionnée",
"sentogm": "La confrontation a été envoyée au MJ"
},
"rule": {
"cephaly-success-12": "Durée : 1 scène - Impact : Superficiel - Bonus : 1 - Elegie : 1",
"cephaly-success-34": "Durée : 1 semaine - Impact : Léger - Bonus : 2 - Elegie : 2",
"cephaly-success-56": "Durée : 1 mois - Impact : Grave - Bonus : 3 - Elegie : 3",
"cephaly-success-78": "Durée : 1 année - Impact : Majeur - Bonus : 4 - Elegie : 4",
"cephaly-success-910": "Durée : Permanent - Impact : Mort - Bonus : 5 - Elegie : 5",
"cephaly-success-4": "Durée : 1 semaine - Impact : Léger - Bonus : 2 - Elegie : 2",
"cephaly-success-6": "Durée : 1 mois - Impact : Grave - Bonus : 3 - Elegie : 3",
"cephaly-success-8": "Durée : 1 année - Impact : Majeur - Bonus : 4 - Elegie : 4",
"cephaly-success-10": "Durée : Permanent - Impact : Mort - Bonus : 5 - Elegie : 5",
"cephaly-failure-2": "Durée : 1 scène - Impact : Superficiel - Malus : 1 - Symptôme non visible et sans gravité - Altération bégigne difficilement repérable",
"cephaly-failure-4": "Durée : 1 semaine - Impact : Léger - Malus : 2 - Symptôme visible non incapacitant - Altération repérable",
"cephaly-failure-6": "Durée : 1 mois - Impact : Grave - Malus : 3 - Symptôme incapacitant - Altération repérable et fâcheuse",
@ -49,6 +54,7 @@
"notenoughdice": "L'Accomplissement et la Préservation doivent avoir 2 dés chacun"
},
"ui": {
"equipmentfree": "Equipements (saisie libre)",
"traitType": "Type de trait",
"niveauTrait": "Niveau du trait",
"effect": "Incidence",
@ -156,7 +162,14 @@
"enhancements": "Améliorations",
"oniricform": "Forme Onorique (Bohême)",
"ideals": "Idéaux",
"politic": "Idéaux politiques"
"politic": "Idéaux politiques",
"boheme": "Bohême",
"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 */
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme", "sheet", "actor"],
template: "systems/fvtt-ecryme/templates/actors/actor-sheet.hbs",
width: 860,
@ -33,7 +33,7 @@ export class EcrymeActorSheet extends ActorSheet {
name: this.actor.name,
editable: this.isEditable,
cssClass: this.isEditable ? "editable" : "locked",
system: duplicate(this.object.system),
system: foundry.utils.duplicate(this.object.system),
limited: this.object.limited,
skills: this.actor.prepareSkills(),
traits: this.actor.getRollTraits(),
@ -41,20 +41,21 @@ export class EcrymeActorSheet extends ActorSheet {
ideal: this.actor.getIdeal(),
spleen: this.actor.getSpleen(),
impacts: this.object.getImpacts(),
config: duplicate(game.system.ecryme.config),
config: foundry.utils.duplicate(game.system.ecryme.config),
weapons: this.actor.getWeapons(),
maneuvers: this.actor.getManeuvers(),
impactsMalus: this.actor.getImpactsMalus(),
archetype: duplicate(this.actor.getArchetype()),
equipements: this.actor.getEquipments(),
archetype: foundry.utils.duplicate(this.actor.getArchetype()),
equipments: this.actor.getEquipments(),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),
cephalySkills: this.actor.getCephalySkills(),
subActors: duplicate(this.actor.getSubActors()),
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
equipementlibre: await TextEditor.enrichHTML(this.object.system.equipementlibre, { async: true }),
subActors: foundry.utils.duplicate(this.actor.getSubActors()),
annency: this.actor.getAnnency(),
description: await TextEditor.enrichHTML(this.object.system.biodata.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.biodata.notes, { async: true }),
equipementlibre: await TextEditor.enrichHTML(this.object.system.equipmentfree, { async: true }),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
@ -79,10 +80,19 @@ export class EcrymeActorSheet extends ActorSheet {
if (e.keyCode === 13) return false;
});
html.find('.open-annency').click(ev => {
let actorId = $(ev.currentTarget).data("annency-id")
const actor = game.actors.get(actorId)
actor.sheet.render(true)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {
const li = $(ev.currentTarget).parents(".item")
let itemId = li.data("item-id")
if (!itemId) {
itemId = $(ev.currentTarget).data("item-id")
}
const item = this.actor.items.get( itemId );
item.sheet.render(true);
});
@ -122,6 +132,12 @@ export class EcrymeActorSheet extends ActorSheet {
let skillKey = $(event.currentTarget).data("skill-key")
this.actor.rollSkill(categKey, skillKey)
});
html.find('.roll-spec').click((event) => {
let categKey = $(event.currentTarget).data("category-key")
let skillKey = $(event.currentTarget).data("skill-key")
let specId = $(event.currentTarget).data("spec-id")
this.actor.rollSpec(categKey, skillKey, specId)
});
html.find('.roll-skill-confront').click((event) => {
let categKey = $(event.currentTarget).data("category-key")
let skillKey = $(event.currentTarget).data("skill-key")

View File

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

View File

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

View File

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

View File

@ -57,6 +57,20 @@ export const ECRYME_CONFIG = {
"lige": {name: "ECRY.ui.lige", value: 100 },
"hurle": {name: "ECRY.ui.hurle", value: 10 },
"coin": {name: "ECRY.ui.coin", value: 1 }
}
},
transcendanceOptions: {
"execution": "ECRY.ui.execution",
"preservation": "EC,RY.ui.preservation"
},
bonusMalusPersoOptions: [
{value: "-3", label: "-3"},
{value: "-2", label: "-2"},
{value: "-1", label: "-1"},
{value: "0", label: "0"},
{value: "+1", label: "+1"},
{value: "+2", label: "+2"},
{value: "+3", label: "+3"}
]
}

View File

@ -97,6 +97,7 @@ export class EcrymeUtility {
"level_b": game.i18n.localize("ECRY.settings.boheme"),
"level_a": game.i18n.localize("ECRY.settings.amertume"),
},
default: "level_a",
restricted: true
})
@ -126,7 +127,7 @@ export class EcrymeUtility {
for (let categKey in game.data.template.Actor.templates.core.skills) {
let category = game.data.template.Actor.templates.core.skills[categKey]
for (let skillKey in category.skilllist) {
let skill = duplicate(category.skilllist[skillKey])
let skill = foundry.utils.duplicate(category.skilllist[skillKey])
skill.categKey = categKey // Auto reference the category
game.system.ecryme.config.skills[skillKey] = skill
}
@ -221,7 +222,7 @@ export class EcrymeUtility {
let msg = await this.createChatWithRollMode(this.confrontData1.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-result.hbs`, confront)
})
msg.setFlag("world", "ecryme-rolldata", confront)
await msg.setFlag("world", "ecryme-rolldata", confront)
console.log("Confront result", confront)
this.lastConfront = confront
@ -275,7 +276,7 @@ export class EcrymeUtility {
let message = game.messages.get(li.attr("data-message-id"))
let rollData = message.getFlag("world", "rolldata")
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>>> Menu !!!!", rollData)
if (rollData.skill && i <= rollData.skill.value && !rollData.transcendUsed && rollData.spec) {
if (rollData.skill && rollData.skill.value >= i && !rollData.transcendUsed && rollData.spec) {
return true
}
return false
@ -300,6 +301,7 @@ export class EcrymeUtility {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata")
ui.notifications.info( game.i18n.localize("ECRY.chat.confrontselect"))
EcrymeUtility.manageConfrontation(rollData)
})
html.on("click", '.button-apply-cephaly-difficulty', event => {
@ -403,16 +405,21 @@ export class EcrymeUtility {
let id = rollData.rollId
let oldRollData = this.rollDataStore[id] || {}
let newRollData = mergeObject(oldRollData, rollData)
let newRollData = foundry.utils.mergeObject(oldRollData, rollData)
this.rollDataStore[id] = newRollData
}
/* -------------------------------------------- */
static async onSocketMesssage(msg) {
console.log("SOCKET MESSAGE", msg.name)
if (msg.name == "msg-draw-card") {
if (game.user.isGM && game.system.ecryme.currentTirage) {
game.system.ecryme.currentTirage.addCard(msg.data.msgId)
console.log("SOCKET MESSAGE", msg)
if (msg.name == "msg_gm_chat_message") {
let rollData = msg.data.rollData
if ( game.user.isGM ) {
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
content: await renderTemplate(msg.data.template, rollData),
whisper: game.user.id
})
chatMsg.setFlag("world", "ecryme-rolldata", rollData)
}
}
}
@ -492,7 +499,7 @@ export class EcrymeUtility {
rollData.margin = rollData.total - rollData.difficulty
if (rollData.total > rollData.difficulty) {
rollData.isSuccess = true
let maxMargin = rollData.skill.value + (rollData.spec) ? 2 : 0
let maxMargin = rollData.skill.value + ((rollData.spec) ? 2 : 0)
rollData.margin = Math.min(rollData.margin, maxMargin)
}
}
@ -516,7 +523,7 @@ export class EcrymeUtility {
}
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0])
diceFormula += "+2"
diceFormula += "+" + (String(rollData.spec.system?.bonus) || "2")
}
rollData.bonusMalusTraits = 0
if (rollData.traitsBonus && rollData.traitsBonus.length > 0) {
@ -525,7 +532,7 @@ export class EcrymeUtility {
let trait = actor.getTrait(id)
console.log(trait, id)
rollData.traitsBonusList.push(trait)
rollData.bonusMalusTraits += trait.system.level
rollData.bonusMalusTraits += Math.abs(trait.system.level)
}
}
if (rollData.traitsMalus && rollData.traitsMalus.length > 0) {
@ -533,12 +540,15 @@ export class EcrymeUtility {
for (let id of rollData.traitsMalus) {
let trait = actor.getTrait(id)
rollData.traitsMalusList.push(trait)
rollData.bonusMalusTraits -= trait.system.level
rollData.bonusMalusTraits -= Math.abs(trait.system.level)
}
}
diceFormula += "+" + rollData.bonusMalusTraits
diceFormula += "+" + rollData.bonusMalusPerso
diceFormula += "+" + rollData.impactMalus
if (rollData.annency) {
diceFormula += "+" + rollData.annencyBonus
}
rollData.diceFormula = diceFormula
return diceFormula
}
@ -556,9 +566,9 @@ export class EcrymeUtility {
let diceFormula = this.computeRollFormula(rollData, actor)
// Performs roll
let myRoll = new Roll(diceFormula).roll({ async: false })
let myRoll = await new Roll(diceFormula).roll()
await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode"))
rollData.roll = duplicate(myRoll)
rollData.roll = foundry.utils.duplicate(myRoll)
rollData.total = myRoll.total
rollData.diceSum = myRoll.terms[0].total
@ -567,7 +577,7 @@ export class EcrymeUtility {
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
})
msg.setFlag("world", "ecryme-rolldata", rollData)
await msg.setFlag("world", "ecryme-rolldata", rollData)
console.log("Rolldata result", rollData)
}
@ -584,7 +594,7 @@ export class EcrymeUtility {
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
})
msg.setFlag("world", "ecryme-rolldata", rollData)
await msg.setFlag("world", "ecryme-rolldata", rollData)
}
/* -------------------------------------------- */
@ -628,12 +638,10 @@ export class EcrymeUtility {
}
/* -------------------------------------------- */
static blindMessageToGM(chatOptions) {
let chatGM = duplicate(chatOptions);
chatGM.whisper = this.getUsers(user => user.isGM);
chatGM.content = "Blinde message of " + game.user.name + "<br>" + chatOptions.content;
console.log("blindMessageToGM", chatGM);
game.socket.emit("system.fvtt-ecryme", { msg: "msg_gm_chat_message", data: chatGM });
static blindMessageToGM(chatData) {
chatData.whisper = this.getUsers(user => user.isGM);
console.log("blindMessageToGM", chatData);
game.socket.emit("system.fvtt-ecryme", { name: "msg_gm_chat_message", data: chatData });
}
@ -653,18 +661,14 @@ export class EcrymeUtility {
}
return array;
}
/* -------------------------------------------- */
static async createChatMessage(name, rollMode, chatOptions) {
switch (rollMode) {
case "blindroll": // GM only
if (!game.user.isGM) {
this.blindMessageToGM(chatOptions);
chatOptions.whisper = [game.user.id];
chatOptions.content = "Message only to the GM";
}
else {
} else {
chatOptions.whisper = this.getUsers(user => user.isGM);
}
break;
@ -679,11 +683,12 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static getBasicRollData() {
let rollData = {
rollId: randomID(16),
rollId: foundry.utils.randomID(16),
type: "roll-data",
bonusMalusPerso: 0,
bonusMalusSituation: 0,
bonusMalusDef: 0,
annencyBonus: 0,
bonusMalusPortee: 0,
skillTranscendence: 0,
rollMode: game.settings.get("core", "rollMode"),
@ -691,7 +696,7 @@ export class EcrymeUtility {
useSpleen: false,
useIdeal: false,
impactMalus: 0,
config: duplicate(game.system.ecryme.config)
config: foundry.utils.duplicate(game.system.ecryme.config)
}
EcrymeUtility.updateWithTarget(rollData)
return rollData

View File

@ -6,7 +6,7 @@ export class EcrymeConfrontDialog extends Dialog {
/* -------------------------------------------- */
static async create(actor, rollData) {
let options = mergeObject(super.defaultOptions, {
let options = foundry.utils.mergeObject(super.defaultOptions, {
classes: ["fvtt-ecryme ecryme-confrontation-dialog"],
dragDrop: [{ dragSelector: ".confront-dice-container", dropSelector: null }],
width: 620, height: 'fit-content', 'z-index': 99999
@ -50,6 +50,7 @@ export class EcrymeConfrontDialog extends Dialog {
let msg = await EcrymeUtility.createChatMessage(this.rollData.alias, "blindroll", {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs`, this.rollData)
})
EcrymeUtility.blindMessageToGM( { rollData: this.rollData, template: "systems/fvtt-ecryme/templates/chat/chat-confrontation-pending.hbs" })
console.log("MSG", this.rollData)
msg.setFlag("world", "ecryme-rolldata", this.rollData)
}
@ -82,13 +83,24 @@ export class EcrymeConfrontDialog extends Dialog {
let button = this.buttonDisabled
setTimeout(function () { $(".launchConfront").attr("disabled", button) }, 180)
}
/* ------------------ -------------------------- */
_canDragStart(selector) {
console.log("CAN DRAG START", selector, super._canDragStart(selector) )
return true
}
_canDragDrop(selector) {
console.log("CAN DRAG DROP", selector, super._canDragDrop(selector) )
return true
}
/* ------------------ -------------------------- */
_onDragStart(event) {
console.log("DRAGSTART::::", event)
super._onDragStart(event)
let dragType = $(event.srcElement).data("drag-type")
let diceData = {}
//console.log("DRAGTYPE", dragType)
console.log("DRAGTYPE", dragType)
if (dragType == "dice") {
diceData = {
dragType: "dice",
@ -111,7 +123,7 @@ export class EcrymeConfrontDialog extends Dialog {
let data = JSON.parse(dataJSON)
if ( data.dragType == "dice") {
let idx = Number(data.diceIndex)
//console.log("DATA", data, event, event.srcElement.className)
console.log("DATA", data, event, event.srcElement.className)
if (event.srcElement.className.includes("execution") &&
this.rollData.availableDices.filter(d => d.location == "execution").length < 2) {
this.rollData.availableDices[idx].location = "execution"
@ -180,7 +192,7 @@ export class EcrymeConfrontDialog extends Dialog {
this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.specApplied = true
rollData.executionTotal += 2
rollData.preservationTotal += 2
@ -245,7 +257,9 @@ export class EcrymeConfrontDialog extends Dialog {
this.rollData.applyTranscendence = $('#roll-apply-transcendence').val()
this.computeTotals()
})
html.find('#annency-bonus').change((event) => {
this.rollData.annencyBonus = Number(event.currentTarget.value)
})
}
}

View File

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

View File

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

View File

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

Binary file not shown.

BIN
packs/equipment/000158.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000038
MANIFEST-000159

View File

@ -1,7 +1,7 @@
2023/08/08-09:07:13.603738 7f5867fff6c0 Recovering log #36
2023/08/08-09:07:13.613379 7f5867fff6c0 Delete type=3 #34
2023/08/08-09:07:13.613547 7f5867fff6c0 Delete type=0 #36
2023/08/08-09:07:28.094335 7f58677fe6c0 Level-0 table #41: started
2023/08/08-09:07:28.094367 7f58677fe6c0 Level-0 table #41: 0 bytes OK
2023/08/08-09:07:28.130086 7f58677fe6c0 Delete type=0 #39
2023/08/08-09:07:28.130372 7f58677fe6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
2024/04/26-19:22:08.707793 7f89060006c0 Recovering log #156
2024/04/26-19:22:08.718085 7f89060006c0 Delete type=3 #154
2024/04/26-19:22:08.718160 7f89060006c0 Delete type=0 #156
2024/04/26-19:25:18.674002 7f88ffe006c0 Level-0 table #162: started
2024/04/26-19:25:18.674046 7f88ffe006c0 Level-0 table #162: 0 bytes OK
2024/04/26-19:25:18.715930 7f88ffe006c0 Delete type=0 #160
2024/04/26-19:25:18.747436 7f88ffe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,14 @@
2023/08/08-08:56:25.009827 7f5afcdf86c0 Recovering log #32
2023/08/08-08:56:25.043068 7f5afcdf86c0 Delete type=3 #30
2023/08/08-08:56:25.043112 7f5afcdf86c0 Delete type=0 #32
2023/08/08-09:07:10.720233 7f58677fe6c0 Level-0 table #37: started
2023/08/08-09:07:10.720259 7f58677fe6c0 Level-0 table #37: 0 bytes OK
2023/08/08-09:07:10.728506 7f58677fe6c0 Delete type=0 #35
2023/08/08-09:07:10.742534 7f58677fe6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
2024/04/26-18:42:26.253704 7f89060006c0 Recovering log #152
2024/04/26-18:42:26.264507 7f89060006c0 Delete type=3 #150
2024/04/26-18:42:26.264666 7f89060006c0 Delete type=0 #152
2024/04/26-19:22:04.326808 7f88ffe006c0 Level-0 table #157: started
2024/04/26-19:22:04.330698 7f88ffe006c0 Level-0 table #157: 26343 bytes OK
2024/04/26-19:22:04.337326 7f88ffe006c0 Delete type=0 #155
2024/04/26-19:22:04.358386 7f88ffe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at '!items!zs7krgXhDRndtqbl' @ 338 : 1
2024/04/26-19:22:04.358402 7f88ffe006c0 Compacting 1@0 + 1@1 files
2024/04/26-19:22:04.362396 7f88ffe006c0 Generated table #158@0: 174 keys, 27263 bytes
2024/04/26-19:22:04.362426 7f88ffe006c0 Compacted 1@0 + 1@1 files => 27263 bytes
2024/04/26-19:22:04.368459 7f88ffe006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2024/04/26-19:22:04.368664 7f88ffe006c0 Delete type=2 #9
2024/04/26-19:22:04.368919 7f88ffe006c0 Delete type=2 #157
2024/04/26-19:22:04.400712 7f88ffe006c0 Manual compaction at level-0 from '!items!zs7krgXhDRndtqbl' @ 338 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/help/000095.ldb Normal file

Binary file not shown.

1
packs/help/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000096

8
packs/help/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/26-19:22:08.762783 7f89074006c0 Recovering log #93
2024/04/26-19:22:08.773921 7f89074006c0 Delete type=3 #91
2024/04/26-19:22:08.774007 7f89074006c0 Delete type=0 #93
2024/04/26-19:25:18.785678 7f88ffe006c0 Level-0 table #99: started
2024/04/26-19:25:18.785720 7f88ffe006c0 Level-0 table #99: 0 bytes OK
2024/04/26-19:25:18.821605 7f88ffe006c0 Delete type=0 #97
2024/04/26-19:25:18.901806 7f88ffe006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/04/26-19:25:18.901870 7f88ffe006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

15
packs/help/LOG.old Normal file
View File

@ -0,0 +1,15 @@
2024/04/26-18:42:26.318647 7f8906a006c0 Recovering log #89
2024/04/26-18:42:26.329907 7f8906a006c0 Delete type=3 #87
2024/04/26-18:42:26.329974 7f8906a006c0 Delete type=0 #89
2024/04/26-19:22:04.427916 7f88ffe006c0 Level-0 table #94: started
2024/04/26-19:22:04.431410 7f88ffe006c0 Level-0 table #94: 2184 bytes OK
2024/04/26-19:22:04.438566 7f88ffe006c0 Delete type=0 #92
2024/04/26-19:22:04.449035 7f88ffe006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/04/26-19:22:04.449082 7f88ffe006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 14 : 1
2024/04/26-19:22:04.449091 7f88ffe006c0 Compacting 1@1 + 1@2 files
2024/04/26-19:22:04.452506 7f88ffe006c0 Generated table #95@1: 4 keys, 2184 bytes
2024/04/26-19:22:04.452542 7f88ffe006c0 Compacted 1@1 + 1@2 files => 2184 bytes
2024/04/26-19:22:04.458702 7f88ffe006c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2024/04/26-19:22:04.458800 7f88ffe006c0 Delete type=2 #74
2024/04/26-19:22:04.458954 7f88ffe006c0 Delete type=2 #94
2024/04/26-19:22:04.482775 7f88ffe006c0 Manual compaction at level-1 from '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 14 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

BIN
packs/help/MANIFEST-000096 Normal file

Binary file not shown.

Binary file not shown.

BIN
packs/maneuvers/000158.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000038
MANIFEST-000159

View File

@ -1,7 +1,7 @@
2023/08/08-09:07:13.616518 7f5867fff6c0 Recovering log #36
2023/08/08-09:07:13.626451 7f5867fff6c0 Delete type=3 #34
2023/08/08-09:07:13.626504 7f5867fff6c0 Delete type=0 #36
2023/08/08-09:07:28.173846 7f58677fe6c0 Level-0 table #41: started
2023/08/08-09:07:28.173906 7f58677fe6c0 Level-0 table #41: 0 bytes OK
2023/08/08-09:07:28.221287 7f58677fe6c0 Delete type=0 #39
2023/08/08-09:07:28.221402 7f58677fe6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
2024/04/26-19:22:08.749669 7f8906a006c0 Recovering log #156
2024/04/26-19:22:08.759716 7f8906a006c0 Delete type=3 #154
2024/04/26-19:22:08.759885 7f8906a006c0 Delete type=0 #156
2024/04/26-19:25:18.747562 7f88ffe006c0 Level-0 table #162: started
2024/04/26-19:25:18.747596 7f88ffe006c0 Level-0 table #162: 0 bytes OK
2024/04/26-19:25:18.785476 7f88ffe006c0 Delete type=0 #160
2024/04/26-19:25:18.901779 7f88ffe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,14 @@
2023/08/08-08:56:25.046084 7f5867fff6c0 Recovering log #32
2023/08/08-08:56:25.085371 7f5867fff6c0 Delete type=3 #30
2023/08/08-08:56:25.085419 7f5867fff6c0 Delete type=0 #32
2023/08/08-09:07:10.736291 7f58677fe6c0 Level-0 table #37: started
2023/08/08-09:07:10.736337 7f58677fe6c0 Level-0 table #37: 0 bytes OK
2023/08/08-09:07:10.742372 7f58677fe6c0 Delete type=0 #35
2023/08/08-09:07:10.742595 7f58677fe6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
2024/04/26-18:42:26.305585 7f89056006c0 Recovering log #152
2024/04/26-18:42:26.316048 7f89056006c0 Delete type=3 #150
2024/04/26-18:42:26.316142 7f89056006c0 Delete type=0 #152
2024/04/26-19:22:04.400858 7f88ffe006c0 Level-0 table #157: started
2024/04/26-19:22:04.404082 7f88ffe006c0 Level-0 table #157: 6648 bytes OK
2024/04/26-19:22:04.410232 7f88ffe006c0 Delete type=0 #155
2024/04/26-19:22:04.438765 7f88ffe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at '!items!oSutlbe9wyBZccmf' @ 45 : 1
2024/04/26-19:22:04.438781 7f88ffe006c0 Compacting 1@0 + 1@1 files
2024/04/26-19:22:04.442180 7f88ffe006c0 Generated table #158@0: 15 keys, 6648 bytes
2024/04/26-19:22:04.442217 7f88ffe006c0 Compacted 1@0 + 1@1 files => 6648 bytes
2024/04/26-19:22:04.448645 7f88ffe006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2024/04/26-19:22:04.448777 7f88ffe006c0 Delete type=2 #9
2024/04/26-19:22:04.448921 7f88ffe006c0 Delete type=2 #157
2024/04/26-19:22:04.449050 7f88ffe006c0 Manual compaction at level-0 from '!items!oSutlbe9wyBZccmf' @ 45 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

BIN
packs/scenes/000042.ldb Normal file

Binary file not shown.

0
packs/scenes/000045.log Normal file
View File

1
packs/scenes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000043

0
packs/scenes/LOCK Normal file
View File

8
packs/scenes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/26-19:22:08.735377 7f89074006c0 Recovering log #40
2024/04/26-19:22:08.745776 7f89074006c0 Delete type=3 #38
2024/04/26-19:22:08.745887 7f89074006c0 Delete type=0 #40
2024/04/26-19:25:18.595904 7f88ffe006c0 Level-0 table #46: started
2024/04/26-19:25:18.595980 7f88ffe006c0 Level-0 table #46: 0 bytes OK
2024/04/26-19:25:18.630930 7f88ffe006c0 Delete type=0 #44
2024/04/26-19:25:18.747411 7f88ffe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2024/04/26-19:25:18.747487 7f88ffe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)

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

@ -0,0 +1,15 @@
2024/04/26-18:42:26.291319 7f8906a006c0 Recovering log #36
2024/04/26-18:42:26.301937 7f8906a006c0 Delete type=3 #34
2024/04/26-18:42:26.302002 7f8906a006c0 Delete type=0 #36
2024/04/26-19:22:04.316977 7f88ffe006c0 Level-0 table #41: started
2024/04/26-19:22:04.320512 7f88ffe006c0 Level-0 table #41: 1610 bytes OK
2024/04/26-19:22:04.326671 7f88ffe006c0 Delete type=0 #39
2024/04/26-19:22:04.358352 7f88ffe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2024/04/26-19:22:04.389705 7f88ffe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at '!scenes!wJJTdzEVyJpkUXaM' @ 4 : 1
2024/04/26-19:22:04.389720 7f88ffe006c0 Compacting 1@1 + 1@2 files
2024/04/26-19:22:04.392996 7f88ffe006c0 Generated table #42@1: 2 keys, 1610 bytes
2024/04/26-19:22:04.393035 7f88ffe006c0 Compacted 1@1 + 1@2 files => 1610 bytes
2024/04/26-19:22:04.400428 7f88ffe006c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2024/04/26-19:22:04.400531 7f88ffe006c0 Delete type=2 #5
2024/04/26-19:22:04.400646 7f88ffe006c0 Delete type=2 #41
2024/04/26-19:22:04.400749 7f88ffe006c0 Manual compaction at level-1 from '!scenes!wJJTdzEVyJpkUXaM' @ 4 : 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-000038
MANIFEST-000159

View File

@ -1,7 +1,7 @@
2023/08/08-09:07:13.603739 7f5afddfa6c0 Recovering log #36
2023/08/08-09:07:13.613381 7f5afddfa6c0 Delete type=3 #34
2023/08/08-09:07:13.613431 7f5afddfa6c0 Delete type=0 #36
2023/08/08-09:07:28.018452 7f58677fe6c0 Level-0 table #41: started
2023/08/08-09:07:28.018491 7f58677fe6c0 Level-0 table #41: 0 bytes OK
2023/08/08-09:07:28.055806 7f58677fe6c0 Delete type=0 #39
2023/08/08-09:07:28.130329 7f58677fe6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
2024/04/26-19:22:08.694940 7f89056006c0 Recovering log #156
2024/04/26-19:22:08.705096 7f89056006c0 Delete type=3 #154
2024/04/26-19:22:08.705158 7f89056006c0 Delete type=0 #156
2024/04/26-19:25:18.631092 7f88ffe006c0 Level-0 table #162: started
2024/04/26-19:25:18.631157 7f88ffe006c0 Level-0 table #162: 0 bytes OK
2024/04/26-19:25:18.673806 7f88ffe006c0 Delete type=0 #160
2024/04/26-19:25:18.747426 7f88ffe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,14 @@
2023/08/08-08:56:25.009829 7f5867fff6c0 Recovering log #32
2023/08/08-08:56:25.043069 7f5867fff6c0 Delete type=3 #30
2023/08/08-08:56:25.043120 7f5867fff6c0 Delete type=0 #32
2023/08/08-09:07:10.688033 7f58677fe6c0 Level-0 table #37: started
2023/08/08-09:07:10.688071 7f58677fe6c0 Level-0 table #37: 0 bytes OK
2023/08/08-09:07:10.694013 7f58677fe6c0 Delete type=0 #35
2023/08/08-09:07:10.710270 7f58677fe6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
2024/04/26-18:42:26.237456 7f89074006c0 Recovering log #152
2024/04/26-18:42:26.248857 7f89074006c0 Delete type=3 #150
2024/04/26-18:42:26.249007 7f89074006c0 Delete type=0 #152
2024/04/26-19:22:04.337456 7f88ffe006c0 Level-0 table #157: started
2024/04/26-19:22:04.340711 7f88ffe006c0 Level-0 table #157: 14514 bytes OK
2024/04/26-19:22:04.346950 7f88ffe006c0 Delete type=0 #155
2024/04/26-19:22:04.369097 7f88ffe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at '!items!yozTUjNuc2rEGjFK' @ 208 : 1
2024/04/26-19:22:04.369120 7f88ffe006c0 Compacting 1@0 + 1@1 files
2024/04/26-19:22:04.373318 7f88ffe006c0 Generated table #158@0: 113 keys, 16306 bytes
2024/04/26-19:22:04.373343 7f88ffe006c0 Compacted 1@0 + 1@1 files => 16306 bytes
2024/04/26-19:22:04.379990 7f88ffe006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2024/04/26-19:22:04.380097 7f88ffe006c0 Delete type=2 #9
2024/04/26-19:22:04.380204 7f88ffe006c0 Delete type=2 #157
2024/04/26-19:22:04.400725 7f88ffe006c0 Manual compaction at level-0 from '!items!yozTUjNuc2rEGjFK' @ 208 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/traits/000158.ldb Normal file

Binary file not shown.

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

View File

@ -1 +1 @@
MANIFEST-000038
MANIFEST-000159

View File

@ -1,7 +1,7 @@
2023/08/08-09:07:13.616518 7f5afd5f96c0 Recovering log #36
2023/08/08-09:07:13.626497 7f5afd5f96c0 Delete type=3 #34
2023/08/08-09:07:13.626556 7f5afd5f96c0 Delete type=0 #36
2023/08/08-09:07:28.130506 7f58677fe6c0 Level-0 table #41: started
2023/08/08-09:07:28.130559 7f58677fe6c0 Level-0 table #41: 0 bytes OK
2023/08/08-09:07:28.173605 7f58677fe6c0 Delete type=0 #39
2023/08/08-09:07:28.221390 7f58677fe6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
2024/04/26-19:22:08.721470 7f8906a006c0 Recovering log #156
2024/04/26-19:22:08.732531 7f8906a006c0 Delete type=3 #154
2024/04/26-19:22:08.732624 7f8906a006c0 Delete type=0 #156
2024/04/26-19:25:18.716069 7f88ffe006c0 Level-0 table #162: started
2024/04/26-19:25:18.716099 7f88ffe006c0 Level-0 table #162: 0 bytes OK
2024/04/26-19:25:18.747273 7f88ffe006c0 Delete type=0 #160
2024/04/26-19:25:18.747446 7f88ffe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,14 @@
2023/08/08-08:56:25.046084 7f5afcdf86c0 Recovering log #32
2023/08/08-08:56:25.085370 7f5afcdf86c0 Delete type=3 #30
2023/08/08-08:56:25.085408 7f5afcdf86c0 Delete type=0 #32
2023/08/08-09:07:10.728779 7f58677fe6c0 Level-0 table #37: started
2023/08/08-09:07:10.728820 7f58677fe6c0 Level-0 table #37: 0 bytes OK
2023/08/08-09:07:10.736158 7f58677fe6c0 Delete type=0 #35
2023/08/08-09:07:10.742554 7f58677fe6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
2024/04/26-18:42:26.268836 7f89056006c0 Recovering log #152
2024/04/26-18:42:26.284952 7f89056006c0 Delete type=3 #150
2024/04/26-18:42:26.285029 7f89056006c0 Delete type=0 #152
2024/04/26-19:22:04.347189 7f88ffe006c0 Level-0 table #157: started
2024/04/26-19:22:04.350819 7f88ffe006c0 Level-0 table #157: 3577 bytes OK
2024/04/26-19:22:04.358154 7f88ffe006c0 Delete type=0 #155
2024/04/26-19:22:04.380268 7f88ffe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at '!items!zgNI2haxhBxBDBdl' @ 98 : 1
2024/04/26-19:22:04.380277 7f88ffe006c0 Compacting 1@0 + 1@1 files
2024/04/26-19:22:04.383386 7f88ffe006c0 Generated table #158@0: 25 keys, 4133 bytes
2024/04/26-19:22:04.383409 7f88ffe006c0 Compacted 1@0 + 1@1 files => 4133 bytes
2024/04/26-19:22:04.389454 7f88ffe006c0 compacted to: files[ 0 1 0 0 0 0 0 ]
2024/04/26-19:22:04.389551 7f88ffe006c0 Delete type=2 #9
2024/04/26-19:22:04.389636 7f88ffe006c0 Delete type=2 #157
2024/04/26-19:22:04.400736 7f88ffe006c0 Manual compaction at level-0 from '!items!zgNI2haxhBxBDBdl' @ 98 : 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;
}
.item-name-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
@ -1275,6 +1276,16 @@ ul, li {
max-width: 6rem;
min-width: 6rem;
}
.item-name-label-medium2 {
margin-top: 4px;
flex-grow:0;
max-width: 10rem;
min-width: 10rem;
}
.item-name-label-free {
margin-top: 4px;
align-self: flex-start;
}
.item-name-label-long2 {
margin-top: 4px;
flex-grow:2;
@ -1287,10 +1298,17 @@ ul, li {
min-width: 9rem;
}
.item-field-label-short {
margin-top: 4px;
flex-grow:1;
max-width: 4rem;
min-width: 4rem;
}
.item-field-label-short-header {
margin-top: 4px;
flex-grow:1;
max-width: 2.2rem;
min-width: 2.2rem;
}
.item-field-label-medium {
flex-grow:1;
max-width: 6rem;
@ -1321,12 +1339,21 @@ ul, li {
min-width:2rem;
max-width: 2rem;
}
.item-controls-fixed-full {
min-width:3rem;
max-width: 3rem;
}
.attribute-label {
font-weight: bold;
}
.flexrow-no-expand {
flex-grow: 0;
}
.flexrow-start {
justify-content: flex-start;
align-content: flex-start;
align-self: flex-start;
}
.item-input-small {
max-width: 16px;
max-height: 12px;

View File

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

View File

@ -62,6 +62,18 @@
"ASSISTANT": "OWNER"
}
},
{
"label": "Scenes",
"type": "Scene",
"name": "scenes",
"path": "packs/scenes",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Maneuvers",
"type": "Item",
@ -73,13 +85,25 @@
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
},
{
"label": "Help/Aides",
"type": "JournalEntry",
"name": "help",
"path": "packs/help",
"system": "fvtt-ecryme",
"flags": {},
"ownership": {
"PLAYER": "OBSERVER",
"ASSISTANT": "OWNER"
}
}
],
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/raw/branch/master/system.json",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/system.json",
"compatibility": {
"minimum": "10",
"verified": "11"
"minimum": "11",
"verified": "12"
},
"id": "fvtt-ecryme",
"primaryTokenAttribute": "secondary.health",
@ -88,9 +112,18 @@
"styles": [
"styles/ecryme.css"
],
"relationships": {
"requires": [
{
"id": "babele",
"type": "module",
"compatibility": {}
}
]
},
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme",
"version": "11.0.13",
"download": "https://www.uberwald.me/gitea/uberwald/fvtt-ecryme/archive/fvtt-ecryme-v11.0.13.zip",
"url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
"version": "12.0.0",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v12.0.0.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@ -1,7 +1,7 @@
{
"Actor": {
"types": [
"pc"
"pc","annency", "npc"
],
"templates": {
"biodata": {
@ -24,9 +24,11 @@
},
"core": {
"subactors": [],
"equipmentfree": "",
"skills": {
"physical": {
"name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": {
"athletics": {
"name": "ECRY.ui.athletics",
@ -57,6 +59,7 @@
},
"mental": {
"name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": {
"anthropomecanology": {
"name": "ECRY.ui.anthropomecanology",
@ -87,6 +90,7 @@
},
"social": {
"name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": {
"quibbling": {
"name": "ECRY.ui.quibbling",
@ -136,20 +140,6 @@
"major": 0
}
},
"annency": {
"iscollective": false,
"ismultiple": false,
"characters": "",
"location": {"1": "", "2": "", "3":"", "4":"", "5":"" },
"description": "",
"enhancements": "",
"boheme": {
"name": "",
"ideals": "",
"politic": "",
"description": ""
}
},
"cephaly": {
"name": "ECRY.ui.cephaly",
"skilllist": {
@ -187,8 +177,35 @@
"npccore": {
"npctype": "",
"description": ""
},
"annency": {
"base": {
"iscollective": false,
"ismultiple": false,
"characters": [],
"location": {"1": "", "2": "", "3":"", "4":"", "5":"" },
"description": "",
"enhancements": ""
},
"boheme": {
"name": "",
"ideals": "",
"politic": "",
"description": ""
}
}
},
"annency": {
"templates": [
"annency"
]
},
"npc": {
"templates": [
"biodata",
"core"
]
},
"pc": {
"templates": [
"biodata",
@ -253,6 +270,7 @@
"effect": 0
},
"specialization": {
"bonus": 2,
"templates": [
"common"
],

View File

@ -15,27 +15,40 @@
<div class="flexrow">
<ul>
<li class="flexrow item" data-item-id="{{spleen.id}}">
<label class="item-name-label-medium">Spleen :</label>
<label class="item-field-label-short">Spleen :</label>
<label class="item-name-label-long">{{spleen.name}}</label>
<div class="item-filler">&nbsp;</div>
{{#if spleen}}
<div class="item-controls item-controls-fixed">
<div class="item-controls item-controls-fixed-full">
<a class="item-control item-add" data-type="trait" title="Create Trait"><i
class="fas fa-plus"></i></a>
<a class="item-control item-edit" data-type="trait" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i class="fas fa-plus"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
class="fas fa-trash"></i></a>
</div>
{{/if}}
</li>
<li class="item flexrow" data-item-id="{{ideal.id}}">
<label class="item-name-label-medium">Ideal :</label>
<label class="item-field-label-short">Ideal :</label>
<label class="item-name-label-long">{{ideal.name}}</label>
<div class="item-filler">&nbsp;</div>
{{#if ideal}}
<div class="item-controls item-controls-fixed">
<div class="item-controls item-controls-fixed-full">
<a class="item-control item-add" data-type="trait" title="Create Trait"><i
class="fas fa-plus"></i></a>
<a class="item-control item-edit" data-type="trait" title="Edit Item"><i class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i class="fas fa-plus"></i></a>
<a class="item-control item-add" data-type="trait" title="Delete Item"><i
class="fas fa-trash"></i></a>
</div>
{{/if}}
</li>
<li class="item flexrow flexrow-no-expand flexrow-start ">
<label class="item-name-label-short">Traits :</label>
{{#each traits as |trait key|}}
<label class="item-name-label-free"><a data-item-id="{{trait._id}}" class="item-edit">{{trait.name}}</a>,&nbsp;</label>
{{/each}}
</li>
</ul>
</div>
@ -72,10 +85,29 @@
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header impact-title">
<h3><label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus
categkey}})</label></h3>
<h3>
{{#if (eq @root.type "npc")}}
<a class="roll-skill-confront" data-category-key="{{categkey}}" data-skill-key="rawnpc">
<i class="fa-regular fa-swords"></i>
</a>
<a class="roll-skill" data-category-key="{{categkey}}" data-skill-key="rawnpc">
<i class="fa-solid fa-dice-d6"></i>
{{/if}}
<label class="items-title-text">{{localize category.name}} ({{valueAtIndex @root.impactsMalus
categkey}})</label>
{{#if (eq @root.type "npc")}}
</a>
<select class="item-field-label-short-header" type="text"
name="system.skills.{{categkey}}.pnjvalue" value="{{category.pnjvalue}}"
data-dtype="Number">
{{selectOptions @root.config.skillLevel selected=category.pnjvalue}}
</select>
{{/if}}
</h3>
</span>
</li>
{{#each category.skilllist as |skill skillkey|}}
<li class="item flexrow list-item">
<span class="item-name-label-long">
@ -89,26 +121,23 @@
<select class="item-field-label-short" type="text"
name="system.skills.{{categkey}}.skilllist.{{skillkey}}.value" value="{{skill.value}}"
data-dtype="Number">
{{#select skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
</li>
<li class="item flexrow list-item">
<ul class="ul-level1">
{{#each skill.spec as |spec idx|}}
<li class="item flexrow list-item" data-item-id="{{spec._id}}" data-item-type="specialization">
<a class="roll-spec" data-spec-id="{{spec._id}}">
<a class="roll-spec" data-category-key="{{categkey}}" data-skill-key="{{skillkey}}"
data-spec-id="{{spec._id}}">
<i class="fa-solid fa-dice-d6"></i>
{{spec.name}}
</a>
<div class="item-controls item-controls-fixed">
<a class="item-control item-edit" data-type="specialization" title="Edit Item"><i
class="fas fa-edit"></i></a>
<a class="item-control item-add" data-type="specialization" title="Delete Item"><i
class="fas fa-plus"></i></a>
<a class="item-control item-delete" data-type="specialization" title="Delete Item"><i
class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
@ -141,84 +170,27 @@
</a></span>
<select class="item-field-label-short" type="text" name="system.cephaly.skilllist.{{skillkey}}.value"
value="{{skill.value}}" data-dtype="Number">
{{#select skill.value}}
{{#each @root.config.skillLevel as |level key| }}
<option value="{{level}}">{{level}}</option>
{{/each}}
{{/select}}
{{selectOptions @root.config.skillLevel selected=skill.value}}
</select>
</li>
{{/each}}
</ul>
<h3>{{localize "ECRY.ui.annency"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.iscollective"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.annency.iscollective"
value="{{system.annency.iscollective}}" {{checked system.annency.iscollective}} />
<span class="item-name-label-medium">
{{localize "ECRY.ui.ismultiple"}}
</span>
<input type="checkbox" class="item-field-label-short" name="system.annency.ismultiple"
value="{{system.annency.ismultiple}}" {{checked system.annency.ismultiple}} />
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.description"}}
</span>
<textarea class="textarea-default" rows="3" name="system.annency.description">{{system.annency.description}}</textarea>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.characters"}}
</span>
<textarea class="textarea-default" rows="3" name="system.annency.characters">{{system.annency.characters}}</textarea>
</li>
</ul>
<h3>{{localize "ECRY.ui.oniricform"}}</h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.name"}}</span>
<input type="text" class="item-field-label-long" name="system.annency.boheme.name" value="{{system.annency.boheme.name}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.ideals"}}</span>
<input type="text" class="item-field-label-long" name="system.annency.boheme.ideals" value="{{system.annency.boheme.ideals}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.politic"}}</span>
<input type="text" class="item-field-label-long" name="system.annency.boheme.politic" value="{{system.annency.boheme.politic}}" data-dtype="String"/>
</li>
<li class="item flexrow list-item">
<span class="item-name-label-medium">{{localize "ECRY.ui.description"}}</span>
<textarea class="textarea-default" rows="3" name="system.annency.boheme.description">{{system.annency.boheme.description}}</textarea>
</li>
</ul>
</div>
<div>
<h3>{{localize "ECRY.ui.annency"}}</h3>
<ul class="stat-list alternate-list item-list">
{{#each system.annency.location as |location index|}}
{{#if annency}}
<h3>{{localize "ECRY.ui.annency"}} : <a class="open-annency"
data-annency-id="{{annency.id}}">{{annency.name}}<i class="fas fa-edit"></i></a></h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.location"}} {{index}}
<span class="item-name-label-long">
{{annency.system.base.description}}
</span>
<textarea class="textarea-default" rows="3" name="system.annency.location.{{index}}">{{location}}</textarea>
</li>
{{/each}}
<li class="item flexrow list-item">
<span class="item-name-label-medium">
{{localize "ECRY.ui.enhancements"}}
</span>
<textarea class="textarea-default" rows="3" name="system.annency.enhancements">{{system.annency.enhancements}}</textarea>
</li>
</ul>
{{/if}}
</div>
</div>
@ -327,57 +299,22 @@
{{!-- Equipement Tab --}}
<div class="tab equipment" data-group="primary" data-tab="equipment">
<div class="tab equipements" data-group="primary" data-tab="equipements">
<span class="item-name-label-header items-title-bg">
<h3><label class="items-title-text">Equipements (saisie libre)</label></h3>
<h3><label class="items-title-text">{{localize "ECRY.ui.equipmentfree"}}</label></h3>
</span>
<div class="form-group small-editor">
{{editor equipementlibre target="system.equipementlibre" button=true owner=owner editable=editable}}
{{editor equipementlibre target="system.equipmentfree" button=true owner=owner editable=editable}}
</div>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Armes</label></h3>
<h3><label class="items-title-text">{{localize "ECRY.ui.equipment"}}s</label></h3>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Normaux</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Particulier</label>
</span>
<span class="item-field-label-medium">
<label class="item-field-label-medium">Critique</label>
</span>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="weapon" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each armes as |arme key|}}
<li class="item flexrow list-item list-item-shadow" data-item-id="{{arme._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{arme.img}}" /></a>
<span class="item-name-label">{{arme.name}}</span>
<span class="item-field-label-medium"><label>{{arme.system.dommagenormale}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagepart}}</label></span>
<span class="item-field-label-medium"><label>{{arme.system.dommagecritique}}</label></span>
<div class="item-filler">&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>
<label class="item-field-label-medium">{{localize "ECRY.ui.weight"}}</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
@ -385,11 +322,12 @@
</div>
</li>
{{#each equipements as |equip key|}}
{{#each equipments as |equip key|}}
<li class="item list-item flexrow list-item-shadow" data-item-id="{{equip._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{equip.img}}" /></a>
<span class="item-name-label">{{equip.name}}</span>
<span class="item-field-label-medium">{{equip.system.weight}}</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
@ -399,36 +337,6 @@
{{/each}}
</ul>
<ul class="item-list alternate-list">
<li class="item flexrow list-item items-title-bg">
<span class="item-name-label-header">
<h3><label class="items-title-text">Sortilèges</label></h3>
</span>
<span class="item-field-label-medium">
<label class="short-label">Seuil</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-add" data-type="equipment" title="Create Item"><i class="fas fa-plus"></i></a>
</div>
</li>
{{#each sorts as |sort key|}}
<li class="item list-item flexrow list-item-shadow" data-item-id="{{sort._id}}">
<a class="item-edit item-name-img" title="Edit Item"><img class="sheet-competence-img"
src="{{sort.img}}" /></a>
<span class="item-name-label">{{sort.name}}</span>
<span class="item-field-label-medium">
<label class="short-label">{{sort.system.seuil}}</label>
</span>
<div class="item-filler">&nbsp;</div>
<div class="item-controls item-controls-fixed">
<a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
</div>
</li>
{{/each}}
</ul>
<hr>
</div>
@ -440,7 +348,7 @@
<div>
<ul class="item-list alternate-list">
<li class="item flexrow">
<label class="item-name-label-medium">Lieu de naissance</label>
<label class="item-name-label-medium">{{localize "ECRY.ui.bornplace"}}</label>
<input type="text" class="" name="system.biodata.lieunaissance" value="{{system.biodata.lieunaissance}}"
data-dtype="String" />
</li>
@ -449,22 +357,27 @@
<input type="text" class="" name="system.biodata.age" value="{{system.biodata.age}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">Profession</label>
<input type="text" class="" name="system.biodata.profession" value="{{system.biodata.profession}}"
data-dtype="String" />
</li>
</ul>
</div>
<div>
<ul>
<li class="item flexrow">
<label class="item-name-label-medium">Résidence</label>
<label class="item-name-label-medium">{{localize "ECRY.ui.residence"}}</label>
<input type="text" class="" name="system.biodata.residence" value="{{system.biodata.residence}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">Nationalité</label>
<label class="item-name-label-medium">{{localize "ECRY.ui.origin"}}</label>
<input type="text" class="" name="system.biodata.nationalite" value="{{system.biodata.nationalite}}"
data-dtype="String" />
</li>
<li class="item flexrow">
<label class="item-name-label-medium">Enfance</label>
<label class="item-name-label-medium">{{localize "ECRY.ui.childhood"}}</label>
<input type="text" class="" name="system.biodata.enfance" value="{{system.biodata.enfance}}"
data-dtype="String" />
</li>

View File

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

View File

@ -16,14 +16,21 @@
<div>
<ul>
<li>{{localize "ECRY.ui.cephaly"}} : {{localize skill.name}}</li>
{{#if annency}}
<li>{{localize "ECRY.ui.annencybonus"}} {{annency.name}}: {{annencyBonus}}</li>
{{/if}}
{{#if (gt marginExecution 0)}}
<li>{{localize "ECRY.ui.execution"}} {{executionTotal}} vs {{difficulty}} : {{marginExecution}}</li>
<li>{{localize cephalySuccess}}</li>
{{/if}}
{{#if (gt marginPreservation 0)}}
<li>{{localize "ECRY.ui.preservation"}} {{preservationTotal}} vs {{difficulty}} : {{marginPreservation}}</li>
<li>{{localize cephalyFailure}}</li>
{{/if}}
</ul>
</div>

View File

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

View File

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

View File

@ -55,20 +55,13 @@
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.skilltranscendence"}} : </span>
<select class="" id="roll-select-transcendence" data-type="Number">
{{#select skillTranscendence}}
{{#for 0 skill.value 1}}
<option value="{{this}}">{{this}}</option>
{{/for}}
{{/select}}
{{selectOptions config.skillLevel selected=skillTranscendence}}
</select>
</div>
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.transcendapply"}} : </span>
<select class="" id="roll-apply-transcendence" data-type="String">
{{#select applyTranscendence}}
<option value="execution">{{localize "ECRY.ui.execution"}}</option>
<option value="preservation">{{localize "ECRY.ui.preservation"}}</option>
{{/select}}
{{selectOptions config.transcendanceOptions selected=applyTranscendence localize=true}}
</select>
</div>
@ -100,19 +93,29 @@
{{/each}}
</select>
</div>
{{#if annency}}
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.annency"}} : {{annency.name}}</span>
<span class="roll-dialog-label">{{annency.system.base.description}}</span>
</div>
<div class="flexrow">
<span class="roll-dialog-label">{{localize "ECRY.ui.annencybonus"}}</span>
<select class="" id="annency-bonus" name="annencyBonus" data-type="String">
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
<option value="4">+4</option>
<option value="5">+5</option>
</select>
</div>
{{/if}}
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso">
{{#select bonusMalusPerso}}
<option value="-3">-3</option>
<option value="-2">-2</option>
<option value="-1">-1</option>
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
{{/select}}
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso valueAttr="value" labelAttr="label"}}
</select>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,18 @@
"label": "Equipement",
"mapping": {
"description": "system.description"
},
"folders": {
"Armor": "Armure",
"Weapons": "Armes",
"Clothing": "Vêtements",
"Food": "Nourriture",
"Lighting": "Eclairage",
"Miscellany" : "Divers",
"Musical instruments": "Instruments de musique",
"Reading, writing, recording": "Lecture, écriture, enregistrement",
"Travel equipment": "Equipement de voyage",
"Vehicle": "Véhicule"
},
"entries": {
"Absinthe": {

View File

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

View File

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