diff --git a/lang/en.json b/lang/en.json index 138714c..8df1511 100644 --- a/lang/en.json +++ b/lang/en.json @@ -73,6 +73,10 @@ "notes": "Notes", "bio": "Bio", "bionotes": "Bio&Notes", + "resetTranscendence": "Reset transcendence", + "transcendenceCurrent": "Current value", + "transcendenceMax": "Max value", + "toggleEditMax": "Edit max level", "skills": "Skills", "traits": "Traits", "equipment": "Equipment", diff --git a/lang/fr.json b/lang/fr.json index 42bb36d..63e9e0d 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -74,6 +74,10 @@ "notes": "Notes", "bio": "Bio", "bionotes": "Bio&Notes", + "resetTranscendence": "Réinitialiser la transcendance", + "transcendenceCurrent": "Valeur actuelle", + "transcendenceMax": "Valeur max", + "toggleEditMax": "Modifier le niveau max", "skills": "Compétences", "traits": "Traits", "equipment": "Equipement", diff --git a/modules/actors/ecryme-actor-sheet.js b/modules/actors/ecryme-actor-sheet.js index 4942053..12d5e3e 100644 --- a/modules/actors/ecryme-actor-sheet.js +++ b/modules/actors/ecryme-actor-sheet.js @@ -11,15 +11,16 @@ export class EcrymeActorSheet extends foundry.appv1.sheets.ActorSheet { /** @override */ static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { + return { + ...super.defaultOptions, classes: ["fvtt-ecryme", "sheet", "actor"], template: "systems/fvtt-ecryme/templates/actors/actor-sheet.hbs", width: 860, height:680, tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "skills" }], dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], - editScore: true - }); + editScore: false + }; } /* -------------------------------------------- */ @@ -33,7 +34,7 @@ export class EcrymeActorSheet extends foundry.appv1.sheets.ActorSheet { name: this.actor.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", - system: foundry.utils.duplicate(this.object.system), + system: foundry.utils.deepClone(this.object.system), limited: this.object.limited, skills: this.actor.prepareSkills(), traits: this.actor.getRollTraits(), @@ -41,17 +42,17 @@ export class EcrymeActorSheet extends foundry.appv1.sheets.ActorSheet { ideal: this.actor.getIdeal(), spleen: this.actor.getSpleen(), impacts: this.object.getImpacts(), - config: foundry.utils.duplicate(game.system.ecryme.config), + config: foundry.utils.deepClone(game.ecryme.config), weapons: this.actor.getWeapons(), maneuvers: this.actor.getManeuvers(), impactsMalus: this.actor.getImpactsMalus(), - archetype: foundry.utils.duplicate(this.actor.getArchetype()), + archetype: foundry.utils.deepClone(this.actor.getArchetype()), equipments: this.actor.getEquipments(), hasCephaly: EcrymeUtility.hasCephaly(), hasBoheme: EcrymeUtility.hasBoheme(), hasAmertume: EcrymeUtility.hasAmertume(), cephalySkills: this.actor.getCephalySkills(), - subActors: foundry.utils.duplicate(this.actor.getSubActors()), + subActors: foundry.utils.deepClone(this.actor.getSubActors()), annency: this.actor.getAnnency(), 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 }), @@ -162,7 +163,7 @@ export class EcrymeActorSheet extends foundry.appv1.sheets.ActorSheet { html.find('.roll-weapon').click((event) => { const armeId = $(event.currentTarget).data("arme-id") - this.actor.rollArme(armeId) + this.actor.rollWeapon(armeId) }); html.find('.lock-unlock-sheet').click((event) => { @@ -179,6 +180,10 @@ export class EcrymeActorSheet extends foundry.appv1.sheets.ActorSheet { let value = Number(ev.currentTarget.value); this.actor.update( { [`${fieldName}`]: value } ); }); + html.find('.reset-transcendence').click(async (ev) => { + await this.actor.resetSkillPool(); + this.render(true); + }); } /* -------------------------------------------- */ diff --git a/modules/actors/ecryme-actor.js b/modules/actors/ecryme-actor.js index 4db6b0d..09a78a3 100644 --- a/modules/actors/ecryme-actor.js +++ b/modules/actors/ecryme-actor.js @@ -29,9 +29,9 @@ export class EcrymeActor extends Actor { if (data instanceof Array) { return super.create(data, options); } - // If the created actor has items (only applicable to foundry.utils.duplicated actors) bypass the new actor creation logic + // If the created actor has items bypass the new actor creation logic if (data.items) { - let actor = super.create(data, options); + let actor = await super.create(data, options); return actor; } @@ -49,9 +49,9 @@ export class EcrymeActor extends Actor { } /* -------------------------------------------- */ - _preUpdate(changed, options, user) { + async _preUpdate(changed, options, user) { - super._preUpdate(changed, options, user); + await super._preUpdate(changed, options, user); } /* -------------------------------------------- */ @@ -73,7 +73,7 @@ export class EcrymeActor extends Actor { return comp; } getArchetype() { - let comp = foundry.utils.duplicate(this.items.find(item => item.type == 'archetype') || { name: "Pas d'archetype" }) + let comp = foundry.utils.deepClone(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 = foundry.utils.duplicate(this.system.base.characters) + let members = foundry.utils.deepClone(this.system.base.characters) members.push(actorId) this.update({ 'system.base.characters': members }) } @@ -123,7 +123,7 @@ export class EcrymeActor extends Actor { /* -------------------------------------------- */ getTrait(id) { //console.log("TRAITS", this.items, this.items.filter(it => it.type == "trait") ) - return this.items.find(it => it.type == "trait" && it._id == id) + return this.items.find(it => it.type == "trait" && it.id === id) } /* -------------------------------------------- */ getSpecialization(id) { @@ -136,7 +136,7 @@ export class EcrymeActor extends Actor { } /* -------------------------------------------- */ prepareSkills() { - let skills = foundry.utils.duplicate(this.system.skills) + let skills = foundry.utils.deepClone(this.system.skills) for (let categKey in skills) { let category = skills[categKey] for (let skillKey in category.skilllist) { @@ -148,22 +148,22 @@ export class EcrymeActor extends Actor { } /* -------------------------------------------- */ getCephalySkills() { - let skills = foundry.utils.duplicate(this.system.cephaly.skilllist) + let skills = foundry.utils.deepClone(this.system.cephaly.skilllist) return skills } /* -------------------------------------------- */ getImpacts() { - let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'impact') || []) + let comp = foundry.utils.deepClone(this.items.filter(item => item.type == 'impact') || []) return comp; } /* -------------------------------------------- */ getWeapons() { - let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'weapon') || []) + let comp = foundry.utils.deepClone(this.items.filter(item => item.type == 'weapon') || []) EcrymeUtility.sortArrayObjectsByName(comp) return comp; } getManeuvers() { - let comp = foundry.utils.duplicate(this.items.filter(item => item.type == 'maneuver') || []) + let comp = foundry.utils.deepClone(this.items.filter(item => item.type == 'maneuver') || []) EcrymeUtility.sortArrayObjectsByName(comp) return comp; } @@ -171,7 +171,7 @@ export class EcrymeActor extends Actor { getItemById(id) { let item = this.items.find(item => item.id == id); if (item) { - item = foundry.utils.duplicate(item) + item = foundry.utils.deepClone(item) } return item; } @@ -206,13 +206,13 @@ export class EcrymeActor extends Actor { /* ------------------------------------------- */ async buildContainerTree() { - let equipments = foundry.utils.duplicate(this.items.filter(item => item.type == "equipment") || []) + let equipments = foundry.utils.deepClone(this.items.filter(item => item.type == "equipment") || []) for (let equip1 of equipments) { if (equip1.system.iscontainer) { equip1.system.contents = [] equip1.system.contentsEnc = 0 for (let equip2 of equipments) { - if (equip1._id != equip2.id && equip2.system.containerid == equip1.id) { + if (equip1.id !== equip2.id && equip2.system.containerid == equip1.id) { equip1.system.contents.push(equip2) let q = equip2.system.quantity ?? 1 equip1.system.contentsEnc += q * equip2.system.weight @@ -288,7 +288,7 @@ export class EcrymeActor extends Actor { /* -------------------------------------------- */ clearInitiative() { - this.getFlag("world", "initiative", -1) + this.setFlag("world", "initiative", -1) } /* -------------------------------------------- */ getInitiativeScore(combatId, combatantId) { @@ -301,13 +301,13 @@ export class EcrymeActor extends Actor { getSubActors() { let subActors = []; for (let id of this.system.subactors) { - subActors.push(foundry.utils.duplicate(game.actors.get(id))) + subActors.push(foundry.utils.deepClone(game.actors.get(id))) } return subActors; } /* -------------------------------------------- */ async addSubActor(subActorId) { - let subActors = foundry.utils.duplicate(this.system.subactors); + let subActors = foundry.utils.deepClone(this.system.subactors); subActors.push(subActorId); await this.update({ 'system.subactors': subActors }); } @@ -378,10 +378,10 @@ export class EcrymeActor extends Actor { rollData.actorId = this.id rollData.img = this.img rollData.isReroll = false - rollData.config = game.system.ecryme.config - rollData.traits = this.getRollTraits().map(t => ({ _id: t.id, name: t.name, img: t.img, system: { level: t.system.level, traitype: t.system.traitype } })) - rollData.spleen = this.getSpleen() ? foundry.utils.duplicate(this.getSpleen()) : null - rollData.ideal = this.getIdeal() ? foundry.utils.duplicate(this.getIdeal()) : null + rollData.config = game.ecryme.config + rollData.traits = this.getRollTraits().map(t => ({ id: t.id, name: t.name, img: t.img, system: { level: t.system.level, traitype: t.system.traitype } })) + rollData.spleen = this.getSpleen() ? foundry.utils.deepClone(this.getSpleen()) : null + rollData.ideal = this.getIdeal() ? foundry.utils.deepClone(this.getIdeal()) : null rollData.confrontBonus = this.getBonusList() return rollData @@ -402,7 +402,7 @@ export class EcrymeActor extends Actor { } } else { skill = this.system.skills[categKey].skilllist[skillKey] - skill = foundry.utils.duplicate(skill) + skill = foundry.utils.deepClone(skill) skill.spec = this.getSpecializations(skillKey) } @@ -434,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 = foundry.utils.duplicate(spec) + rollData.forcedSpec = foundry.utils.deepClone(spec) rollData.title = game.i18n.localize(rollData.skill.name) this.startRoll(rollData).catch("Error on startRoll") } @@ -444,11 +444,11 @@ export class EcrymeActor extends Actor { let rollData = this.getCommonSkill(categKey, skillKey) rollData.mode = "skill" 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.executionTotal = rollData.skill.max + rollData.preservationTotal = rollData.skill.max rollData.applyTranscendence = "execution" - rollData.traitsBonus = foundry.utils.duplicate(rollData.traits) - rollData.traitsMalus = foundry.utils.duplicate(rollData.traits) + rollData.traitsBonus = foundry.utils.deepClone(rollData.traits) + rollData.traitsMalus = foundry.utils.deepClone(rollData.traits) console.log("ROLLDATA", rollData) let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) confrontStartDialog.render(true) @@ -457,16 +457,16 @@ export class EcrymeActor extends Actor { async rollCephalySkillConfront(skillKey) { let rollData = this.getCommonRollData() rollData.mode = "cephaly" - rollData.skill = foundry.utils.duplicate(this.system.cephaly.skilllist[skillKey]) - rollData.annency = foundry.utils.duplicate(this.getAnnency()) + rollData.skill = foundry.utils.deepClone(this.system.cephaly.skilllist[skillKey]) + rollData.annency = foundry.utils.deepClone(this.getAnnency()) rollData.img = rollData.skill.img rollData.skill.categKey = "cephaly" rollData.skill.skillKey = skillKey rollData.title = game.i18n.localize("ECRY.ui.cephaly") + " : " + game.i18n.localize(rollData.skill.name) - rollData.executionTotal = rollData.skill.value - rollData.preservationTotal = rollData.skill.value - rollData.traitsBonus = foundry.utils.duplicate(rollData.traits) - rollData.traitsMalus = foundry.utils.duplicate(rollData.traits) + rollData.executionTotal = rollData.skill.max + rollData.preservationTotal = rollData.skill.max + rollData.traitsBonus = foundry.utils.deepClone(rollData.traits) + rollData.traitsMalus = foundry.utils.deepClone(rollData.traits) rollData.applyTranscendence = "execution" let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) confrontStartDialog.render(true) @@ -482,27 +482,27 @@ export class EcrymeActor extends Actor { rollData = this.getCommonSkill("physical", "shooting") } rollData.mode = "weapon" - rollData.weapon = foundry.utils.duplicate(weapon) + rollData.weapon = foundry.utils.deepClone(weapon) rollData.title = game.i18n.localize("ECRY.ui.confrontation") + " : " + game.i18n.localize(rollData.skill.name) - rollData.executionTotal = rollData.skill.value - rollData.preservationTotal = rollData.skill.value - rollData.traitsBonus = foundry.utils.duplicate(rollData.traits) - rollData.traitsMalus = foundry.utils.duplicate(rollData.traits) + rollData.executionTotal = rollData.skill.max + rollData.preservationTotal = rollData.skill.max + rollData.traitsBonus = foundry.utils.deepClone(rollData.traits) + rollData.traitsMalus = foundry.utils.deepClone(rollData.traits) rollData.applyTranscendence = "execution" let confrontStartDialog = await EcrymeConfrontStartDialog.create(this, rollData) confrontStartDialog.render(true) } - + /* -------------------------------------------- */ rollWeapon(weaponId) { let weapon = this.items.get(weaponId) if (weapon) { - weapon = foundry.utils.duplicate(weapon) + weapon = foundry.utils.deepClone(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 = foundry.utils.duplicate(this.system.attributs.habilite) + rollData.attr = foundry.utils.deepClone(this.system.attributs.habilite) } rollData.mode = "weapon" rollData.weapon = weapon @@ -514,6 +514,32 @@ export class EcrymeActor extends Actor { } } + /* -------------------------------------------- */ + resetSkillPool() { + const updateData = {} + const skills = this.system.skills + for (const categKey of Object.keys(skills)) { + const skilllist = skills[categKey]?.skilllist + if (!skilllist) continue + for (const skillKey of Object.keys(skilllist)) { + const skill = skilllist[skillKey] + if (skill.max !== undefined) { + updateData[`system.skills.${categKey}.skilllist.${skillKey}.value`] = skill.max + } + } + } + const cephaly = this.system.cephaly?.skilllist + if (cephaly) { + for (const skillKey of Object.keys(cephaly)) { + const skill = cephaly[skillKey] + if (skill.max !== undefined) { + updateData[`system.cephaly.skilllist.${skillKey}.value`] = skill.max + } + } + } + return this.update(updateData) + } + /* -------------------------------------------- */ async startRoll(rollData) { let rollDialog = await EcrymeRollDialog.create(this, rollData) diff --git a/modules/actors/ecryme-annency-sheet.js b/modules/actors/ecryme-annency-sheet.js index 0e0c705..a3246d9 100644 --- a/modules/actors/ecryme-annency-sheet.js +++ b/modules/actors/ecryme-annency-sheet.js @@ -11,7 +11,8 @@ export class EcrymeAnnencySheet extends foundry.appv1.sheets.ActorSheet { /** @override */ static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { + return { + ...super.defaultOptions, classes: ["fvtt-ecryme", "sheet", "actor"], template: "systems/fvtt-ecryme/templates/actors/annency-sheet.hbs", width: 640, @@ -19,7 +20,7 @@ export class EcrymeAnnencySheet extends foundry.appv1.sheets.ActorSheet { tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "annency" }], dragDrop: [{ dragSelector: ".item-list .item", dropSelector: null }], editScore: true - }); + }; } /* -------------------------------------------- */ @@ -33,9 +34,9 @@ export class EcrymeAnnencySheet extends foundry.appv1.sheets.ActorSheet { name: this.actor.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", - system: foundry.utils.duplicate(this.object.system), + system: foundry.utils.deepClone(this.object.system), limited: this.object.limited, - config: foundry.utils.duplicate(game.system.ecryme.config), + config: foundry.utils.deepClone(game.ecryme.config), hasCephaly: EcrymeUtility.hasCephaly(), hasBoheme: EcrymeUtility.hasBoheme(), hasAmertume: EcrymeUtility.hasAmertume(), @@ -121,7 +122,7 @@ export class EcrymeAnnencySheet extends foundry.appv1.sheets.ActorSheet { } else { ui.notifications.warn("Actor not found") } - super._onDropActor(event) + super._onDropActor(event, dragData) } /* -------------------------------------------- */ diff --git a/modules/actors/sheets/annency-sheet.js b/modules/actors/sheets/annency-sheet.js index 6599aff..7aa027d 100644 --- a/modules/actors/sheets/annency-sheet.js +++ b/modules/actors/sheets/annency-sheet.js @@ -63,7 +63,7 @@ export default class EcrymeAnnencySheet extends EcrymeBaseActorSheet { img: actor.img, name: actor.name, isEditable: this.isEditable, - config: game.system.ecryme.config, + config: game.ecryme.config, hasCephaly: EcrymeUtility.hasCephaly(), hasBoheme: EcrymeUtility.hasBoheme(), characters: actor.buildAnnencyActorList(), @@ -85,7 +85,7 @@ export default class EcrymeAnnencySheet extends EcrymeBaseActorSheet { /** @override */ async _onDrop(event) { const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event) - if (data.type === "Actor") { + if (data?.type === "Actor") { const actor = await fromUuid(data.uuid) if (actor) { this.actor.addAnnencyActor(actor.id) @@ -118,9 +118,9 @@ export default class EcrymeAnnencySheet extends EcrymeBaseActorSheet { EcrymeUtility.confirmDelete(this, $(li)).catch(() => {}) } - static #onItemCreate(event, target) { + static async #onItemCreate(event, target) { const dataType = target.dataset.type - this.document.createEmbeddedDocuments("Item", [{ name: "NewItem", type: dataType }], { renderSheet: true }) + await this.document.createEmbeddedDocuments("Item", [{ name: "NewItem", type: dataType }], { renderSheet: true }) } // #endregion diff --git a/modules/actors/sheets/base-actor-sheet.js b/modules/actors/sheets/base-actor-sheet.js index 7576d22..d204c44 100644 --- a/modules/actors/sheets/base-actor-sheet.js +++ b/modules/actors/sheets/base-actor-sheet.js @@ -6,13 +6,6 @@ const { HandlebarsApplicationMixin } = foundry.applications.api */ export default class EcrymeBaseActorSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ActorSheetV2) { - constructor(options = {}) { - super(options) - this.#dragDrop = this.#createDragDropHandlers() - } - - #dragDrop - /** @override */ static DEFAULT_OPTIONS = { classes: ["fvtt-ecryme", "sheet", "actor"], @@ -32,27 +25,6 @@ export default class EcrymeBaseActorSheet extends HandlebarsApplicationMixin(fou }, } - /** @override */ - _onRender(context, options) { - this.#dragDrop.forEach((d) => d.bind(this.element)) - } - - // #region Drag-and-Drop - #createDragDropHandlers() { - return this.options.dragDrop.map((d) => { - d.permissions = { - dragstart: this._canDragStart.bind(this), - drop: this._canDragDrop.bind(this), - } - d.callbacks = { - dragstart: this._onDragStart.bind(this), - dragover: this._onDragOver.bind(this), - drop: this._onDrop.bind(this), - } - return new foundry.applications.ux.DragDrop.implementation(d) - }) - } - _canDragStart(selector) { return this.isEditable } _canDragDrop(selector) { return this.isEditable && this.document.isOwner } _onDragStart(event) {} diff --git a/modules/actors/sheets/pc-npc-sheet.js b/modules/actors/sheets/pc-npc-sheet.js index 342aa79..e9dcd91 100644 --- a/modules/actors/sheets/pc-npc-sheet.js +++ b/modules/actors/sheets/pc-npc-sheet.js @@ -6,6 +6,8 @@ import { EcrymeUtility } from "../../common/ecryme-utility.js" */ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { + #editScore = false + /** @override */ static DEFAULT_OPTIONS = { classes: ["pc-npc"], @@ -28,6 +30,7 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { equipItem: EcrymeActorSheet.#onEquipItem, quantityMinus: EcrymeActorSheet.#onQuantityMinus, quantityPlus: EcrymeActorSheet.#onQuantityPlus, + resetTranscendence:EcrymeActorSheet.#onResetTranscendence, }, } @@ -89,7 +92,7 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { img: actor.img, name: actor.name, isEditable: this.isEditable, - config: game.system.ecryme.config, + config: game.ecryme.config, hasCephaly: EcrymeUtility.hasCephaly(), hasBoheme: EcrymeUtility.hasBoheme(), hasAmertume: EcrymeUtility.hasAmertume(), @@ -107,7 +110,7 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { annency: actor.getAnnency(), owner: this.document.isOwner, isGM: game.user.isGM, - editScore: this.options.editScore ?? true, + editScore: this.#editScore, tabs: this._getTabs(), } } @@ -182,9 +185,9 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { EcrymeUtility.confirmDelete(this, $(li)).catch(() => {}) } - static #onItemCreate(event, target) { + static async #onItemCreate(event, target) { const dataType = target.dataset.type - this.document.createEmbeddedDocuments("Item", [{ name: "NewItem", type: dataType }], { renderSheet: true }) + await this.document.createEmbeddedDocuments("Item", [{ name: "NewItem", type: dataType }], { renderSheet: true }) } static #onSubactorEdit(event, target) { @@ -227,11 +230,11 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { } static #onRollWeapon(event, target) { - this.actor.rollArme(target.dataset.armeId) + this.actor.rollWeapon(target.dataset.armeId) } static #onLockUnlock(event, target) { - this.options.editScore = !this.options.editScore + this.#editScore = !this.#editScore this.render(true) } @@ -251,5 +254,10 @@ export default class EcrymeActorSheet extends EcrymeBaseActorSheet { this.actor.incDecQuantity(li?.dataset.itemId, +1) } + static async #onResetTranscendence(event, target) { + await this.actor.resetSkillPool() + this.render(true) + } + // #endregion } diff --git a/modules/app/ecryme-combat.js b/modules/app/ecryme-combat.js index 7a65184..43c033d 100644 --- a/modules/app/ecryme-combat.js +++ b/modules/app/ecryme-combat.js @@ -8,7 +8,7 @@ export class EcrymeCombat extends Combat { ids = typeof ids === "string" ? [ids] : ids; for (let cId = 0; cId < ids.length; cId++) { const c = this.combatants.get(ids[cId]); - let id = c._id || c.id; + let id = c.id; let initBonus = c.actor ? c.actor.getInitiativeScore( this.id, id ) : -1; await this.updateEmbeddedDocuments("Combatant", [ { _id: id, initiative: initBonus } ]); } @@ -17,9 +17,6 @@ export class EcrymeCombat extends Combat { } /* -------------------------------------------- */ - _onUpdate(changed, options, userId) { - } - /* -------------------------------------------- */ static async checkTurnPosition() { while (game.combat.turn > 0) { @@ -28,13 +25,13 @@ export class EcrymeCombat extends Combat { } /* -------------------------------------------- */ - _onDelete() { + async _onDelete() { let combatants = this.combatants.contents for (let c of combatants) { let actor = game.actors.get(c.actorId) - actor.clearInitiative() + await actor.clearInitiative() } - super._onDelete() + await super._onDelete() } } diff --git a/modules/app/ecryme-commands.js b/modules/app/ecryme-commands.js index 63e8af6..a6210b2 100644 --- a/modules/app/ecryme-commands.js +++ b/modules/app/ecryme-commands.js @@ -7,10 +7,10 @@ import { EcrymeCharacterSummary } from "../app/ecryme-summary-app.js" export class EcrymeCommands { static init() { - if (!game.system.ecryme.commands) { + if (!game.ecryme.commands) { const commands = new EcrymeCommands(); commands.registerCommand({ path: ["/resume"], func: (content, msg, params) => EcrymeCharacterSummary.displayPCSummary(), descr: "Affiche la liste des PJs!" }); - game.system.ecryme.commands = commands; + game.ecryme.commands = commands; } } constructor() { @@ -88,7 +88,7 @@ export class EcrymeCommands { if (command && command.func) { const result = command.func(content, msg, params); if (result == false) { - CrucibleCommands._chatAnswer(msg, command.descr); + EcrymeCommands._chatAnswer(msg, command.descr); } return true; } diff --git a/modules/app/ecryme-hotbar.js b/modules/app/ecryme-hotbar.js index ab016b6..fdb012c 100644 --- a/modules/app/ecryme-hotbar.js +++ b/modules/app/ecryme-hotbar.js @@ -14,7 +14,7 @@ export class EcrymeHotbar { if (documentData.type == "Item") { console.log("Drop done !!!", bar, documentData, slot) let item = documentData.data - let command = `game.system.ecryme.EcrymeHotbar.rollMacro("${item.name}", "${item.type}");` + let command = `game.ecryme.EcrymeHotbar.rollMacro("${item.name}", "${item.type}");` let macro = game.macros.contents.find(m => (m.name === item.name) && (m.command === command)) if (!macro) { macro = await Macro.create({ @@ -33,9 +33,9 @@ export class EcrymeHotbar { let macro = game.macros.contents.find(m => (m.name === actor.name) && (m.command === command)); if (!macro) { macro = await Macro.create({ - name: actor.data.name, + name: actor.name, type: "script", - img: actor.data.img, + img: actor.img, command: command }, { displaySheet: false }) game.user.assignHotbarMacro(macro, slot); @@ -48,7 +48,7 @@ export class EcrymeHotbar { let macro = game.macros.contents.find(m => (m.name === journal.name) && (m.command === command)); if (!macro) { macro = await Macro.create({ - name: journal.data.name, + name: journal.name, type: "script", img: "", command: command diff --git a/modules/app/ecryme-summary-app.js b/modules/app/ecryme-summary-app.js index 4edc82a..79ca6f7 100644 --- a/modules/app/ecryme-summary-app.js +++ b/modules/app/ecryme-summary-app.js @@ -31,7 +31,7 @@ export class EcrymeCharacterSummary extends HandlebarsApplicationMixin(foundry.a /* -------------------------------------------- */ static displayPCSummary() { if (game.user.isGM) { - game.system.ecryme.charSummary.render(true) + game.ecryme.charSummary.render(true) } else { ui.notifications.info("Commande /summary réservée au MJ !") } @@ -50,7 +50,7 @@ export class EcrymeCharacterSummary extends HandlebarsApplicationMixin(foundry.a return } let charSummary = new EcrymeCharacterSummary() - game.system.ecryme.charSummary = charSummary + game.ecryme.charSummary = charSummary } /* -------------------------------------------- */ @@ -75,7 +75,7 @@ export class EcrymeCharacterSummary extends HandlebarsApplicationMixin(foundry.a return { pcs, npcs, - config: game.system.ecryme.config, + config: game.ecryme.config, } } diff --git a/modules/common/ecryme-utility.js b/modules/common/ecryme-utility.js index 38c044f..413de4c 100644 --- a/modules/common/ecryme-utility.js +++ b/modules/common/ecryme-utility.js @@ -131,7 +131,7 @@ export class EcrymeUtility { /*-------------------------------------------- */ static buildSkillConfig() { // Build skill configuration from DataModel structure - game.system.ecryme.config.skills = {} + game.ecryme.config.skills = {} const skillCategories = { physical: { @@ -169,9 +169,9 @@ export class EcrymeUtility { for (let categKey in skillCategories) { let category = skillCategories[categKey] for (let skillKey in category.skilllist) { - let skill = foundry.utils.duplicate(category.skilllist[skillKey]) + let skill = foundry.utils.deepClone(category.skilllist[skillKey]) skill.categKey = categKey - game.system.ecryme.config.skills[skillKey] = skill + game.ecryme.config.skills[skillKey] = skill } } } @@ -229,19 +229,19 @@ export class EcrymeUtility { let maxMargin // Dummy max if (confront.marginExecution > 0) { // Successful hit // Limit with skill+spec - maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0) + maxMargin = confront.rollData1.skill.max + ((confront.rollData1.spec) ? 2 : 0) confront.marginExecution = Math.min(confront.marginExecution, maxMargin) } else { // Failed hit - maxMargin = confront.rollData2.skill.value + ((confront.rollData2.spec) ? 2 : 0) + maxMargin = confront.rollData2.skill.max + ((confront.rollData2.spec) ? 2 : 0) confront.marginExecution = -Math.min(Math.abs(confront.marginExecution), maxMargin) } if (confront.marginPreservation > 0) { // Successful defense // Limit with skill+spec - maxMargin = confront.rollData1.skill.value + ((confront.rollData1.spec) ? 2 : 0) + maxMargin = confront.rollData1.skill.max + ((confront.rollData1.spec) ? 2 : 0) confront.marginPreservation = Math.min(confront.marginPreservation, maxMargin) } else { // Failed defense - maxMargin = confront.rollData2.skill.value + ((confront.rollData2.spec) ? 2 : 0) + maxMargin = confront.rollData2.skill.max + ((confront.rollData2.spec) ? 2 : 0) confront.marginPreservation = - Math.min(Math.abs(confront.marginPreservation), maxMargin) } @@ -264,7 +264,7 @@ export class EcrymeUtility { } let msg = await this.createChatWithRollMode(this.confrontData1.alias, { - content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-result.hbs`, confront) + content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-confrontation-result.hbs`, confront) }) await msg.setFlag("world", "ecryme-rolldata", confront) console.log("Confront result", confront) @@ -287,7 +287,7 @@ export class EcrymeUtility { rollData.marginPreservation = -1 } let msg = await this.createChatWithRollMode(rollData.alias, { - content: await renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-cephaly-result.hbs`, rollData) + content: await foundry.applications.handlebars.renderTemplate(`systems/fvtt-ecryme/templates/chat/chat-cephaly-result.hbs`, rollData) }) msg.setFlag("world", "ecryme-rolldata", rollData) console.log("Cephaly result", rollData) @@ -457,7 +457,7 @@ export class EcrymeUtility { let id = rollData.rollId let oldRollData = this.rollDataStore[id] || {} - let newRollData = foundry.utils.mergeObject(oldRollData, rollData) + let newRollData = { ...oldRollData, ...rollData } this.rollDataStore[id] = newRollData } @@ -468,7 +468,7 @@ export class EcrymeUtility { let rollData = msg.data.rollData if (game.user.isGM) { let chatMsg = await this.createChatMessage(rollData.alias, "blindroll", { - content: await renderTemplate(msg.data.template, rollData), + content: await foundry.applications.handlebars.renderTemplate(msg.data.template, rollData), whisper: game.user.id }) chatMsg.setFlag("world", "ecryme-rolldata", rollData) @@ -480,7 +480,7 @@ export class EcrymeUtility { static async searchItem(dataItem) { let item if (dataItem.pack) { - let id = dataItem.id || dataItem._id + let id = dataItem.id let items = await this.loadCompendium(dataItem.pack, item => item.id == id) item = items[0] || undefined } else { @@ -499,7 +499,7 @@ export class EcrymeUtility { if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id); if (chatData.rollMode === "blindroll") chatData["blind"] = true; - else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user]; + else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user.id]; if (forceWhisper) { // Final force ! chatData["speaker"] = ChatMessage.getSpeaker(); @@ -551,7 +551,7 @@ export class EcrymeUtility { rollData.margin = rollData.total - rollData.difficulty if (rollData.total > rollData.difficulty) { rollData.isSuccess = true - let maxMargin = rollData.skill.value + ((rollData.spec) ? 2 : 0) + let maxMargin = rollData.skill.max + ((rollData.spec) ? 2 : 0) rollData.margin = Math.min(rollData.margin, maxMargin) } } @@ -567,11 +567,12 @@ export class EcrymeUtility { diceFormula = (isConfrontation) ? "5d6kl2" : "3d6kl2" } if (rollData.skill) { - diceFormula += "+" + rollData.skill.value + diceFormula += "+" + rollData.skill.max } if (rollData.skillTranscendence) { - diceFormula += "+" + rollData.skillTranscendence - actor.spentSkillTranscendence(rollData.skill, rollData.skillTranscendence) + let toSpend = Math.min(rollData.skillTranscendence, rollData.skill.value) + diceFormula += "+" + toSpend + actor.spentSkillTranscendence(rollData.skill, toSpend) } if (rollData.selectedSpecs && rollData.selectedSpecs.length > 0) { rollData.spec = actor.getSpecialization(rollData.selectedSpecs[0]) @@ -620,7 +621,7 @@ export class EcrymeUtility { // Performs roll let myRoll = await new Roll(diceFormula).roll() await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) - rollData.roll = foundry.utils.duplicate(myRoll) + rollData.roll = foundry.utils.deepClone(myRoll) rollData.total = myRoll.total rollData.diceSum = myRoll.terms[0].total @@ -644,7 +645,7 @@ export class EcrymeUtility { actor.spentSkillTranscendence(rollData.skill, value) 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) } @@ -748,7 +749,7 @@ export class EcrymeUtility { useSpleen: false, useIdeal: false, impactMalus: 0, - config: foundry.utils.duplicate(game.system.ecryme.config) + config: foundry.utils.deepClone(game.ecryme.config) } EcrymeUtility.updateWithTarget(rollData) return rollData @@ -770,29 +771,9 @@ export class EcrymeUtility { /* -------------------------------------------- */ static async confirmDelete(actorSheet, li) { let itemId = li.data("item-id"); - let msgTxt = "
Etes vous certain de souhaiter envoyer cet item dans les limbes ?"; - let buttons = { - delete: { - icon: '', - label: "Oui, retirez-le", - callback: () => { - actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]); - li.slideUp(200, () => actorSheet.render(false)); - } - }, - cancel: { - icon: '', - label: "Annuler" - } - } - msgTxt += "
"; - let d = new Dialog({ - title: "Confirm removal", - content: msgTxt, - buttons: buttons, - default: "cancel" - }); - d.render(true); + if (!confirm("Etes vous certain de souhaiter envoyer cet item dans les limbes ?")) return; + actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]); + li.slideUp(200, () => actorSheet.render(false)); } } \ No newline at end of file diff --git a/modules/dialogs/ecryme-confront-dialog.js b/modules/dialogs/ecryme-confront-dialog.js index c6ad6ba..a4cf026 100644 --- a/modules/dialogs/ecryme-confront-dialog.js +++ b/modules/dialogs/ecryme-confront-dialog.js @@ -48,7 +48,7 @@ export class EcrymeConfrontDialog extends HandlebarsApplicationMixin(foundry.app async _prepareContext() { return { ...this.rollData, - config: game.system.ecryme.config, + config: game.ecryme.config, buttonDisabled: this.buttonDisabled, } } @@ -200,14 +200,14 @@ export class EcrymeConfrontDialog extends HandlebarsApplicationMixin(foundry.app rollData.executionTotal = rollData.availableDices .filter(d => d.location === "execution") - .reduce((acc, d) => acc + d.result, rollData.skill.value) + .reduce((acc, d) => acc + d.result, rollData.skill.max) rollData.executionTotal = rollData.confrontBonus .filter(d => d.location === "execution") .reduce((acc) => acc + 1, rollData.executionTotal) rollData.preservationTotal = rollData.availableDices .filter(d => d.location === "preservation") - .reduce((acc, d) => acc + d.result, rollData.skill.value) + .reduce((acc, d) => acc + d.result, rollData.skill.max) rollData.preservationTotal = rollData.confrontBonus .filter(d => d.location === "preservation") .reduce((acc) => acc + 1, rollData.preservationTotal) @@ -216,7 +216,7 @@ export class EcrymeConfrontDialog extends HandlebarsApplicationMixin(foundry.app // Specialization if (rollData.selectedSpecs?.length > 0) { - rollData.spec = foundry.utils.duplicate(actor.getSpecialization(rollData.selectedSpecs[0])) + rollData.spec = foundry.utils.deepClone(actor.getSpecialization(rollData.selectedSpecs[0])) rollData.specApplied = true rollData.executionTotal += 2 rollData.preservationTotal += 2 @@ -232,11 +232,11 @@ export class EcrymeConfrontDialog extends HandlebarsApplicationMixin(foundry.app for (const t of rollData.traitsMalus) t.activated = false for (const id of (rollData.traitsBonusSelected ?? [])) { - const trait = rollData.traitsBonus.find(t => t._id === id) + const trait = rollData.traitsBonus.find(t => t.id === id) if (trait) { trait.activated = true; rollData.bonusMalusTraits += Number(trait.system.level) } } for (const id of (rollData.traitsMalusSelected ?? [])) { - const trait = rollData.traitsMalus.find(t => t._id === id) + const trait = rollData.traitsMalus.find(t => t.id === id) if (trait) { trait.activated = true; rollData.bonusMalusTraits -= Number(trait.system.level) } } diff --git a/modules/dialogs/ecryme-confront-start-dialog.js b/modules/dialogs/ecryme-confront-start-dialog.js index 1b53ccb..7b54889 100644 --- a/modules/dialogs/ecryme-confront-start-dialog.js +++ b/modules/dialogs/ecryme-confront-start-dialog.js @@ -47,7 +47,7 @@ export class EcrymeConfrontStartDialog extends HandlebarsApplicationMixin(foundr async _prepareContext() { return { ...this.rollData, - config: game.system.ecryme.config, + config: game.ecryme.config, } } @@ -57,11 +57,11 @@ export class EcrymeConfrontStartDialog extends HandlebarsApplicationMixin(foundr await EcrymeUtility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) const rollData = this.rollData - rollData.roll = foundry.utils.duplicate(myRoll) + rollData.roll = foundry.utils.deepClone(myRoll) rollData.availableDices = [] for (const result of myRoll.terms[0].results) { if (!result.discarded) { - const dup = foundry.utils.duplicate(result) + const dup = foundry.utils.deepClone(result) dup.location = "mainpool" rollData.availableDices.push(dup) } diff --git a/modules/dialogs/ecryme-roll-dialog.js b/modules/dialogs/ecryme-roll-dialog.js index 83f9dd6..ffff26d 100644 --- a/modules/dialogs/ecryme-roll-dialog.js +++ b/modules/dialogs/ecryme-roll-dialog.js @@ -40,7 +40,7 @@ export class EcrymeRollDialog extends HandlebarsApplicationMixin(foundry.applica async _prepareContext() { return { ...this.rollData, - config: game.system.ecryme.config, + config: game.ecryme.config, } } diff --git a/modules/ecryme-main.js b/modules/ecryme-main.js index b5015b1..d9870d5 100644 --- a/modules/ecryme-main.js +++ b/modules/ecryme-main.js @@ -10,7 +10,7 @@ const ECRYME_WELCOME_MESSAGE_URL = "https://www.uberwald.me/gitea/public/fvtt-ec /* -------------------------------------------- */ // Import Modules import { EcrymeActor } from "./actors/ecryme-actor.js"; -import { EcrymeItemSheet } from "./items/ecryme-item-sheet.js"; +// import { EcrymeItemSheet } from "./items/ecryme-item-sheet.js"; import { EcrymeEquipmentSheet, EcrymeWeaponSheet, @@ -74,7 +74,7 @@ Hooks.once("init", async function () { maneuver: models.EcrymeManeuverDataModel } - game.system.ecryme = { + game.ecryme = { config: ECRYME_CONFIG, models, EcrymeHotbar @@ -82,12 +82,10 @@ Hooks.once("init", async function () { /* -------------------------------------------- */ // Register sheet application classes - 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: true }); - foundry.documents.collections.Items.unregisterSheet("core", foundry.appv1.sheets.ItemSheet); foundry.documents.collections.Items.registerSheet("fvtt-ecryme", EcrymeEquipmentSheet, { types: ["equipment"], makeDefault: true }); foundry.documents.collections.Items.registerSheet("fvtt-ecryme", EcrymeWeaponSheet, { types: ["weapon"], makeDefault: true }); foundry.documents.collections.Items.registerSheet("fvtt-ecryme", EcrymeTraitSheet, { types: ["trait"], makeDefault: true }); @@ -145,7 +143,7 @@ Hooks.once("ready", function () { ui.notifications.info("Attention ! Aucun personnage relié au joueur !"); ChatMessage.create({ content: "WARNING Le joueur " + game.user.name + " n'est pas relié à un personnage !", - user: game.user._id + user: game.user.id }); } @@ -176,7 +174,7 @@ Hooks.on("chatMessage", (html, content, msg) => { if (content[0] == '/') { let regExp = /(\S+)/g; let commands = content.match(regExp); - if (game.system.ecryme.commands.processChatCommand(commands, content, msg)) { + if (game.ecryme.commands.processChatCommand(commands, content, msg)) { return false; } } diff --git a/modules/items/ecryme-item-sheet.js b/modules/items/ecryme-item-sheet.js index 5f0c3b1..6afd26f 100644 --- a/modules/items/ecryme-item-sheet.js +++ b/modules/items/ecryme-item-sheet.js @@ -8,28 +8,15 @@ export class EcrymeItemSheet extends foundry.appv1.sheets.ItemSheet { /** @override */ static get defaultOptions() { - return foundry.utils.mergeObject(super.defaultOptions, { + return { + ...super.defaultOptions, classes: ["fvtt-ecryme", "sheet", "item"], template: "systems/fvtt-ecryme/templates/item-sheet.hbs", dragDrop: [{ dragSelector: null, dropSelector: null }], width: 620, height: 580, tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }] - }); - } - - /* -------------------------------------------- */ - _getHeaderButtons() { - let buttons = super._getHeaderButtons(); - // Add "Post to chat" button - // We previously restricted this to GM and editable items only. If you ever find this comment because it broke something: eh, sorry! - buttons.unshift( - { - class: "post", - icon: "fas fa-comment", - onclick: ev => { } - }) - return buttons + }; } /* -------------------------------------------- */ @@ -56,8 +43,8 @@ export class EcrymeItemSheet extends foundry.appv1.sheets.ItemSheet { name: this.object.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", - system: foundry.utils.duplicate(this.object.system), - config: foundry.utils.duplicate(game.system.ecryme.config), + system: foundry.utils.deepClone(this.object.system), + config: foundry.utils.deepClone(game.ecryme.config), limited: this.object.limited, options: this.options, owner: this.document.isOwner, @@ -89,7 +76,7 @@ export class EcrymeItemSheet extends foundry.appv1.sheets.ItemSheet { /* -------------------------------------------- */ postItem() { - let chatData = foundry.utils.duplicate(this.item) + let chatData = foundry.utils.deepClone(this.item) if (this.actor) { chatData.actor = { id: this.actor.id }; } @@ -104,7 +91,7 @@ export class EcrymeItemSheet extends foundry.appv1.sheets.ItemSheet { payload: chatData, }); - renderTemplate('systems/Ecryme/templates/post-item.html', chatData).then(html => { + foundry.applications.handlebars.renderTemplate('systems/fvtt-ecryme/templates/post-item.html', chatData).then(html => { let chatOptions = EcrymeUtility.chatDataSetup(html); ChatMessage.create(chatOptions) }); @@ -154,7 +141,7 @@ export class EcrymeItemSheet extends foundry.appv1.sheets.ItemSheet { // Update Inventory Item html.find('.item-edit').click(ev => { const li = $(ev.currentTarget).parents(".item"); - const item = this.object.options.actor.getOwnedItem(li.data("item-id")); + const item = this.actor?.items.get(li.data("item-id")); item.sheet.render(true); }); diff --git a/modules/items/sheets/base-item-sheet.js b/modules/items/sheets/base-item-sheet.js index 329c596..b5d00de 100644 --- a/modules/items/sheets/base-item-sheet.js +++ b/modules/items/sheets/base-item-sheet.js @@ -6,13 +6,6 @@ const { HandlebarsApplicationMixin } = foundry.applications.api */ export default class EcrymeBaseItemSheet extends HandlebarsApplicationMixin(foundry.applications.sheets.ItemSheetV2) { - constructor(options = {}) { - super(options) - this.#dragDrop = this.#createDragDropHandlers() - } - - #dragDrop - /** @override */ static DEFAULT_OPTIONS = { classes: ["fvtt-ecryme", "item"], @@ -63,7 +56,7 @@ export default class EcrymeBaseItemSheet extends HandlebarsApplicationMixin(foun item: this.document, system: this.document.system, source: this.document.toObject(), - config: game.system.ecryme.config, + config: game.ecryme.config, isEditable: this.isEditable, tabs: this._getTabs(), } @@ -82,27 +75,6 @@ export default class EcrymeBaseItemSheet extends HandlebarsApplicationMixin(foun return context } - /** @override */ - _onRender(context, options) { - this.#dragDrop.forEach((d) => d.bind(this.element)) - } - - // #region Drag-and-Drop - #createDragDropHandlers() { - return this.options.dragDrop.map((d) => { - d.permissions = { - dragstart: this._canDragStart.bind(this), - drop: this._canDragDrop.bind(this), - } - d.callbacks = { - dragstart: this._onDragStart.bind(this), - dragover: this._onDragOver.bind(this), - drop: this._onDrop.bind(this), - } - return new foundry.applications.ux.DragDrop.implementation(d) - }) - } - _canDragStart(selector) { return this.isEditable } _canDragDrop(selector) { return this.isEditable && this.document.isOwner } _onDragStart(event) {} diff --git a/modules/models/pc.js b/modules/models/pc.js index ad000fa..5dd0d6b 100644 --- a/modules/models/pc.js +++ b/modules/models/pc.js @@ -41,26 +41,26 @@ export default class EcrymePCDataModel extends foundry.abstract.TypeDataModel { }; const mentalSkills = { - anthropomecanology: new fields.SchemaField(createSkillSchema("anthropomecanology", "ECRY.ui.anthropomecanology", 10)), - ecrymology: new fields.SchemaField(createSkillSchema("ecrymology", "ECRY.ui.ecrymology", 10)), - traumatology: new fields.SchemaField(createSkillSchema("traumatology", "ECRY.ui.traumatology", 10)), - traversology: new fields.SchemaField(createSkillSchema("traversology", "ECRY.ui.traversology", 10)), - urbatechnology: new fields.SchemaField(createSkillSchema("urbatechnology", "ECRY.ui.urbatechnology", 10)) + anthropomecanology: new fields.SchemaField(createSkillSchema("anthropomecanology", "ECRY.ui.anthropomecanology")), + ecrymology: new fields.SchemaField(createSkillSchema("ecrymology", "ECRY.ui.ecrymology")), + traumatology: new fields.SchemaField(createSkillSchema("traumatology", "ECRY.ui.traumatology")), + traversology: new fields.SchemaField(createSkillSchema("traversology", "ECRY.ui.traversology")), + urbatechnology: new fields.SchemaField(createSkillSchema("urbatechnology", "ECRY.ui.urbatechnology")) }; const socialSkills = { - quibbling: new fields.SchemaField(createSkillSchema("quibbling", "ECRY.ui.quibbling", 10)), - creativity: new fields.SchemaField(createSkillSchema("creativity", "ECRY.ui.creativity", 10)), - loquacity: new fields.SchemaField(createSkillSchema("loquacity", "ECRY.ui.loquacity", 10)), - guile: new fields.SchemaField(createSkillSchema("guile", "ECRY.ui.guile", 10)), - performance: new fields.SchemaField(createSkillSchema("performance", "ECRY.ui.performance", 10)) + quibbling: new fields.SchemaField(createSkillSchema("quibbling", "ECRY.ui.quibbling")), + creativity: new fields.SchemaField(createSkillSchema("creativity", "ECRY.ui.creativity")), + loquacity: new fields.SchemaField(createSkillSchema("loquacity", "ECRY.ui.loquacity")), + guile: new fields.SchemaField(createSkillSchema("guile", "ECRY.ui.guile")), + performance: new fields.SchemaField(createSkillSchema("performance", "ECRY.ui.performance")) }; // Helper function to create a cephaly skill schema const createCephalySkillSchema = (nameValue) => ({ name: new fields.StringField({ initial: nameValue }), value: new fields.NumberField({ initial: 0, integer: true, min: 0 }), - max: new fields.NumberField({ initial: 10, integer: true }) + max: new fields.NumberField({ initial: 0, integer: true }) }); // Cephaly skills diff --git a/packs/equipment/000397.log b/packs/equipment/000405.log similarity index 100% rename from packs/equipment/000397.log rename to packs/equipment/000405.log diff --git a/packs/equipment/CURRENT b/packs/equipment/CURRENT index e889b4d..d864bc5 100644 --- a/packs/equipment/CURRENT +++ b/packs/equipment/CURRENT @@ -1 +1 @@ -MANIFEST-000395 +MANIFEST-000403 diff --git a/packs/equipment/LOG b/packs/equipment/LOG index b4d0500..9a9c346 100644 --- a/packs/equipment/LOG +++ b/packs/equipment/LOG @@ -1,7 +1,7 @@ -2026/07/21-23:37:06.398350 7f8f09fec6c0 Recovering log #393 -2026/07/21-23:37:06.408503 7f8f09fec6c0 Delete type=3 #391 -2026/07/21-23:37:06.408560 7f8f09fec6c0 Delete type=0 #393 -2026/07/21-23:58:26.140301 7f8f097eb6c0 Level-0 table #398: started -2026/07/21-23:58:26.140328 7f8f097eb6c0 Level-0 table #398: 0 bytes OK -2026/07/21-23:58:26.146757 7f8f097eb6c0 Delete type=0 #396 -2026/07/21-23:58:26.160256 7f8f097eb6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) +2026/07/24-08:30:57.764367 7fb397fff6c0 Recovering log #401 +2026/07/24-08:30:57.820757 7fb397fff6c0 Delete type=3 #399 +2026/07/24-08:30:57.820848 7fb397fff6c0 Delete type=0 #401 +2026/07/24-08:59:46.956225 7fb394b4f6c0 Level-0 table #406: started +2026/07/24-08:59:46.956258 7fb394b4f6c0 Level-0 table #406: 0 bytes OK +2026/07/24-08:59:46.963004 7fb394b4f6c0 Delete type=0 #404 +2026/07/24-08:59:46.977171 7fb394b4f6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/LOG.old b/packs/equipment/LOG.old index f694269..b77dab2 100644 --- a/packs/equipment/LOG.old +++ b/packs/equipment/LOG.old @@ -1,7 +1,7 @@ -2026/07/21-21:44:20.517858 7f8f0afee6c0 Recovering log #389 -2026/07/21-21:44:20.527213 7f8f0afee6c0 Delete type=3 #387 -2026/07/21-21:44:20.527291 7f8f0afee6c0 Delete type=0 #389 -2026/07/21-22:22:52.642955 7f8f097eb6c0 Level-0 table #394: started -2026/07/21-22:22:52.642974 7f8f097eb6c0 Level-0 table #394: 0 bytes OK -2026/07/21-22:22:52.649267 7f8f097eb6c0 Delete type=0 #392 -2026/07/21-22:22:52.662877 7f8f097eb6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) +2026/07/23-23:29:38.540622 7fb3977fe6c0 Recovering log #397 +2026/07/23-23:29:38.552087 7fb3977fe6c0 Delete type=3 #395 +2026/07/23-23:29:38.552145 7fb3977fe6c0 Delete type=0 #397 +2026/07/24-08:14:15.212953 7fb394b4f6c0 Level-0 table #402: started +2026/07/24-08:14:15.212989 7fb394b4f6c0 Level-0 table #402: 0 bytes OK +2026/07/24-08:14:15.263841 7fb394b4f6c0 Delete type=0 #400 +2026/07/24-08:14:15.341416 7fb394b4f6c0 Manual compaction at level-0 from '!folders!1GrTlI1xWvaxdKRI' @ 72057594037927935 : 1 .. '!items!zs7krgXhDRndtqbl' @ 0 : 0; will stop at (end) diff --git a/packs/equipment/MANIFEST-000395 b/packs/equipment/MANIFEST-000403 similarity index 71% rename from packs/equipment/MANIFEST-000395 rename to packs/equipment/MANIFEST-000403 index dca712f..00a041a 100644 Binary files a/packs/equipment/MANIFEST-000395 and b/packs/equipment/MANIFEST-000403 differ diff --git a/packs/help/000330.log b/packs/help/000338.log similarity index 100% rename from packs/help/000330.log rename to packs/help/000338.log diff --git a/packs/help/CURRENT b/packs/help/CURRENT index 6926645..26ca7ad 100644 --- a/packs/help/CURRENT +++ b/packs/help/CURRENT @@ -1 +1 @@ -MANIFEST-000328 +MANIFEST-000336 diff --git a/packs/help/LOG b/packs/help/LOG index c8bd030..4fb05ac 100644 --- a/packs/help/LOG +++ b/packs/help/LOG @@ -1,8 +1,8 @@ -2026/07/21-23:37:06.449926 7f8f0afee6c0 Recovering log #326 -2026/07/21-23:37:06.459731 7f8f0afee6c0 Delete type=3 #324 -2026/07/21-23:37:06.459790 7f8f0afee6c0 Delete type=0 #326 -2026/07/21-23:58:26.167099 7f8f097eb6c0 Level-0 table #331: started -2026/07/21-23:58:26.167127 7f8f097eb6c0 Level-0 table #331: 0 bytes OK -2026/07/21-23:58:26.173119 7f8f097eb6c0 Delete type=0 #329 -2026/07/21-23:58:26.183592 7f8f097eb6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) -2026/07/21-23:58:26.190269 7f8f097eb6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) +2026/07/24-08:30:58.009658 7fb396ffd6c0 Recovering log #334 +2026/07/24-08:30:58.067952 7fb396ffd6c0 Delete type=3 #332 +2026/07/24-08:30:58.068041 7fb396ffd6c0 Delete type=0 #334 +2026/07/24-08:59:46.969755 7fb394b4f6c0 Level-0 table #339: started +2026/07/24-08:59:46.969790 7fb394b4f6c0 Level-0 table #339: 0 bytes OK +2026/07/24-08:59:46.976981 7fb394b4f6c0 Delete type=0 #337 +2026/07/24-08:59:46.977429 7fb394b4f6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) +2026/07/24-08:59:46.990444 7fb394b4f6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) diff --git a/packs/help/LOG.old b/packs/help/LOG.old index 0375c43..be1fa75 100644 --- a/packs/help/LOG.old +++ b/packs/help/LOG.old @@ -1,8 +1,8 @@ -2026/07/21-21:44:20.567283 7f8f09fec6c0 Recovering log #322 -2026/07/21-21:44:20.578221 7f8f09fec6c0 Delete type=3 #320 -2026/07/21-21:44:20.578306 7f8f09fec6c0 Delete type=0 #322 -2026/07/21-22:22:52.669940 7f8f097eb6c0 Level-0 table #327: started -2026/07/21-22:22:52.669970 7f8f097eb6c0 Level-0 table #327: 0 bytes OK -2026/07/21-22:22:52.676090 7f8f097eb6c0 Delete type=0 #325 -2026/07/21-22:22:52.696989 7f8f097eb6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) -2026/07/21-22:22:52.707515 7f8f097eb6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) +2026/07/23-23:29:38.605125 7fb397fff6c0 Recovering log #330 +2026/07/23-23:29:38.614967 7fb397fff6c0 Delete type=3 #328 +2026/07/23-23:29:38.615053 7fb397fff6c0 Delete type=0 #330 +2026/07/24-08:14:15.385470 7fb394b4f6c0 Level-0 table #335: started +2026/07/24-08:14:15.385508 7fb394b4f6c0 Level-0 table #335: 0 bytes OK +2026/07/24-08:14:15.417431 7fb394b4f6c0 Delete type=0 #333 +2026/07/24-08:14:15.479154 7fb394b4f6c0 Manual compaction at level-0 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) +2026/07/24-08:14:15.542162 7fb394b4f6c0 Manual compaction at level-1 from '!journal!wooTFYjEwh83FwgT' @ 72057594037927935 : 1 .. '!journal.pages!wooTFYjEwh83FwgT.xhc7hqoL8kdW6lrD' @ 0 : 0; will stop at (end) diff --git a/packs/help/MANIFEST-000328 b/packs/help/MANIFEST-000336 similarity index 56% rename from packs/help/MANIFEST-000328 rename to packs/help/MANIFEST-000336 index db52050..9af4ed2 100644 Binary files a/packs/help/MANIFEST-000328 and b/packs/help/MANIFEST-000336 differ diff --git a/packs/maneuvers/000395.log b/packs/maneuvers/000403.log similarity index 100% rename from packs/maneuvers/000395.log rename to packs/maneuvers/000403.log diff --git a/packs/maneuvers/CURRENT b/packs/maneuvers/CURRENT index 45d010a..98d25cd 100644 --- a/packs/maneuvers/CURRENT +++ b/packs/maneuvers/CURRENT @@ -1 +1 @@ -MANIFEST-000393 +MANIFEST-000401 diff --git a/packs/maneuvers/LOG b/packs/maneuvers/LOG index 9bcdf0d..b2eb2f2 100644 --- a/packs/maneuvers/LOG +++ b/packs/maneuvers/LOG @@ -1,7 +1,7 @@ -2026/07/21-23:37:06.438745 7f8f0a7ed6c0 Recovering log #391 -2026/07/21-23:37:06.448044 7f8f0a7ed6c0 Delete type=3 #389 -2026/07/21-23:37:06.448110 7f8f0a7ed6c0 Delete type=0 #391 -2026/07/21-23:58:26.160548 7f8f097eb6c0 Level-0 table #396: started -2026/07/21-23:58:26.160599 7f8f097eb6c0 Level-0 table #396: 0 bytes OK -2026/07/21-23:58:26.166936 7f8f097eb6c0 Delete type=0 #394 -2026/07/21-23:58:26.183563 7f8f097eb6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) +2026/07/24-08:30:57.946392 7fb3977fe6c0 Recovering log #399 +2026/07/24-08:30:58.006024 7fb3977fe6c0 Delete type=3 #397 +2026/07/24-08:30:58.006152 7fb3977fe6c0 Delete type=0 #399 +2026/07/24-08:59:46.984189 7fb394b4f6c0 Level-0 table #404: started +2026/07/24-08:59:46.984218 7fb394b4f6c0 Level-0 table #404: 0 bytes OK +2026/07/24-08:59:46.990285 7fb394b4f6c0 Delete type=0 #402 +2026/07/24-08:59:47.001933 7fb394b4f6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) diff --git a/packs/maneuvers/LOG.old b/packs/maneuvers/LOG.old index b436347..864b408 100644 --- a/packs/maneuvers/LOG.old +++ b/packs/maneuvers/LOG.old @@ -1,7 +1,7 @@ -2026/07/21-21:44:20.555084 7f8f0b7ef6c0 Recovering log #387 -2026/07/21-21:44:20.564635 7f8f0b7ef6c0 Delete type=3 #385 -2026/07/21-21:44:20.564707 7f8f0b7ef6c0 Delete type=0 #387 -2026/07/21-22:22:52.662972 7f8f097eb6c0 Level-0 table #392: started -2026/07/21-22:22:52.663005 7f8f097eb6c0 Level-0 table #392: 0 bytes OK -2026/07/21-22:22:52.669773 7f8f097eb6c0 Delete type=0 #390 -2026/07/21-22:22:52.687465 7f8f097eb6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) +2026/07/23-23:29:38.590323 7fb3977fe6c0 Recovering log #395 +2026/07/23-23:29:38.602055 7fb3977fe6c0 Delete type=3 #393 +2026/07/23-23:29:38.602139 7fb3977fe6c0 Delete type=0 #395 +2026/07/24-08:14:15.341819 7fb394b4f6c0 Level-0 table #400: started +2026/07/24-08:14:15.341876 7fb394b4f6c0 Level-0 table #400: 0 bytes OK +2026/07/24-08:14:15.385247 7fb394b4f6c0 Delete type=0 #398 +2026/07/24-08:14:15.479122 7fb394b4f6c0 Manual compaction at level-0 from '!items!13IYF6BPUTivFZzB' @ 72057594037927935 : 1 .. '!items!oSutlbe9wyBZccmf' @ 0 : 0; will stop at (end) diff --git a/packs/maneuvers/MANIFEST-000393 b/packs/maneuvers/MANIFEST-000401 similarity index 73% rename from packs/maneuvers/MANIFEST-000393 rename to packs/maneuvers/MANIFEST-000401 index eacf880..a301da1 100644 Binary files a/packs/maneuvers/MANIFEST-000393 and b/packs/maneuvers/MANIFEST-000401 differ diff --git a/packs/scenes/000283.log b/packs/scenes/000291.log similarity index 100% rename from packs/scenes/000283.log rename to packs/scenes/000291.log diff --git a/packs/scenes/CURRENT b/packs/scenes/CURRENT index 852186d..2e4a584 100644 --- a/packs/scenes/CURRENT +++ b/packs/scenes/CURRENT @@ -1 +1 @@ -MANIFEST-000281 +MANIFEST-000289 diff --git a/packs/scenes/LOG b/packs/scenes/LOG index db8df07..fa16907 100644 --- a/packs/scenes/LOG +++ b/packs/scenes/LOG @@ -1,8 +1,8 @@ -2026/07/21-23:37:06.424077 7f8f0b7ef6c0 Recovering log #278 -2026/07/21-23:37:06.434900 7f8f0b7ef6c0 Delete type=3 #276 -2026/07/21-23:37:06.434963 7f8f0b7ef6c0 Delete type=0 #278 -2026/07/21-23:58:26.153514 7f8f097eb6c0 Level-0 table #284: started -2026/07/21-23:58:26.153548 7f8f097eb6c0 Level-0 table #284: 0 bytes OK -2026/07/21-23:58:26.160040 7f8f097eb6c0 Delete type=0 #282 -2026/07/21-23:58:26.167084 7f8f097eb6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) -2026/07/21-23:58:26.183582 7f8f097eb6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) +2026/07/24-08:30:57.885965 7fb397fff6c0 Recovering log #287 +2026/07/24-08:30:57.939362 7fb397fff6c0 Delete type=3 #285 +2026/07/24-08:30:57.939470 7fb397fff6c0 Delete type=0 #287 +2026/07/24-08:59:46.948977 7fb394b4f6c0 Level-0 table #292: started +2026/07/24-08:59:46.949053 7fb394b4f6c0 Level-0 table #292: 0 bytes OK +2026/07/24-08:59:46.956075 7fb394b4f6c0 Delete type=0 #290 +2026/07/24-08:59:46.977151 7fb394b4f6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) +2026/07/24-08:59:46.977404 7fb394b4f6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) diff --git a/packs/scenes/LOG.old b/packs/scenes/LOG.old index 53a2729..b0cd439 100644 --- a/packs/scenes/LOG.old +++ b/packs/scenes/LOG.old @@ -1,15 +1,8 @@ -2026/07/21-21:44:20.541841 7f8f0afee6c0 Recovering log #274 -2026/07/21-21:44:20.552114 7f8f0afee6c0 Delete type=3 #272 -2026/07/21-21:44:20.552164 7f8f0afee6c0 Delete type=0 #274 -2026/07/21-22:22:52.649444 7f8f097eb6c0 Level-0 table #279: started -2026/07/21-22:22:52.653578 7f8f097eb6c0 Level-0 table #279: 1805 bytes OK -2026/07/21-22:22:52.662677 7f8f097eb6c0 Delete type=0 #277 -2026/07/21-22:22:52.669921 7f8f097eb6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) -2026/07/21-22:22:52.687503 7f8f097eb6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 40 : 1 -2026/07/21-22:22:52.687516 7f8f097eb6c0 Compacting 1@1 + 1@2 files -2026/07/21-22:22:52.690551 7f8f097eb6c0 Generated table #280@1: 4 keys, 1805 bytes -2026/07/21-22:22:52.690566 7f8f097eb6c0 Compacted 1@1 + 1@2 files => 1805 bytes -2026/07/21-22:22:52.696271 7f8f097eb6c0 compacted to: files[ 0 0 1 0 0 0 0 ] -2026/07/21-22:22:52.696454 7f8f097eb6c0 Delete type=2 #247 -2026/07/21-22:22:52.696927 7f8f097eb6c0 Delete type=2 #279 -2026/07/21-22:22:52.707490 7f8f097eb6c0 Manual compaction at level-1 from '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 40 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) +2026/07/23-23:29:38.570468 7fb396ffd6c0 Recovering log #283 +2026/07/23-23:29:38.581351 7fb396ffd6c0 Delete type=3 #281 +2026/07/23-23:29:38.581438 7fb396ffd6c0 Delete type=0 #283 +2026/07/24-08:14:15.298614 7fb394b4f6c0 Level-0 table #288: started +2026/07/24-08:14:15.298651 7fb394b4f6c0 Level-0 table #288: 0 bytes OK +2026/07/24-08:14:15.341159 7fb394b4f6c0 Delete type=0 #286 +2026/07/24-08:14:15.341595 7fb394b4f6c0 Manual compaction at level-0 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) +2026/07/24-08:14:15.417678 7fb394b4f6c0 Manual compaction at level-1 from '!scenes!DDibQQLAvyIq9y09' @ 72057594037927935 : 1 .. '!scenes.levels!zvY1RwBhTfwdZIBa.defaultLevel0000' @ 0 : 0; will stop at (end) diff --git a/packs/scenes/MANIFEST-000281 b/packs/scenes/MANIFEST-000289 similarity index 74% rename from packs/scenes/MANIFEST-000281 rename to packs/scenes/MANIFEST-000289 index 72af4ff..02890c6 100644 Binary files a/packs/scenes/MANIFEST-000281 and b/packs/scenes/MANIFEST-000289 differ diff --git a/packs/specialisation/000393.log b/packs/specialisation/000405.log similarity index 100% rename from packs/specialisation/000393.log rename to packs/specialisation/000405.log diff --git a/packs/specialisation/CURRENT b/packs/specialisation/CURRENT index 8e95b52..d864bc5 100644 --- a/packs/specialisation/CURRENT +++ b/packs/specialisation/CURRENT @@ -1 +1 @@ -MANIFEST-000397 +MANIFEST-000403 diff --git a/packs/specialisation/LOG b/packs/specialisation/LOG index d19d38f..26119ea 100644 --- a/packs/specialisation/LOG +++ b/packs/specialisation/LOG @@ -1,3 +1,7 @@ -2026/07/21-23:39:43.018556 7f86d23fe6c0 Recovering log #396 -2026/07/21-23:39:43.069296 7f86d23fe6c0 Delete type=0 #396 -2026/07/21-23:39:43.069385 7f86d23fe6c0 Delete type=3 #395 +2026/07/24-08:30:57.704269 7fb3e4fff6c0 Recovering log #401 +2026/07/24-08:30:57.760459 7fb3e4fff6c0 Delete type=3 #399 +2026/07/24-08:30:57.760535 7fb3e4fff6c0 Delete type=0 #401 +2026/07/24-08:59:46.963178 7fb394b4f6c0 Level-0 table #406: started +2026/07/24-08:59:46.963211 7fb394b4f6c0 Level-0 table #406: 0 bytes OK +2026/07/24-08:59:46.969620 7fb394b4f6c0 Delete type=0 #404 +2026/07/24-08:59:46.977188 7fb394b4f6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end) diff --git a/packs/specialisation/LOG.old b/packs/specialisation/LOG.old index 79f9c9a..b95e867 100644 --- a/packs/specialisation/LOG.old +++ b/packs/specialisation/LOG.old @@ -1,3 +1,8 @@ -2026/07/21-23:39:38.357102 7ff068bfd6c0 Recovering log #394 -2026/07/21-23:39:38.412635 7ff068bfd6c0 Delete type=0 #394 -2026/07/21-23:39:38.412727 7ff068bfd6c0 Delete type=3 #393 +2026/07/23-23:29:38.526675 7fb397fff6c0 Recovering log #398 +2026/07/23-23:29:38.536758 7fb397fff6c0 Delete type=0 #398 +2026/07/23-23:29:38.536840 7fb397fff6c0 Delete type=3 #397 +2026/07/23-23:29:38.536904 7fb397fff6c0 Delete type=0 #393 +2026/07/24-08:14:15.178686 7fb394b4f6c0 Level-0 table #402: started +2026/07/24-08:14:15.178752 7fb394b4f6c0 Level-0 table #402: 0 bytes OK +2026/07/24-08:14:15.212738 7fb394b4f6c0 Delete type=0 #400 +2026/07/24-08:14:15.341395 7fb394b4f6c0 Manual compaction at level-0 from '!folders!00Hn2nNarlL7b0DR' @ 72057594037927935 : 1 .. '!items!yozTUjNuc2rEGjFK' @ 0 : 0; will stop at (end) diff --git a/packs/specialisation/MANIFEST-000397 b/packs/specialisation/MANIFEST-000403 similarity index 71% rename from packs/specialisation/MANIFEST-000397 rename to packs/specialisation/MANIFEST-000403 index a698ab0..b06ba4d 100644 Binary files a/packs/specialisation/MANIFEST-000397 and b/packs/specialisation/MANIFEST-000403 differ diff --git a/packs/traits/000397.log b/packs/traits/000397.log deleted file mode 100644 index e69de29..0000000 diff --git a/packs/specialisation/000398.log b/packs/traits/000405.log similarity index 100% rename from packs/specialisation/000398.log rename to packs/traits/000405.log diff --git a/packs/traits/CURRENT b/packs/traits/CURRENT index e889b4d..d864bc5 100644 --- a/packs/traits/CURRENT +++ b/packs/traits/CURRENT @@ -1 +1 @@ -MANIFEST-000395 +MANIFEST-000403 diff --git a/packs/traits/LOG b/packs/traits/LOG index 9575918..92f6728 100644 --- a/packs/traits/LOG +++ b/packs/traits/LOG @@ -1,7 +1,7 @@ -2026/07/21-23:37:06.411000 7f8f0a7ed6c0 Recovering log #393 -2026/07/21-23:37:06.421521 7f8f0a7ed6c0 Delete type=3 #391 -2026/07/21-23:37:06.421589 7f8f0a7ed6c0 Delete type=0 #393 -2026/07/21-23:58:26.146891 7f8f097eb6c0 Level-0 table #398: started -2026/07/21-23:58:26.146920 7f8f097eb6c0 Level-0 table #398: 0 bytes OK -2026/07/21-23:58:26.153371 7f8f097eb6c0 Delete type=0 #396 -2026/07/21-23:58:26.160268 7f8f097eb6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) +2026/07/24-08:30:57.824354 7fb3e4fff6c0 Recovering log #401 +2026/07/24-08:30:57.882379 7fb3e4fff6c0 Delete type=3 #399 +2026/07/24-08:30:57.882459 7fb3e4fff6c0 Delete type=0 #401 +2026/07/24-08:59:46.977440 7fb394b4f6c0 Level-0 table #406: started +2026/07/24-08:59:46.977475 7fb394b4f6c0 Level-0 table #406: 0 bytes OK +2026/07/24-08:59:46.984032 7fb394b4f6c0 Delete type=0 #404 +2026/07/24-08:59:47.001914 7fb394b4f6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) diff --git a/packs/traits/LOG.old b/packs/traits/LOG.old index 98098fe..0906733 100644 --- a/packs/traits/LOG.old +++ b/packs/traits/LOG.old @@ -1,7 +1,7 @@ -2026/07/21-21:44:20.529547 7f8f09fec6c0 Recovering log #389 -2026/07/21-21:44:20.539682 7f8f09fec6c0 Delete type=3 #387 -2026/07/21-21:44:20.539761 7f8f09fec6c0 Delete type=0 #389 -2026/07/21-22:22:52.637033 7f8f097eb6c0 Level-0 table #394: started -2026/07/21-22:22:52.637050 7f8f097eb6c0 Level-0 table #394: 0 bytes OK -2026/07/21-22:22:52.642866 7f8f097eb6c0 Delete type=0 #392 -2026/07/21-22:22:52.662863 7f8f097eb6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) +2026/07/23-23:29:38.555786 7fb3e4fff6c0 Recovering log #397 +2026/07/23-23:29:38.566404 7fb3e4fff6c0 Delete type=3 #395 +2026/07/23-23:29:38.566494 7fb3e4fff6c0 Delete type=0 #397 +2026/07/24-08:14:15.264074 7fb394b4f6c0 Level-0 table #402: started +2026/07/24-08:14:15.264110 7fb394b4f6c0 Level-0 table #402: 0 bytes OK +2026/07/24-08:14:15.298436 7fb394b4f6c0 Delete type=0 #400 +2026/07/24-08:14:15.341433 7fb394b4f6c0 Manual compaction at level-0 from '!folders!DiwHbtGAkTYxtshX' @ 72057594037927935 : 1 .. '!items!zgNI2haxhBxBDBdl' @ 0 : 0; will stop at (end) diff --git a/packs/traits/MANIFEST-000395 b/packs/traits/MANIFEST-000403 similarity index 72% rename from packs/traits/MANIFEST-000395 rename to packs/traits/MANIFEST-000403 index ef7161f..c4f5306 100644 Binary files a/packs/traits/MANIFEST-000395 and b/packs/traits/MANIFEST-000403 differ diff --git a/styles/actor-sheet-steampunk.less b/styles/actor-sheet-steampunk.less index 967710f..b98d99d 100644 --- a/styles/actor-sheet-steampunk.less +++ b/styles/actor-sheet-steampunk.less @@ -228,10 +228,17 @@ .item-name-label-long2, .item-name-label-free, .item-field-label-short, + .item-field-skill-level, .item-field-label-medium { color: @steam-rust; } + .item-field-skill-level:disabled { + background: @steam-parchment-dk; + color: fade(@steam-rust, 40%); + opacity: 0.85; + } + // ---- Roll action links (dice icons) ---- a[data-action^="roll"], a.roll-skill, diff --git a/styles/ui.less b/styles/ui.less index ec4faae..9c6882f 100644 --- a/styles/ui.less +++ b/styles/ui.less @@ -251,6 +251,11 @@ ul, li { .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; } +.fvtt-ecryme .window-content .sheet-body .item-field-skill-level { margin-top: 4px; margin-left: 0; width: 2.5rem; min-width: 2.5rem; max-width: 2.5rem; flex-shrink: 0; flex-grow: 0; padding: 0 1px; } +.skill-separator { margin: 0; flex: 0 0 auto; } +.item-field-skill-level:disabled { background: rgba(0,0,0,0.06); color: #666; cursor: not-allowed; opacity: 0.85; } +.skill-transcendence { margin-left: 2px; white-space: nowrap; } +.skill-toolbar { text-align: right; padding: 4px 8px; } .item-field-label-medium { flex-grow: 1; max-width: 6rem; min-width: 6rem; } .item-field-skill { flex-grow: 1; max-width: 6.8rem; min-width: 6.8rem; } .item-field-label-long { flex-grow: 1; max-width: 10rem; min-width: 10rem; } diff --git a/system.json b/system.json index a65601a..a0fa4f3 100644 --- a/system.json +++ b/system.json @@ -101,7 +101,8 @@ "manifest": "https://www.uberwald.me/gitea/public/fvtt-ecryme/raw/branch/master/system.json", "compatibility": { "minimum": "14", - "verified": "14" + "verified": "14", + "maximum": "14" }, "documentTypes": { "Actor": { @@ -129,12 +130,18 @@ { "id": "babele", "type": "module", - "compatibility": {} + "compatibility": { + "minimum": "3.0", + "verified": "3.0" + } }, { "id": "lib-wrapper", "type": "module", - "compatibility": {} + "compatibility": { + "minimum": "1.0", + "verified": "1.0" + } } ] diff --git a/templates/actors/actor-biodata.hbs b/templates/actors/actor-biodata.hbs index ea4facb..84ce13d 100644 --- a/templates/actors/actor-biodata.hbs +++ b/templates/actors/actor-biodata.hbs @@ -53,5 +53,10 @@ value=system.biodata.gmnotes name="system.biodata.gmnotes" toggled=true}}