Compare commits

...

28 Commits

Author SHA1 Message Date
e47ad95a38 Fix FR translatrion with babele 2026-02-18 00:08:07 +01:00
fc386487e8 Fix FR translatrion with babele 2026-02-17 23:38:06 +01:00
bda88c067e Release with specific message 2025-10-17 22:50:39 +02:00
4003e0e42b Release with specific message 2025-10-17 22:50:04 +02:00
a6d811bcda Sync message 2025-10-17 15:32:44 +02:00
94eb637637 Sync message 2025-10-17 15:32:22 +02:00
8c58367cdc Sync message 2025-10-17 15:31:53 +02:00
c439ca978c Update internal system with dynamic message 2025-10-17 15:17:04 +02:00
ffe1144f2a Update internal system with dynamic message 2025-10-17 15:16:00 +02:00
38ef07d17b Update internal system with dynamic message 2025-10-17 15:15:03 +02:00
a8cc2dce4b Update internal system with dynamic message 2025-10-17 15:14:29 +02:00
0fadd0783c Update internal system with dynamic message 2025-10-17 15:12:19 +02:00
a55a038d32 Update internal system with dynamic message 2025-10-17 15:01:42 +02:00
d012f78881 Update internal system with dynamic message 2025-10-17 14:59:37 +02:00
01e13da234 Correction sur application tokens acteurs 2025-10-17 00:33:24 +02:00
bc09b5050d Correction sur application tokens acteurs 2025-10-17 00:32:42 +02:00
d68001b376 Fix token/actor 2025-10-02 22:53:09 +02:00
6b22dade9c Foundry v13 migration 2025-05-01 23:27:51 +02:00
965fc02eb3 Foundry v13 migration 2025-05-01 23:23:29 +02:00
0ef689bf1b Fix specialization again 2025-03-11 23:47:08 +01:00
c6dcc187d8 Fix babele 2025-03-11 22:29:24 +01:00
e2f24405af Fix waring about grid 2025-02-14 13:36:52 +01:00
0487893f47 Fix v12 issue + remove warnings 2024-04-27 09:33:22 +02:00
d7b7bccbdf Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:31:30 +02:00
dbf4b17afb Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:28:57 +02:00
51e5a409c4 Update v11/v12 et correction sur le niveau de jeu 2024-04-26 19:28:28 +02:00
1e4692e850 Ajout des traits dans le header + gestion plus simple des PNJs 2024-03-19 09:16:08 +01:00
40e12c1bba Ajout des traits dans le header + gestion plus simple des PNJs 2024-03-19 09:15:30 +01:00
75 changed files with 3372 additions and 2939 deletions

View File

@@ -1,3 +1,8 @@
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

View File

@@ -6,12 +6,12 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
/* -------------------------------------------- */
export class EcrymeActorSheet extends ActorSheet {
export class EcrymeActorSheet extends foundry.appv1.sheets.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.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 }),
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.description, { async: true }),
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.biodata.notes, { async: true }),
equipementlibre: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.equipmentfree, { async: true }),
options: this.options,
owner: this.document.isOwner,
editScore: this.options.editScore,
@@ -63,7 +63,7 @@ export class EcrymeActorSheet extends ActorSheet {
}
this.formData = formData;
console.log("PC : ", formData, this.object);
//console.log("PC : ", formData, this.object);
return formData;
}
@@ -75,10 +75,10 @@ export class EcrymeActorSheet extends ActorSheet {
// 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('.open-annency').click(ev => {
let actorId = $(ev.currentTarget).data("annency-id")
@@ -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);
});
@@ -102,14 +105,14 @@ export class EcrymeActorSheet extends ActorSheet {
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");
@@ -128,13 +131,13 @@ export class EcrymeActorSheet extends ActorSheet {
let categKey = $(event.currentTarget).data("category-key")
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")
@@ -148,36 +151,36 @@ export class EcrymeActorSheet extends ActorSheet {
const li = $(event.currentTarget).parents(".item")
let weaponId = li.data("item-id");
this.actor.rollWeaponConfront(weaponId)
});
});
html.find('.impact-modify').click((event) => {
let impactType = $(event.currentTarget).data("impact-type")
let impactLevel = $(event.currentTarget).data("impact-level")
let modifier = Number($(event.currentTarget).data("impact-modifier"))
this.actor.modifyImpact(impactType, impactLevel, modifier)
});
html.find('.roll-weapon').click((event) => {
const armeId = $(event.currentTarget).data("arme-id")
this.actor.rollArme(armeId)
});
html.find('.lock-unlock-sheet').click((event) => {
this.options.editScore = !this.options.editScore;
this.render(true);
});
});
html.find('.item-equip').click(ev => {
const li = $(ev.currentTarget).parents(".item");
this.actor.equipItem( li.data("item-id") );
this.render(true);
this.render(true);
});
html.find('.update-field').change(ev => {
const fieldName = $(ev.currentTarget).data("field-name");
let value = Number(ev.currentTarget.value);
this.actor.update( { [`${fieldName}`]: value } );
});
});
}
/* -------------------------------------------- */
/** @override */
setPosition(options = {}) {

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

@@ -6,12 +6,12 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
/* -------------------------------------------- */
export class EcrymeAnnencySheet extends ActorSheet {
export class EcrymeAnnencySheet extends foundry.appv1.sheets.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(),
@@ -75,7 +75,7 @@ export class EcrymeAnnencySheet extends ActorSheet {
let actorId = li.data("actor-id")
this.actor.removeAnnencyActor(actorId)
})
// Update Inventory Item
html.find('.item-edit').click(ev => {

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

@@ -36,7 +36,7 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static async init() {
Hooks.on('renderChatLog', (log, html, data) => EcrymeUtility.chatListeners(html));
Hooks.on("getChatLogEntryContext", (html, options) => EcrymeUtility.chatMenuManager(html, options));
Hooks.on("getChatMessageContextOptions", (html, options) => EcrymeUtility.chatMenuManager(html, options));
this.rollDataStore = {}
this.defenderStore = {}
@@ -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
})
@@ -119,14 +120,14 @@ export class EcrymeUtility {
let level = game.settings.get("fvtt-ecryme", "ecryme-game-level")
return level == "level_a"
}
/*-------------------------------------------- */
static buildSkillConfig() {
game.system.ecryme.config.skills = {}
for (let categKey in game.data.template.Actor.templates.core.skills) {
let category = game.data.template.Actor.templates.core.skills[categKey]
for (let skillKey in category.skilllist) {
let skill = 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
}
@@ -154,8 +155,8 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static getActorFromRollData(rollData) {
let actor = game.actors.get(rollData.actorId)
if (rollData.tokenId) {
let token = canvas.tokens.placeables.find(t => t.id == rollData.tokenId)
if (rollData.defenderTokenId) {
let token = canvas.tokens.placeables.find(t => t.id == rollData.defenderTokenId)
if (token) {
actor = token.actor
}
@@ -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, {
@@ -272,20 +273,17 @@ export class EcrymeUtility {
let canTranscendRoll = []
for (let i = 1; i <= 10; i++) {
canTranscendRoll[i] = function (li) {
let message = game.messages.get(li.attr("data-message-id"))
let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "rolldata")
//console.log(">>>>>>>>>>>>>>>>>>>>>>>>>> Menu !!!!", rollData)
if (rollData.skill && rollData.skill.value >= i && !rollData.transcendUsed && rollData.spec) {
return true
}
return false
return (rollData?.skill?.value >= i && !rollData.transcendUsed && rollData.spec)
}
options.push({
name: game.i18n.localize("ECRY.chat.spectranscend") + i,
icon: '<i class="fas fa-plus-square"></i>',
condition: canTranscendRoll[i],
callback: li => {
let message = game.messages.get(li.attr("data-message-id"))
let message = game.messages.get($(li).attr("data-message-id"))
let rollData = message.getFlag("world", "rolldata")
EcrymeUtility.transcendFromSpec(rollData, i).catch("Error on Transcend")
}
@@ -296,27 +294,35 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static async chatListeners(html) {
html.on("click", '.button-select-confront', event => {
$(html).on("click", '.button-select-confront', event => {
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"))
ui.notifications.info(game.i18n.localize("ECRY.chat.confrontselect"))
EcrymeUtility.manageConfrontation(rollData)
})
html.on("click", '.button-apply-cephaly-difficulty', event => {
$(html).on("click", '.button-apply-cephaly-difficulty', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "ecryme-rolldata")
let difficulty = $("#" + rollData.rollId + "-cephaly-difficulty").val()
EcrymeUtility.manageCephalyDifficulty(rollData, difficulty)
})
html.on("click", '.button-apply-impact', event => {
$(html).on("click", '.button-apply-impact', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
let tokenId = $(event.currentTarget).data("token-id")
let actor
if (!tokenId) {
actorId = $(event.currentTarget).data("actor-id")
actor = game.actors.get(actorId)
} else {
let token = canvas.tokens.placeables.find(t => t.id == tokenId)
actor = token?.actor
}
actor.modifyImpact($(event.currentTarget).data("impact-type"), $(event.currentTarget).data("impact"), 1)
})
html.on("click", '.button-apply-bonus', event => {
$(html).on("click", '.button-apply-bonus', event => {
let messageId = EcrymeUtility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let actor = game.actors.get($(event.currentTarget).data("actor-id"))
@@ -338,7 +344,7 @@ export class EcrymeUtility {
'systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs',
'systems/fvtt-ecryme/templates/actors/partial-impacts.hbs',
]
return loadTemplates(templatePaths);
return foundry.applications.handlebars.loadTemplates(templatePaths);
}
/* -------------------------------------------- */
@@ -404,7 +410,7 @@ 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
}
@@ -413,7 +419,7 @@ export class EcrymeUtility {
console.log("SOCKET MESSAGE", msg)
if (msg.name == "msg_gm_chat_message") {
let rollData = msg.data.rollData
if ( game.user.isGM ) {
if (game.user.isGM) {
let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", {
content: await renderTemplate(msg.data.template, rollData),
whisper: game.user.id
@@ -557,7 +563,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)
@@ -565,16 +571,16 @@ 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
this.computeResults(rollData)
let msg = await this.createChatWithRollMode(rollData.alias, {
content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-generic-result.hbs`, rollData)
})
await msg.setFlag("world", "ecryme-rolldata", rollData)
console.log("Rolldata result", rollData)
@@ -660,7 +666,7 @@ export class EcrymeUtility {
}
return array;
}
/* -------------------------------------------- */
static async createChatMessage(name, rollMode, chatOptions) {
switch (rollMode) {
@@ -682,20 +688,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
@@ -717,11 +723,11 @@ export class EcrymeUtility {
/* -------------------------------------------- */
static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id");
let msgTxt = "<p>Are you sure to remove this Item ?";
let msgTxt = "<p>Etes vous certain de souhaiter envoyer cet item dans les limbes ?";
let buttons = {
delete: {
icon: '<i class="fas fa-check"></i>',
label: "Yes, remove it",
label: "Oui, retirez-le",
callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false));
@@ -729,7 +735,7 @@ export class EcrymeUtility {
},
cancel: {
icon: '<i class="fas fa-times"></i>',
label: "Cancel"
label: "Annuler"
}
}
msgTxt += "</p>";

View File

@@ -6,13 +6,13 @@ 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
});
let html = await renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs', rollData);
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-dialog.hbs', rollData);
return new EcrymeConfrontDialog(actor, rollData, html, options);
}
@@ -72,7 +72,7 @@ export class EcrymeConfrontDialog extends Dialog {
$("#confront-dice-pool").html(content)
content = await renderTemplate("systems/fvtt-ecryme/templates/dialogs/partial-confront-bonus-area.hbs", this.rollData )
$("#confront-bonus-pool").html(content)
}
/* -------------------------------------------- */
async refreshDialog() {
@@ -83,7 +83,7 @@ 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) )
@@ -124,23 +124,23 @@ export class EcrymeConfrontDialog extends Dialog {
if ( data.dragType == "dice") {
let idx = Number(data.diceIndex)
console.log("DATA", data, event, event.srcElement.className)
if (event.srcElement.className.includes("execution") &&
if (event.srcElement.className.includes("execution") &&
this.rollData.availableDices.filter(d => d.location == "execution").length < 2) {
this.rollData.availableDices[idx].location = "execution"
}
if (event.srcElement.className.includes("preservation") &&
if (event.srcElement.className.includes("preservation") &&
this.rollData.availableDices.filter(d => d.location == "preservation").length < 2) {
this.rollData.availableDices[idx].location = "preservation"
}
if (event.srcElement.className.includes("dice-list")) {
this.rollData.availableDices[idx].location = "mainpool"
}
if (this.rollData.availableDices.filter(d => d.location == "execution").length == 2 && this.rollData.availableDices.filter(d => d.location == "preservation").length == 2) {
this.buttonDisabled = false
} else {
this.buttonDisabled = true
}
}
} else {
let idx = Number(data.bonusIndex)
if (event.srcElement.className.includes("execution")) {
@@ -163,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)
}
}
}
@@ -192,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
@@ -212,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()
}
@@ -234,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

@@ -1,13 +1,16 @@
import { EcrymeUtility } from "../common/ecryme-utility.js";
import {EcrymeConfrontDialog } from "./ecryme-confront-dialog.js";
import { EcrymeConfrontDialog } from "./ecryme-confront-dialog.js";
export class EcrymeConfrontStartDialog extends Dialog {
/* -------------------------------------------- */
static async create(actor, rollData) {
if (!actor) throw new Error("Ecryme | No actor provided for confront dialog");
if (!rollData) throw new Error("Ecryme | No roll data provided for confront dialog");
if (actor?.token) rollData.tokenId = actor.token.id;
let options = { classes: ["fvtt-ecryme ecryme-confront-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
let html = await renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-start-dialog.hbs', rollData);
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/confront-start-dialog.hbs', rollData);
return new EcrymeConfrontStartDialog(actor, rollData, html, options);
}
@@ -43,22 +46,22 @@ export class EcrymeConfrontStartDialog extends Dialog {
super(conf, options);
this.actor = actor;
this.actor = actor?.token?.actor || actor;
this.rollData = rollData;
}
/* -------------------------------------------- */
async rollConfront( diceFormula ) {
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)
if (!result.discarded) {
let resultDup = foundry.utils.duplicate(result)
resultDup.location = "mainpool"
rollData.availableDices.push(resultDup)
}

View File

@@ -6,7 +6,7 @@ export class EcrymeRollDialog extends Dialog {
static async create(actor, rollData) {
let options = { classes: ["ecryme-roll-dialog"], width: 540, height: 'fit-content', 'z-index': 99999 }
let html = await renderTemplate('systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs', rollData);
let html = await foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/dialogs/roll-dialog-generic.hbs', rollData);
return new EcrymeRollDialog(actor, rollData, html, options);
}
@@ -52,12 +52,12 @@ export class EcrymeRollDialog extends Dialog {
activateListeners(html) {
super.activateListeners(html);
var dialog = this;
function onLoad() {
}
$(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) => {
@@ -74,13 +74,13 @@ export class EcrymeRollDialog extends Dialog {
})
html.find('#roll-select-transcendence').change((event) => {
this.rollData.skillTranscendence = Number($('#roll-select-transcendence').val())
})
})
html.find('#roll-use-spleen').change((event) => {
this.rollData.useSpleen = event.currentTarget.checked
})
})
html.find('#roll-use-ideal').change((event) => {
this.rollData.useIdeal = event.currentTarget.checked
})
})
}
}

View File

@@ -5,6 +5,7 @@
*/
/* -------------------------------------------- */
const ECRYME_WELCOME_MESSAGE_URL = "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/welcome-message-ecryme.html"
/* -------------------------------------------- */
// Import Modules
@@ -38,7 +39,7 @@ Hooks.once("init", async function () {
EcrymeUtility.preloadHandlebarsTemplates();
/* -------------------------------------------- */
// Set an initiative formula for the system
// Set an initiative formula for the system
CONFIG.Combat.initiative = {
formula: "1d6",
decimals: 1
@@ -57,28 +58,40 @@ Hooks.once("init", async function () {
/* -------------------------------------------- */
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["pc"], makeDefault: true });
Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["npc"], makeDefault: true });
Actors.registerSheet("fvtt-ecryme", EcrymeAnnencySheet, { types: ["annency"], makeDefault: false });
foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet);
foundry.documents.collections.Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["pc"], makeDefault: true });
foundry.documents.collections.Actors.registerSheet("fvtt-ecryme", EcrymeActorSheet, { types: ["npc"], makeDefault: true });
foundry.documents.collections.Actors.registerSheet("fvtt-ecryme", EcrymeAnnencySheet, { types: ["annency"], makeDefault: false });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("fvtt-ecryme", EcrymeItemSheet, { makeDefault: true });
foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet);
foundry.documents.collections.Items.registerSheet("fvtt-ecryme", EcrymeItemSheet, { makeDefault: true });
EcrymeUtility.init()
Babele.get().setSystemTranslationsDir("translated")
});
/* -------------------------------------------- */
function welcomeMessage() {
if (game.user.isGM) {
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: `<div id="welcome-message-ecryme"><span class="rdd-roll-part">
<strong>Bienvenu dans Ecryme !</strong>` });
// Try to fetch the welcome message from the github repo "welcome-message-ecryme.html"
fetch(ECRYME_WELCOME_MESSAGE_URL)
.then(response => response.text())
.then(html => {
//console.log("Fetched welcome message:", html);
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: html
});
})
.catch(error => {
console.error("Error fetching welcome message:", error);
ChatMessage.create({
user: game.user.id,
whisper: [game.user.id],
content: "<b>Bienvenue dans Ecryme RPG !</b><br>Visitez le site officiel pour plus d'informations."
});
});
}
}
@@ -91,6 +104,7 @@ async function importDefaultScene() {
await game.scenes.documentClass.create(newDocuments);
game.scenes.find(i => i.name == "Landing page 1").activate();
}
}
/* -------------------------------------------- */
@@ -107,10 +121,10 @@ Hooks.once("ready", function () {
});
}
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter=>{
import("https://www.uberwald.me/fvtt_appcount/count-class-ready.js").then(moduleCounter => {
console.log("ClassCounter loaded", moduleCounter)
moduleCounter.ClassCounter.registerUsageCount()
}).catch(err=>
}).catch(err =>
console.log("No stats available, giving up.")
)
@@ -121,6 +135,11 @@ Hooks.once("ready", function () {
})
/* -------------------------------------------- */
Hooks.once('babele.init', (babele) => {
babele.setSystemTranslationsDir("translated");
});
/* -------------------------------------------- */
/* Foundry VTT Initialization */
@@ -135,4 +154,3 @@ Hooks.on("chatMessage", (html, content, msg) => {
}
return true;
});

View File

@@ -4,11 +4,11 @@ import { EcrymeUtility } from "../common/ecryme-utility.js";
* Extend the basic ItemSheet with some very simple modifications
* @extends {ItemSheet}
*/
export class EcrymeItemSheet extends ItemSheet {
export class EcrymeItemSheet extends foundry.appv1.sheets.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,20 +56,20 @@ 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,
description: await TextEditor.enrichHTML(this.object.system.description, { async: true }),
notes: await TextEditor.enrichHTML(this.object.system.notes, { async: true }),
description: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.description, { async: true }),
notes: await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.object.system.notes, { async: true }),
isGM: game.user.isGM
}
if ( this.object.type == "archetype") {
formData.tarots = EcrymeUtility.getTarots()
}
this.options.editable = !(this.object.origin == "embeddedItem");
console.log("ITEM DATA", formData, this);
return formData;
@@ -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 };
}
@@ -115,7 +115,7 @@ export class EcrymeItemSheet extends ItemSheet {
let levelIndex = Number($(ev.currentTarget).parents(".item").data("level-index"))
let choiceIndex = Number($(ev.currentTarget).parents(".item").data("choice-index"))
let featureId = $(ev.currentTarget).parents(".item").data("feature-id")
let itemData = this.object.system.levels[levelIndex].choices[choiceIndex].features[featureId]
if (itemData.name != 'None') {

Binary file not shown.

BIN
packs/equipment/000192.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000134
MANIFEST-000257

View File

@@ -1,7 +1,7 @@
2024/03/18-21:27:36.619259 7fb017e006c0 Recovering log #132
2024/03/18-21:27:36.630215 7fb017e006c0 Delete type=3 #130
2024/03/18-21:27:36.630317 7fb017e006c0 Delete type=0 #132
2024/03/18-21:44:13.762166 7fb015a006c0 Level-0 table #137: started
2024/03/18-21:44:13.762215 7fb015a006c0 Level-0 table #137: 0 bytes OK
2024/03/18-21:44:13.768765 7fb015a006c0 Delete type=0 #135
2024/03/18-21:44:13.775818 7fb015a006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.783329 7f1e223fe6c0 Recovering log #255
2026/02/17-22:52:51.793345 7f1e223fe6c0 Delete type=3 #253
2026/02/17-22:52:51.793403 7f1e223fe6c0 Delete type=0 #255
2026/02/18-00:07:51.604423 7f1e20bfb6c0 Level-0 table #260: started
2026/02/18-00:07:51.604449 7f1e20bfb6c0 Level-0 table #260: 0 bytes OK
2026/02/18-00:07:51.610566 7f1e20bfb6c0 Delete type=0 #258
2026/02/18-00:07:51.628854 7f1e20bfb6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2024/03/15-16:29:29.461394 7f7df20006c0 Recovering log #128
2024/03/15-16:29:29.471348 7f7df20006c0 Delete type=3 #126
2024/03/15-16:29:29.471493 7f7df20006c0 Delete type=0 #128
2024/03/15-16:35:28.397309 7f7debe006c0 Level-0 table #133: started
2024/03/15-16:35:28.397348 7f7debe006c0 Level-0 table #133: 0 bytes OK
2024/03/15-16:35:28.403860 7f7debe006c0 Delete type=0 #131
2024/03/15-16:35:28.411176 7f7debe006c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.354370 7f1e213fc6c0 Recovering log #251
2026/02/17-22:32:54.365341 7f1e213fc6c0 Delete type=3 #249
2026/02/17-22:32:54.365467 7f1e213fc6c0 Delete type=0 #251
2026/02/17-22:51:18.237998 7f1e20bfb6c0 Level-0 table #256: started
2026/02/17-22:51:18.238020 7f1e20bfb6c0 Level-0 table #256: 0 bytes OK
2026/02/17-22:51:18.244001 7f1e20bfb6c0 Delete type=0 #254
2026/02/17-22:51:18.250338 7f1e20bfb6c0 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/000129.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000070
MANIFEST-000194

View File

@@ -1,15 +1,8 @@
2024/03/18-21:27:36.675619 7fb0174006c0 Recovering log #68
2024/03/18-21:27:36.685388 7fb0174006c0 Delete type=3 #66
2024/03/18-21:27:36.685495 7fb0174006c0 Delete type=0 #68
2024/03/18-21:44:13.790087 7fb015a006c0 Level-0 table #73: started
2024/03/18-21:44:13.801144 7fb015a006c0 Level-0 table #73: 2207 bytes OK
2024/03/18-21:44:13.808000 7fb015a006c0 Delete type=0 #71
2024/03/18-21:44:13.808225 7fb015a006c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/03/18-21:44:13.808250 7fb015a006c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 10 : 1
2024/03/18-21:44:13.808256 7fb015a006c0 Compacting 1@1 + 1@2 files
2024/03/18-21:44:13.811516 7fb015a006c0 Generated table #74@1: 4 keys, 2136 bytes
2024/03/18-21:44:13.811547 7fb015a006c0 Compacted 1@1 + 1@2 files => 2136 bytes
2024/03/18-21:44:13.817935 7fb015a006c0 compacted to: files[ 0 0 1 0 0 0 0 ]
2024/03/18-21:44:13.818041 7fb015a006c0 Delete type=2 #5
2024/03/18-21:44:13.818166 7fb015a006c0 Delete type=2 #73
2024/03/18-21:44:13.818271 7fb015a006c0 Manual compaction at level-1 from '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 10 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.836522 7f1e213fc6c0 Recovering log #192
2026/02/17-22:52:51.846119 7f1e213fc6c0 Delete type=3 #190
2026/02/17-22:52:51.846206 7f1e213fc6c0 Delete type=0 #192
2026/02/18-00:07:51.788872 7f1e20bfb6c0 Level-0 table #197: started
2026/02/18-00:07:51.788909 7f1e20bfb6c0 Level-0 table #197: 0 bytes OK
2026/02/18-00:07:51.795266 7f1e20bfb6c0 Delete type=0 #195
2026/02/18-00:07:51.802266 7f1e20bfb6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2026/02/18-00:07:51.802303 7f1e20bfb6c0 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 @@
2024/03/15-16:29:29.511445 7f7df34006c0 Recovering log #64
2024/03/15-16:29:29.522076 7f7df34006c0 Delete type=3 #62
2024/03/15-16:29:29.522169 7f7df34006c0 Delete type=0 #64
2024/03/15-16:35:28.411192 7f7debe006c0 Level-0 table #69: started
2024/03/15-16:35:28.411232 7f7debe006c0 Level-0 table #69: 0 bytes OK
2024/03/15-16:35:28.417476 7f7debe006c0 Delete type=0 #67
2024/03/15-16:35:28.424950 7f7debe006c0 Manual compaction at level-0 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2024/03/15-16:35:28.424986 7f7debe006c0 Manual compaction at level-1 from '!journal!N3XOO6dRLuKwQfp2' @ 72057594037927935 : 1 .. '!journal.pages!N3XOO6dRLuKwQfp2.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.423305 7f1e21bfd6c0 Recovering log #188
2026/02/17-22:32:54.435381 7f1e21bfd6c0 Delete type=3 #186
2026/02/17-22:32:54.435516 7f1e21bfd6c0 Delete type=0 #188
2026/02/17-22:51:18.269462 7f1e20bfb6c0 Level-0 table #193: started
2026/02/17-22:51:18.269511 7f1e20bfb6c0 Level-0 table #193: 0 bytes OK
2026/02/17-22:51:18.276022 7f1e20bfb6c0 Delete type=0 #191
2026/02/17-22:51:18.276202 7f1e20bfb6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end)
2026/02/17-22:51:18.276226 7f1e20bfb6c0 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-000194 Normal file

Binary file not shown.

Binary file not shown.

BIN
packs/maneuvers/000192.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000134
MANIFEST-000257

View File

@@ -1,7 +1,7 @@
2024/03/18-21:27:36.662299 7fb017e006c0 Recovering log #132
2024/03/18-21:27:36.672660 7fb017e006c0 Delete type=3 #130
2024/03/18-21:27:36.672727 7fb017e006c0 Delete type=0 #132
2024/03/18-21:44:13.783262 7fb015a006c0 Level-0 table #137: started
2024/03/18-21:44:13.783332 7fb015a006c0 Level-0 table #137: 0 bytes OK
2024/03/18-21:44:13.789886 7fb015a006c0 Delete type=0 #135
2024/03/18-21:44:13.808213 7fb015a006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.822834 7f1e213fc6c0 Recovering log #255
2026/02/17-22:52:51.833307 7f1e213fc6c0 Delete type=3 #253
2026/02/17-22:52:51.833365 7f1e213fc6c0 Delete type=0 #255
2026/02/18-00:07:51.795405 7f1e20bfb6c0 Level-0 table #260: started
2026/02/18-00:07:51.795433 7f1e20bfb6c0 Level-0 table #260: 0 bytes OK
2026/02/18-00:07:51.802173 7f1e20bfb6c0 Delete type=0 #258
2026/02/18-00:07:51.802295 7f1e20bfb6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2024/03/15-16:29:29.499552 7f7df20006c0 Recovering log #128
2024/03/15-16:29:29.509238 7f7df20006c0 Delete type=3 #126
2024/03/15-16:29:29.509293 7f7df20006c0 Delete type=0 #128
2024/03/15-16:35:28.417564 7f7debe006c0 Level-0 table #133: started
2024/03/15-16:35:28.417584 7f7debe006c0 Level-0 table #133: 0 bytes OK
2024/03/15-16:35:28.424846 7f7debe006c0 Delete type=0 #131
2024/03/15-16:35:28.424970 7f7debe006c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.407677 7f1e223fe6c0 Recovering log #251
2026/02/17-22:32:54.418634 7f1e223fe6c0 Delete type=3 #249
2026/02/17-22:32:54.418777 7f1e223fe6c0 Delete type=0 #251
2026/02/17-22:51:18.232103 7f1e20bfb6c0 Level-0 table #256: started
2026/02/17-22:51:18.232142 7f1e20bfb6c0 Level-0 table #256: 0 bytes OK
2026/02/17-22:51:18.237935 7f1e20bfb6c0 Delete type=0 #254
2026/02/17-22:51:18.250322 7f1e20bfb6c0 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.

Binary file not shown.

BIN
packs/scenes/000090.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000018
MANIFEST-000143

View File

@@ -1,8 +1,8 @@
2024/03/18-21:27:36.648797 7fb017e006c0 Recovering log #16
2024/03/18-21:27:36.658451 7fb017e006c0 Delete type=3 #14
2024/03/18-21:27:36.658875 7fb017e006c0 Delete type=0 #16
2024/03/18-21:44:13.775844 7fb015a006c0 Level-0 table #21: started
2024/03/18-21:44:13.775912 7fb015a006c0 Level-0 table #21: 0 bytes OK
2024/03/18-21:44:13.782966 7fb015a006c0 Delete type=0 #19
2024/03/18-21:44:13.808193 7fb015a006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2024/03/18-21:44:13.808235 7fb015a006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.809397 7f1e22bff6c0 Recovering log #141
2026/02/17-22:52:51.819324 7f1e22bff6c0 Delete type=3 #139
2026/02/17-22:52:51.819396 7f1e22bff6c0 Delete type=0 #141
2026/02/18-00:07:51.772211 7f1e20bfb6c0 Level-0 table #146: started
2026/02/18-00:07:51.772244 7f1e20bfb6c0 Level-0 table #146: 0 bytes OK
2026/02/18-00:07:51.778644 7f1e20bfb6c0 Delete type=0 #144
2026/02/18-00:07:51.788854 7f1e20bfb6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes!zvY1RwBhTfwdZIBa' @ 0 : 0; will stop at (end)
2026/02/18-00:07:51.795394 7f1e20bfb6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes!zvY1RwBhTfwdZIBa' @ 0 : 0; will stop at (end)

View File

@@ -1,8 +1,8 @@
2024/03/15-16:29:29.486982 7f7df20006c0 Recovering log #12
2024/03/15-16:29:29.496623 7f7df20006c0 Delete type=3 #10
2024/03/15-16:29:29.496680 7f7df20006c0 Delete type=0 #12
2024/03/15-16:35:28.404055 7f7debe006c0 Level-0 table #17: started
2024/03/15-16:35:28.404098 7f7debe006c0 Level-0 table #17: 0 bytes OK
2024/03/15-16:35:28.410985 7f7debe006c0 Delete type=0 #15
2024/03/15-16:35:28.417555 7f7debe006c0 Manual compaction at level-0 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2024/03/15-16:35:28.424962 7f7debe006c0 Manual compaction at level-1 from '!scenes!YYBr138LR7ntGFdo' @ 72057594037927935 : 1 .. '!scenes!wJJTdzEVyJpkUXaM' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.389501 7f1e21bfd6c0 Recovering log #137
2026/02/17-22:32:54.400905 7f1e21bfd6c0 Delete type=3 #135
2026/02/17-22:32:54.401049 7f1e21bfd6c0 Delete type=0 #137
2026/02/17-22:51:18.250480 7f1e20bfb6c0 Level-0 table #142: started
2026/02/17-22:51:18.250515 7f1e20bfb6c0 Level-0 table #142: 0 bytes OK
2026/02/17-22:51:18.256672 7f1e20bfb6c0 Delete type=0 #140
2026/02/17-22:51:18.276163 7f1e20bfb6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes!zvY1RwBhTfwdZIBa' @ 0 : 0; will stop at (end)
2026/02/17-22:51:18.276211 7f1e20bfb6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes!zvY1RwBhTfwdZIBa' @ 0 : 0; will stop at (end)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000134
MANIFEST-000257

View File

@@ -1,7 +1,7 @@
2024/03/18-21:27:36.605584 7fb0174006c0 Recovering log #132
2024/03/18-21:27:36.615261 7fb0174006c0 Delete type=3 #130
2024/03/18-21:27:36.615507 7fb0174006c0 Delete type=0 #132
2024/03/18-21:44:13.755365 7fb015a006c0 Level-0 table #137: started
2024/03/18-21:44:13.755406 7fb015a006c0 Level-0 table #137: 0 bytes OK
2024/03/18-21:44:13.761940 7fb015a006c0 Delete type=0 #135
2024/03/18-21:44:13.775775 7fb015a006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.771179 7f1e22bff6c0 Recovering log #255
2026/02/17-22:52:51.780607 7f1e22bff6c0 Delete type=3 #253
2026/02/17-22:52:51.780660 7f1e22bff6c0 Delete type=0 #255
2026/02/18-00:07:51.597957 7f1e20bfb6c0 Level-0 table #260: started
2026/02/18-00:07:51.597996 7f1e20bfb6c0 Level-0 table #260: 0 bytes OK
2026/02/18-00:07:51.604332 7f1e20bfb6c0 Delete type=0 #258
2026/02/18-00:07:51.628842 7f1e20bfb6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2024/03/15-16:29:29.447153 7f7df34006c0 Recovering log #128
2024/03/15-16:29:29.458144 7f7df34006c0 Delete type=3 #126
2024/03/15-16:29:29.458197 7f7df34006c0 Delete type=0 #128
2024/03/15-16:35:28.383414 7f7debe006c0 Level-0 table #133: started
2024/03/15-16:35:28.383464 7f7debe006c0 Level-0 table #133: 0 bytes OK
2024/03/15-16:35:28.390768 7f7debe006c0 Delete type=0 #131
2024/03/15-16:35:28.404037 7f7debe006c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.337335 7f1e21bfd6c0 Recovering log #251
2026/02/17-22:32:54.348929 7f1e21bfd6c0 Delete type=3 #249
2026/02/17-22:32:54.349060 7f1e21bfd6c0 Delete type=0 #251
2026/02/17-22:51:18.224981 7f1e20bfb6c0 Level-0 table #256: started
2026/02/17-22:51:18.225046 7f1e20bfb6c0 Level-0 table #256: 0 bytes OK
2026/02/17-22:51:18.231994 7f1e20bfb6c0 Delete type=0 #254
2026/02/17-22:51:18.250311 7f1e20bfb6c0 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/000192.ldb Normal file

Binary file not shown.

View File

@@ -1 +1 @@
MANIFEST-000134
MANIFEST-000257

View File

@@ -1,7 +1,7 @@
2024/03/18-21:27:36.634738 7fb0174006c0 Recovering log #132
2024/03/18-21:27:36.644980 7fb0174006c0 Delete type=3 #130
2024/03/18-21:27:36.645138 7fb0174006c0 Delete type=0 #132
2024/03/18-21:44:13.768924 7fb015a006c0 Level-0 table #137: started
2024/03/18-21:44:13.768963 7fb015a006c0 Level-0 table #137: 0 bytes OK
2024/03/18-21:44:13.775416 7fb015a006c0 Delete type=0 #135
2024/03/18-21:44:13.783223 7fb015a006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
2026/02/17-22:52:51.796322 7f1e213fc6c0 Recovering log #255
2026/02/17-22:52:51.806414 7f1e213fc6c0 Delete type=3 #253
2026/02/17-22:52:51.806525 7f1e213fc6c0 Delete type=0 #255
2026/02/18-00:07:51.654710 7f1e20bfb6c0 Level-0 table #260: started
2026/02/18-00:07:51.654742 7f1e20bfb6c0 Level-0 table #260: 0 bytes OK
2026/02/18-00:07:51.660623 7f1e20bfb6c0 Delete type=0 #258
2026/02/18-00:07:51.660919 7f1e20bfb6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)

View File

@@ -1,7 +1,7 @@
2024/03/15-16:29:29.474381 7f7df34006c0 Recovering log #128
2024/03/15-16:29:29.484271 7f7df34006c0 Delete type=3 #126
2024/03/15-16:29:29.484356 7f7df34006c0 Delete type=0 #128
2024/03/15-16:35:28.390972 7f7debe006c0 Level-0 table #133: started
2024/03/15-16:35:28.391026 7f7debe006c0 Level-0 table #133: 0 bytes OK
2024/03/15-16:35:28.397167 7f7debe006c0 Delete type=0 #131
2024/03/15-16:35:28.411153 7f7debe006c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end)
2026/02/17-22:32:54.371182 7f1e223fe6c0 Recovering log #251
2026/02/17-22:32:54.383451 7f1e223fe6c0 Delete type=3 #249
2026/02/17-22:32:54.383616 7f1e223fe6c0 Delete type=0 #251
2026/02/17-22:51:18.244080 7f1e20bfb6c0 Level-0 table #256: started
2026/02/17-22:51:18.244107 7f1e20bfb6c0 Level-0 table #256: 0 bytes OK
2026/02/17-22:51:18.250200 7f1e20bfb6c0 Delete type=0 #254
2026/02/17-22:51:18.250352 7f1e20bfb6c0 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.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -3,8 +3,10 @@
"esmodules": [
"modules/ecryme-main.js"
],
"gridDistance": 1,
"gridUnits": "m",
"grid": {
"distance": 2,
"units": "m"
},
"languages": [
{
"lang": "fr",
@@ -102,8 +104,8 @@
"license": "LICENSE.txt",
"manifest": "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/system.json",
"compatibility": {
"minimum": "10",
"verified": "11"
"minimum": "13",
"verified": "13"
},
"id": "fvtt-ecryme",
"primaryTokenAttribute": "secondary.health",
@@ -123,7 +125,7 @@
},
"title": "Ecryme, le Jeu de Rôles",
"url": "https://www.uberwald.me/gitea/public/fvtt-ecryme",
"version": "11.0.38",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v11.0.38.zip",
"version": "13.0.4",
"download": "https://www.uberwald.me/gitea/public/fvtt-ecryme/archive/fvtt-ecryme-v13.0.4.zip",
"background": "systems/fvtt-ecryme/images/assets/ecryme_extract_panel_01.webp"
}

View File

@@ -28,28 +28,34 @@
"skills": {
"physical": {
"name": "ECRY.ui.physical",
"pnjvalue": 0,
"skilllist": {
"athletics": {
"key": "athletics",
"name": "ECRY.ui.athletics",
"max": 0,
"value": 0
},
"driving": {
"key": "driving",
"name": "ECRY.ui.driving",
"max": 0,
"value": 0
},
"fencing": {
"key": "fencing",
"name": "ECRY.ui.fencing",
"max": 0,
"value": 0
},
"brawling": {
"key": "brawling",
"name": "ECRY.ui.brawling",
"max": 0,
"value": 0
},
"shooting": {
"key": "shooting",
"name": "ECRY.ui.shooting",
"max": 0,
"value": 0
@@ -58,28 +64,34 @@
},
"mental": {
"name": "ECRY.ui.mental",
"pnjvalue": 0,
"skilllist": {
"anthropomecanology": {
"key": "anthropomecanology",
"name": "ECRY.ui.anthropomecanology",
"value": 0,
"max": 10
},
"ecrymology": {
"key": "ecrymology",
"name": "ECRY.ui.ecrymology",
"value": 0,
"max": 10
},
"traumatology": {
"key": "traumatology",
"name": "ECRY.ui.traumatology",
"value": 0,
"max": 10
},
"traversology": {
"key": "traversology",
"name": "ECRY.ui.traversology",
"value": 0,
"max": 10
},
"urbatechnology": {
"key": "urbatechnology",
"name": "ECRY.ui.urbatechnology",
"value": 0,
"max": 10
@@ -88,28 +100,34 @@
},
"social": {
"name": "ECRY.ui.social",
"pnjvalue": 0,
"skilllist": {
"quibbling": {
"key": "quibbling",
"name": "ECRY.ui.quibbling",
"value": 0,
"max": 10
},
"creativity": {
"key": "creativity",
"name": "ECRY.ui.creativity",
"value": 0,
"max": 10
},
"loquacity": {
"key": "loquacity",
"name": "ECRY.ui.loquacity",
"value": 0,
"max": 10
},
"guile": {
"key": "guile",
"name": "ECRY.ui.guile",
"value": 0,
"max": 10
},
"performance": {
"key": "performance",
"name": "ECRY.ui.performance",
"value": 0,
"max": 10

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

@@ -15,7 +15,7 @@
<div>
<ul>
<li>Confrontation : {{rollData1.alias}} vs {{rollData2.alias}}</li>
<li><strong>Confrontation</strong> : {{rollData1.alias}} vs {{rollData2.alias}}</li>
<li>{{localize rollData1.skill.name}} ({{rollData1.skill.value}}) vs {{localize rollData2.skill.name}} ({{rollData2.skill.value}}) </li>
<li>{{rollData1.executionTotal}} vs {{rollData2.preservationTotal}} : {{marginExecution}}</li>
<li>{{rollData1.preservationTotal}} vs {{rollData2.executionTotal}} : {{marginPreservation}}</li>
@@ -32,21 +32,21 @@
<li>{{localize "ECRY.ui.effect"}} {{localize "ECRY.ui.execution"}} : {{effectExecution}}</li>
{{#if impactExecution}}
<li>Impact {{rollData2.alias}} : 1 {{localize (concat "ECRY.ui." impactExecution)}}</li>
<button class="button-apply-impact" data-actor-id="{{rollData2.actorId}}" data-impact-type={{rollData1.skill.categKey}} data-impact="{{impactExecution}}">{{localize "ECRY.ui.applyimpact"}}</button>
<button class="button-apply-impact" data-token-id="{{rollData2.tokenId}}" data-actor-id="{{rollData2.actorId}}" data-impact-type={{rollData1.skill.categKey}} data-impact="{{impactExecution}}">{{localize "ECRY.ui.applyimpact"}}</button>
{{/if}}
{{#if bonus2}}
<li>Bonus {{rollData2.alias}} : {{bonus2}}</li>
<button class="button-apply-bonus" data-actor-id="{{rollData2.actorId}}" data-bonus="{{bonus2}}">{{localize "ECRY.ui.applybonus"}}</button>
<button class="button-apply-bonus" data-token-id="{{rollData2.tokenId}}" data-actor-id="{{rollData2.actorId}}" data-bonus="{{bonus2}}">{{localize "ECRY.ui.applybonus"}}</button>
{{/if}}
<li>{{localize "ECRY.ui.effect"}} {{localize "ECRY.ui.preservation"}} : {{effectPreservation}}</li>
{{#if impactPreservation}}
<li>Impact {{rollData1.alias}} : 1 {{localize (concat "ECRY.ui." impactPreservation)}}</li>
<button class="button-apply-impact" data-actor-id="{{rollData1.actorId}}" data-impact-type={{rollData1.skill.categKey}} data-impact="{{impactPreservation}}">{{localize "ECRY.ui.applyimpact"}}</button>
<button class="button-apply-impact" data-token-id="{{rollData1.tokenId}}" data-actor-id="{{rollData1.actorId}}" data-impact-type={{rollData1.skill.categKey}} data-impact="{{impactPreservation}}">{{localize "ECRY.ui.applyimpact"}}</button>
{{/if}}
{{#if bonus1}}
<li>Bonus {{rollData1.alias}} : {{bonus1}}</li>
<button class="button-apply-bonus" data-actor-id="{{rollData1.actorId}}" data-bonus="{{bonus1}}">{{localize "ECRY.ui.applybonus"}}</button>
<button class="button-apply-bonus" data-token-id="{{rollData1.tokenId}}" data-actor-id="{{rollData1.actorId}}" data-bonus="{{bonus1}}">{{localize "ECRY.ui.applybonus"}}</button>
{{/if}}
</ul>
</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

@@ -0,0 +1,42 @@
<h3 class="welcome-message-h3">Bonjour à tous !</h3>
<div class="message-chat-center">
👋 Juste un petit message pour vous informer que :
<br />
<strong
>⚠️ Le nouveau financement participatif pour la prochaine extension
d'Écryme, LES SECRETS DE L'ÉCRYME ouvre le 21 octobre !</strong
>
</div>
<div class="message-chat-center">
⚠️ Suivez la page de pré-lancement ici pour être sûr de ne pas manquer le
lancement : <br /><a href="https://shorturl.at/qDjg7"
>https://shorturl.at/qDjg7</a
>
</div>
<div class="message-chat-center">
Nous avons aussi un nouveau Discord pour ceux ou celles qui souhaiteraient
participer plus activement à la communauté des jeux d'Open Sesame Games, avec
un espace dédié aux écrymiens ! <br />
Nouveaux joueurs comme vétérans sont les bienvenus, n'hésitez pas à passer
pour papoter, profiter de nos ressources, ou suivre les nouvelles d'OSG plus
directement. Cliquez ici :<br />
<a href="https://discord.gg/dUPhNfJdaD">https://discord.gg/dUPhNfJdaD</a
><br />
</div>
<div class="message-chat-center">
Ce système vous est proposé par Open Sesame Games.<br />
Vous trouverez de l'aide dans
@UUID[Compendium.fvtt-ecryme.help.JournalEntry.wooTFYjEwh83FwgT]{Aide pour
Ecryme}<br />
ainsi que sur le Discord de Foundry FR :<br>
<a href="https://discord.gg/pPSDNJk">https://discord.gg/pPSDNJk</a>
</div>
</div>
Merci pour votre attention et à très bientôt pour la suite ! L'équipe Open
Sesame Games
</div>