Compare commits

...

13 Commits

91 changed files with 459 additions and 308 deletions

View File

@ -1,10 +1,12 @@
# Ecryme v2 system for FoundryVTT (French RPG, Open Sesam Games, Official)
This is a base game system with functionnal character sheets for the game Ecryme, powered by the Engrenage system.
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

View File

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

4
images/.directory Normal file
View File

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

4
images/assets/.directory Normal file
View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 171 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 388 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

4
images/ui/.directory Normal file
View File

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

View File

@ -33,7 +33,9 @@
"traitbonus": "Bonus trait",
"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",

View File

@ -33,7 +33,9 @@
"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",

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,21 +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()),
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()),
subActors: foundry.utils.duplicate(this.actor.getSubActors()),
annency: this.actor.getAnnency(),
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 }),
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,
@ -90,6 +90,9 @@ export class EcrymeActorSheet extends ActorSheet {
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);
});

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;
@ -73,7 +73,7 @@ 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)
}
@ -92,7 +92,7 @@ export class EcrymeActor extends Actor {
}
/* ----------------------- --------------------- */
addAnnencyActor(actorId) {
let members = duplicate(this.system.base.characters)
let members = foundry.utils.duplicate(this.system.base.characters)
members.push(actorId)
this.update({ 'system.base.characters': members })
}
@ -103,7 +103,8 @@ export class EcrymeActor extends Actor {
/* -------------------------------------------- */
getAnnency() {
return game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id))
let annency = game.actors.find(a => a.type == 'annency' && a.system.base.characters.includes(this.id))
return annency || {}
}
/* -------------------------------------------- */
getConfrontations() {
@ -135,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) {
@ -147,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;
}
@ -170,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;
}
@ -205,7 +206,7 @@ export class EcrymeActor extends Actor {
/* ------------------------------------------- */
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 = []
@ -300,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 });
}
@ -377,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
@ -387,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)
@ -416,7 +434,7 @@ export class EcrymeActor extends Actor {
let spec = this.items.find(it => it.type == "specialization" && it.id == specId)
rollData.mode = "skill"
rollData.selectedSpecs = [spec.id]
rollData.forcedSpec = duplicate(spec)
rollData.forcedSpec = foundry.utils.duplicate(spec)
rollData.title = game.i18n.localize(rollData.skill.name)
this.startRoll(rollData).catch("Error on startRoll")
}
@ -429,8 +447,9 @@ export class EcrymeActor extends Actor {
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.applyTranscendence = "execution"
rollData.traitsBonus = duplicate(rollData.traits)
rollData.traitsMalus = duplicate(rollData.traits)
rollData.traitsBonus = foundry.utils.duplicate(rollData.traits)
rollData.traitsMalus = foundry.utils.duplicate(rollData.traits)
console.log("ROLLDATA", rollData)
let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData)
confrontStartDialog.render(true)
}
@ -438,17 +457,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.annency = duplicate(this.getAnnency())
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)
@ -464,12 +482,12 @@ export class EcrymeActor extends Actor {
rollData = this.getCommonSkill("physical", "shooting")
}
rollData.mode = "weapon"
rollData.weapon = duplicate(weapon)
rollData.weapon = foundry.utils.duplicate(weapon)
rollData.title = game.i18n.localize("ECRY.ui.confrontation") + " : " + game.i18n.localize(rollData.skill.name)
rollData.executionTotal = rollData.skill.value
rollData.preservationTotal = rollData.skill.value
rollData.traitsBonus = 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)
@ -479,12 +497,12 @@ export class EcrymeActor extends Actor {
rollWeapon(weaponId) {
let weapon = this.items.get(weaponId)
if (weapon) {
weapon = duplicate(weapon)
weapon = foundry.utils.duplicate(weapon)
let rollData = this.getCommonRollData()
if (weapon.system.armetype == "mainsnues" || weapon.system.armetype == "epee") {
rollData.attr = { label: "(Physique+Habilité)/2", value: Math.floor((this.getPhysiqueMalus() + this.system.attributs.physique.value + this.system.attributs.habilite.value) / 2) }
} else {
rollData.attr = duplicate(this.system.attributs.habilite)
rollData.attr = foundry.utils.duplicate(this.system.attributs.habilite)
}
rollData.mode = "weapon"
rollData.weapon = weapon

View File

@ -11,7 +11,7 @@ export class EcrymeAnnencySheet 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/annency-sheet.hbs",
width: 640,
@ -33,9 +33,9 @@ export class EcrymeAnnencySheet 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,
config: duplicate(game.system.ecryme.config),
config: foundry.utils.duplicate(game.system.ecryme.config),
hasCephaly: EcrymeUtility.hasCephaly(),
hasBoheme: EcrymeUtility.hasBoheme(),
hasAmertume: EcrymeUtility.hasAmertume(),

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

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

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
}
@ -215,7 +216,7 @@ export class EcrymeUtility {
confront.impactPreservation = this.getImpactFromEffect(Math.abs(confront.effectPreservation))
}
if (confront.marginPreservation > 0) {
confront.bonus1 = -confront.marginPreservation
confront.bonus1 = confront.marginPreservation
}
let msg = await this.createChatWithRollMode(this.confrontData1.alias, {
@ -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)
}
}
}
@ -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,7 +540,7 @@ 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
@ -551,7 +558,7 @@ export class EcrymeUtility {
let actor = game.actors.get(rollData.actorId)
// Fix difficulty
if (!rollData.difficulty || rollData.difficulty == "-") {
if (!rollData.difficulty || rollData.difficulty == "-1") {
rollData.difficulty = 0
}
rollData.difficulty = Number(rollData.difficulty)
@ -559,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
@ -631,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 });
}
@ -656,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;
@ -682,20 +683,20 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static getBasicRollData() {
let rollData = {
rollId: randomID(16),
rollId: foundry.utils.randomID(16),
type: "roll-data",
bonusMalusPerso: 0,
bonusMalusPerso: "0",
bonusMalusSituation: 0,
bonusMalusDef: 0,
annencyBonus: 0,
bonusMalusPortee: 0,
skillTranscendence: 0,
rollMode: game.settings.get("core", "rollMode"),
difficulty: "-",
difficulty: "-1",
useSpleen: false,
useIdeal: false,
impactMalus: 0,
config: duplicate(game.system.ecryme.config)
config: foundry.utils.duplicate(game.system.ecryme.config)
}
EcrymeUtility.updateWithTarget(rollData)
return rollData

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"
@ -151,9 +163,9 @@ export class EcrymeConfrontDialog extends Dialog {
// Apply Transcend if needed
if (this.rollData.skillTranscendence > 0) {
if (this.rollData.applyTranscendence == "execution") {
this.rollData.executionTotal += this.rollData.skillTranscendence
this.rollData.executionTotal += Number(this.rollData.skillTranscendence)
} else {
this.rollData.preservationTotal += this.rollData.skillTranscendence
this.rollData.preservationTotal += Number(this.rollData.skillTranscendence)
}
}
}
@ -180,7 +192,7 @@ export class EcrymeConfrontDialog extends Dialog {
this.processTranscendence()
if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) {
rollData.spec = duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0]))
rollData.specApplied = true
rollData.executionTotal += 2
rollData.preservationTotal += 2
@ -200,19 +212,19 @@ export class EcrymeConfrontDialog extends Dialog {
for (let id of rollData.traitsBonusSelected) {
let trait = rollData.traitsBonus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits += trait.system.level
rollData.bonusMalusTraits += Number(trait.system.level)
}
}
if (rollData.traitsMalusSelected && rollData.traitsMalusSelected.length > 0) {
for (let id of rollData.traitsMalusSelected) {
let trait = rollData.traitsMalus.find(t => t._id == id)
trait.activated = true
rollData.bonusMalusTraits -= trait.system.level
rollData.bonusMalusTraits -= Number(trait.system.level)
}
}
rollData.executionTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
rollData.preservationTotal += rollData.bonusMalusTraits + rollData.bonusMalusPerso
rollData.executionTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
rollData.preservationTotal += Number(rollData.bonusMalusTraits) + Number(rollData.bonusMalusPerso)
this.refreshDialog()
}
@ -222,7 +234,7 @@ export class EcrymeConfrontDialog extends Dialog {
super.activateListeners(html);
html.find('#bonusMalusPerso').change((event) => {
this.rollData.bonusMalusPerso = Number(event.currentTarget.value)
this.rollData.bonusMalusPerso = event.currentTarget.value
this.computeTotals()
})
html.find('#roll-specialization').change((event) => {

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

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

View File

@ -67,7 +67,6 @@ Hooks.once("init", async function () {
EcrymeUtility.init()
console.log("Babele INIT!")
Babele.get().setSystemTranslationsDir("translated")
});
@ -84,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();
}
}
@ -123,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-000106
MANIFEST-000163

View File

@ -1,7 +1,7 @@
2023/10/10-15:44:15.214470 7fb8baffd6c0 Recovering log #104
2023/10/10-15:44:15.228942 7fb8baffd6c0 Delete type=3 #102
2023/10/10-15:44:15.229018 7fb8baffd6c0 Delete type=0 #104
2023/10/10-16:47:17.816560 7fb8b97fa6c0 Level-0 table #109: started
2023/10/10-16:47:17.816585 7fb8b97fa6c0 Level-0 table #109: 0 bytes OK
2023/10/10-16:47:17.822797 7fb8b97fa6c0 Delete type=0 #107
2023/10/10-16:47:17.832584 7fb8b97fa6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
2024/04/27-08:47:55.410828 7fc5c4c006c0 Recovering log #161
2024/04/27-08:47:55.422094 7fc5c4c006c0 Delete type=3 #159
2024/04/27-08:47:55.422190 7fc5c4c006c0 Delete type=0 #161
2024/04/27-09:26:42.196858 7fc5bfe006c0 Level-0 table #166: started
2024/04/27-09:26:42.196924 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
2024/04/27-09:26:42.203539 7fc5bfe006c0 Delete type=0 #164
2024/04/27-09:26:42.227249 7fc5bfe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/10/10-14:47:37.319172 7fb8b9ffb6c0 Recovering log #100
2023/10/10-14:47:37.374764 7fb8b9ffb6c0 Delete type=3 #98
2023/10/10-14:47:37.374842 7fb8b9ffb6c0 Delete type=0 #100
2023/10/10-15:44:02.360675 7fb8b97fa6c0 Level-0 table #105: started
2023/10/10-15:44:02.360734 7fb8b97fa6c0 Level-0 table #105: 0 bytes OK
2023/10/10-15:44:02.452513 7fb8b97fa6c0 Delete type=0 #103
2023/10/10-15:44:02.600640 7fb8b97fa6c0 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)

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
packs/help/000095.ldb Normal file

Binary file not shown.

View File

@ -1 +1 @@
MANIFEST-000042
MANIFEST-000100

View File

@ -1,8 +1,8 @@
2023/10/10-15:44:15.264794 7fb8bb7fe6c0 Recovering log #40
2023/10/10-15:44:15.274945 7fb8bb7fe6c0 Delete type=3 #38
2023/10/10-15:44:15.275026 7fb8bb7fe6c0 Delete type=0 #40
2023/10/10-16:47:17.838950 7fb8b97fa6c0 Level-0 table #45: started
2023/10/10-16:47:17.838969 7fb8b97fa6c0 Level-0 table #45: 0 bytes OK
2023/10/10-16:47:17.846123 7fb8b97fa6c0 Delete type=0 #43
2023/10/10-16:47:17.846349 7fb8b97fa6c0 Manual compaction at level-0 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2023/10/10-16:47:17.846379 7fb8b97fa6c0 Manual compaction at level-1 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/04/27-08:47:55.474153 7fc5c56006c0 Recovering log #98
2024/04/27-08:47:55.484458 7fc5c56006c0 Delete type=3 #96
2024/04/27-08:47:55.484547 7fc5c56006c0 Delete type=0 #98
2024/04/27-09:26:42.227493 7fc5bfe006c0 Level-0 table #103: started
2024/04/27-09:26:42.227557 7fc5bfe006c0 Level-0 table #103: 0 bytes OK
2024/04/27-09:26:42.234320 7fc5bfe006c0 Delete type=0 #101
2024/04/27-09:26:42.234536 7fc5bfe006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/04/27-09:26:42.234577 7fc5bfe006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)

View File

@ -1,8 +1,8 @@
2023/10/10-14:47:37.522181 7fb8ba7fc6c0 Recovering log #36
2023/10/10-14:47:37.575247 7fb8ba7fc6c0 Delete type=3 #34
2023/10/10-14:47:37.575386 7fb8ba7fc6c0 Delete type=0 #36
2023/10/10-15:44:02.669413 7fb8b97fa6c0 Level-0 table #41: started
2023/10/10-15:44:02.669471 7fb8b97fa6c0 Level-0 table #41: 0 bytes OK
2023/10/10-15:44:02.803436 7fb8b97fa6c0 Delete type=0 #39
2023/10/10-15:44:02.803585 7fb8b97fa6c0 Manual compaction at level-0 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2023/10/10-15:44:02.803610 7fb8b97fa6c0 Manual compaction at level-1 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
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)

Binary file not shown.

BIN
packs/help/MANIFEST-000100 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-000106
MANIFEST-000163

View File

@ -1,7 +1,7 @@
2023/10/10-15:44:15.251468 7fb8ba7fc6c0 Recovering log #104
2023/10/10-15:44:15.263005 7fb8ba7fc6c0 Delete type=3 #102
2023/10/10-15:44:15.263083 7fb8ba7fc6c0 Delete type=0 #104
2023/10/10-16:47:17.832601 7fb8b97fa6c0 Level-0 table #109: started
2023/10/10-16:47:17.832642 7fb8b97fa6c0 Level-0 table #109: 0 bytes OK
2023/10/10-16:47:17.838860 7fb8b97fa6c0 Delete type=0 #107
2023/10/10-16:47:17.846327 7fb8b97fa6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
2024/04/27-08:47:55.459426 7fc5c4c006c0 Recovering log #161
2024/04/27-08:47:55.470519 7fc5c4c006c0 Delete type=3 #159
2024/04/27-08:47:55.470616 7fc5c4c006c0 Delete type=0 #161
2024/04/27-09:26:42.211453 7fc5bfe006c0 Level-0 table #166: started
2024/04/27-09:26:42.211516 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
2024/04/27-09:26:42.218445 7fc5bfe006c0 Delete type=0 #164
2024/04/27-09:26:42.227295 7fc5bfe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/10/10-14:47:37.452515 7fb8baffd6c0 Recovering log #100
2023/10/10-14:47:37.516010 7fb8baffd6c0 Delete type=3 #98
2023/10/10-14:47:37.516087 7fb8baffd6c0 Delete type=0 #100
2023/10/10-15:44:02.600756 7fb8b97fa6c0 Level-0 table #105: started
2023/10/10-15:44:02.600790 7fb8b97fa6c0 Level-0 table #105: 0 bytes OK
2023/10/10-15:44:02.669263 7fb8b97fa6c0 Delete type=0 #103
2023/10/10-15:44:02.803564 7fb8b97fa6c0 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)

Binary file not shown.

Binary file not shown.

BIN
packs/scenes/000042.ldb Normal file

Binary file not shown.

1
packs/scenes/CURRENT Normal file
View File

@ -0,0 +1 @@
MANIFEST-000047

8
packs/scenes/LOG Normal file
View File

@ -0,0 +1,8 @@
2024/04/27-08:47:55.443420 7fc5c4c006c0 Recovering log #45
2024/04/27-08:47:55.454090 7fc5c4c006c0 Delete type=3 #43
2024/04/27-08:47:55.454232 7fc5c4c006c0 Delete type=0 #45
2024/04/27-09:26:42.203748 7fc5bfe006c0 Level-0 table #50: started
2024/04/27-09:26:42.203807 7fc5bfe006c0 Level-0 table #50: 0 bytes OK
2024/04/27-09:26:42.211166 7fc5bfe006c0 Delete type=0 #48
2024/04/27-09:26:42.227275 7fc5bfe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2024/04/27-09:26:42.227330 7fc5bfe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)

8
packs/scenes/LOG.old Normal file
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)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

View File

@ -1 +1 @@
MANIFEST-000106
MANIFEST-000163

View File

@ -1,7 +1,7 @@
2023/10/10-15:44:15.196298 7fb8bb7fe6c0 Recovering log #104
2023/10/10-15:44:15.211750 7fb8bb7fe6c0 Delete type=3 #102
2023/10/10-15:44:15.211839 7fb8bb7fe6c0 Delete type=0 #104
2023/10/10-16:47:17.809484 7fb8b97fa6c0 Level-0 table #109: started
2023/10/10-16:47:17.809511 7fb8b97fa6c0 Level-0 table #109: 0 bytes OK
2023/10/10-16:47:17.816437 7fb8b97fa6c0 Delete type=0 #107
2023/10/10-16:47:17.832558 7fb8b97fa6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
2024/04/27-08:47:55.395447 7fc5c56006c0 Recovering log #161
2024/04/27-08:47:55.406766 7fc5c56006c0 Delete type=3 #159
2024/04/27-08:47:55.406871 7fc5c56006c0 Delete type=0 #161
2024/04/27-09:26:42.188991 7fc5bfe006c0 Level-0 table #166: started
2024/04/27-09:26:42.189072 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
2024/04/27-09:26:42.196426 7fc5bfe006c0 Delete type=0 #164
2024/04/27-09:26:42.196728 7fc5bfe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/10/10-14:47:37.259593 7fb8ba7fc6c0 Recovering log #100
2023/10/10-14:47:37.309331 7fb8ba7fc6c0 Delete type=3 #98
2023/10/10-14:47:37.309445 7fb8ba7fc6c0 Delete type=0 #100
2023/10/10-15:44:02.452840 7fb8b97fa6c0 Level-0 table #105: started
2023/10/10-15:44:02.452904 7fb8b97fa6c0 Level-0 table #105: 0 bytes OK
2023/10/10-15:44:02.530099 7fb8b97fa6c0 Delete type=0 #103
2023/10/10-15:44:02.600658 7fb8b97fa6c0 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)

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/000165.log Normal file
View File

View File

@ -1 +1 @@
MANIFEST-000106
MANIFEST-000163

View File

@ -1,7 +1,7 @@
2023/10/10-15:44:15.233698 7fb8b9ffb6c0 Recovering log #104
2023/10/10-15:44:15.249165 7fb8b9ffb6c0 Delete type=3 #102
2023/10/10-15:44:15.249275 7fb8b9ffb6c0 Delete type=0 #104
2023/10/10-16:47:17.823003 7fb8b97fa6c0 Level-0 table #109: started
2023/10/10-16:47:17.823041 7fb8b97fa6c0 Level-0 table #109: 0 bytes OK
2023/10/10-16:47:17.832350 7fb8b97fa6c0 Delete type=0 #107
2023/10/10-16:47:17.838938 7fb8b97fa6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
2024/04/27-08:47:55.428744 7fc5c56006c0 Recovering log #161
2024/04/27-08:47:55.439052 7fc5c56006c0 Delete type=3 #159
2024/04/27-08:47:55.439149 7fc5c56006c0 Delete type=0 #161
2024/04/27-09:26:42.218635 7fc5bfe006c0 Level-0 table #166: started
2024/04/27-09:26:42.218676 7fc5bfe006c0 Level-0 table #166: 0 bytes OK
2024/04/27-09:26:42.227027 7fc5bfe006c0 Delete type=0 #164
2024/04/27-09:26:42.227313 7fc5bfe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

View File

@ -1,7 +1,7 @@
2023/10/10-14:47:37.382454 7fb8bb7fe6c0 Recovering log #100
2023/10/10-14:47:37.442416 7fb8bb7fe6c0 Delete type=3 #98
2023/10/10-14:47:37.442914 7fb8bb7fe6c0 Delete type=0 #100
2023/10/10-15:44:02.530318 7fb8b97fa6c0 Level-0 table #105: started
2023/10/10-15:44:02.530361 7fb8b97fa6c0 Level-0 table #105: 0 bytes OK
2023/10/10-15:44:02.600527 7fb8b97fa6c0 Delete type=0 #103
2023/10/10-15:44:02.600692 7fb8b97fa6c0 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)

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;
@ -1331,6 +1349,11 @@ ul, li {
.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;
@ -1311,6 +1329,11 @@ ul, li {
.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",
@ -90,8 +102,8 @@
"license": "LICENSE.txt",
"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",
@ -111,7 +123,7 @@
},
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
"version": "11.0.36",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v11.0.36.zip",
"version": "12.0.1",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v12.0.1.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@ -28,6 +28,7 @@
"skills": {
"physical": {
"name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": {
"athletics": {
"name": "ECRY.ui.athletics",
@ -58,6 +59,7 @@
},
"mental": {
"name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": {
"anthropomecanology": {
"name": "ECRY.ui.anthropomecanology",
@ -88,6 +90,7 @@
},
"social": {
"name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": {
"quibbling": {
"name": "ECRY.ui.quibbling",

View File

@ -15,29 +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-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-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-trash"></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-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-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-trash"></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>
@ -74,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">
@ -91,18 +121,15 @@
<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-category-key="{{categkey}}" data-skill-key="{{skillkey}}" 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>
@ -143,11 +170,7 @@
</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}}
@ -157,7 +180,8 @@
<div>
{{#if annency}}
<h3>{{localize "ECRY.ui.annency"}} : <a class="open-annency" data-annency-id="{{annency.id}}">{{annency.name}}<i class="fas fa-edit"></i></a></h3>
<h3>{{localize "ECRY.ui.annency"}} : <a class="open-annency"
data-annency-id="{{annency.id}}">{{annency.name}}<i class="fas fa-edit"></i></a></h3>
<ul class="stat-list alternate-list item-list">
<li class="item flexrow list-item">
<span class="item-name-label-long">

View File

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

@ -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>
@ -121,16 +114,8 @@
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso">
{{#select bonusMalusPerso}}
<option value="-3">-3</option>
<option value="-2">-2</option>
<option value="-1">-1</option>
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
{{/select}}
<select id="bonusMalusPerso" name="bonusMalusPerso" type="text" data-dtype="String">
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
</select>
</div>

View File

@ -14,11 +14,7 @@
<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>
@ -75,16 +71,8 @@
<div class="flexrow">
<span class="roll-dialog-label">Bonus/Malus : </span>
<select id="bonusMalusPerso" name="bonusMalusPerso">
{{#select bonusMalusPerso}}
<option value="-3">-3</option>
<option value="-2">-2</option>
<option value="-1">-1</option>
<option value="0">0</option>
<option value="1">+1</option>
<option value="2">+2</option>
<option value="3">+3</option>
{{/select}}
<select type="text" id="bonusMalusPerso" name="bonusMalusPerso" data-dtype="String">
{{selectOptions config.bonusMalusPersoOptions selected=bonusMalusPerso labelAttr="label"}}
</select>
</div>

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

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>
<select class="item-field-label-medium" type="text" name="system.level" value="{{system.level}}" data-dtype="String">
{{selectOptions config.traitLevel selected=system.level labelAttr="text"}}
</li>
</ul>
</div>

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 labelAttr="name"}}
</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": {