ALl features OK, excetp creatures sub-type, WIP3

This commit is contained in:
2026-06-07 23:29:02 +02:00
parent 494ec3ea84
commit 6dea5ba479
86 changed files with 497 additions and 234 deletions
@@ -11,6 +11,10 @@ export default class MournbladeCYD2PersonnageSheet extends MournbladeCYD2ActorSh
...super.DEFAULT_OPTIONS.window,
title: "SHEETS.Actor.personnage",
},
actions: {
...super.DEFAULT_OPTIONS.actions,
removeLinkedActor: MournbladeCYD2PersonnageSheet.#onRemoveLinkedActor,
},
};
/** @override */
@@ -53,6 +57,131 @@ export default class MournbladeCYD2PersonnageSheet extends MournbladeCYD2ActorSh
context.adversiteTotal = (actor.system.adversite?.bleue || 0) + (actor.system.adversite?.rouge || 0) + (actor.system.adversite?.noire || 0);
context.richesse = actor.computeRichesse?.() ?? { po: 0, pa: 0, sc: 0, valueSC: 0 };
context.valeurEquipement = actor.computeValeurEquipement?.() ?? { po: 0, pa: 0, sc: 0, valueSC: 0 };
// Prepare sorcellerie linked actors for display
context.creaturesInvoqueesActors = await this._getLinkedActors(actor.system.sorcellerie.creaturesinvoquees);
context.demonsLiesActors = await this._getLinkedActors(actor.system.sorcellerie.demonslies);
context.enchantementsActors = await this._getLinkedActors(actor.system.sorcellerie.enchantements);
// Prepare enriched HTML for sorcellerie fields
context.enrichedInvocationsEnCours = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
actor.system.sorcellerie?.invocationsencours || "", { async: true }
);
return context;
}
/**
* Get actor objects from UUID references
* @param {string[]} uuids - Array of actor UUIDs
* @returns {Promise<Actor[]>} Array of actor documents
*/
async _getLinkedActors(uuids) {
if (!uuids || !Array.isArray(uuids) || uuids.length === 0) return [];
const actors = [];
for (const uuid of uuids) {
const actor = await fromUuid(uuid);
if (actor) {
actors.push(actor);
}
}
return actors;
}
/**
* Handle actor drop on the sheet
* @override
*/
async _onDropActor(event, data) {
if (!this.document.isOwner) return;
const droppedActor = await Actor.fromDropData(data);
if (!droppedActor) return;
// Only allow dropping Creature type actors
if (droppedActor.type !== 'creature') return;
// Determine which list to add to based on creature subtype
let fieldPath = '';
const subType = droppedActor.system.soustype || 'creature';
switch (subType) {
case 'demon':
fieldPath = 'system.sorcellerie.demonslies';
break;
case 'automata':
fieldPath = 'system.sorcellerie.enchantements';
break;
case 'creature':
default:
fieldPath = 'system.sorcellerie.creaturesinvoquees';
break;
}
// Add the actor UUID to the appropriate array
const currentValue = foundry.utils.getProperty(this.document.system, fieldPath) || [];
// Avoid duplicates
if (!currentValue.includes(droppedActor.uuid)) {
currentValue.push(droppedActor.uuid);
await this.document.update({ [fieldPath]: currentValue });
}
this.render();
}
/**
* Handle removal of a linked actor from sorcellerie sections
* @param {Event} event - The click event
* @param {HTMLElement} target - The clicked element
*/
static async #onRemoveLinkedActor(event, target) {
const li = target.closest(".item");
if (!li) return;
const field = target.dataset.field;
const uuid = target.dataset.uuid;
if (!field || !uuid) return;
const fieldPath = `system.sorcellerie.${field}`;
const currentValue = foundry.utils.getProperty(this.document.system, fieldPath) || [];
// Remove the UUID from the array
const newValue = currentValue.filter(u => u !== uuid);
await this.document.update({ [fieldPath]: newValue });
this.render();
}
/**
* Handle click on linked actor name to open its sheet
* @param {Event} event - The click event
*/
static async #onOpenLinkedActor(event) {
const target = event.target.closest(".linked-actor-name");
if (!target) return;
const uuid = target.dataset.actorUuid;
if (!uuid) return;
const actor = await fromUuid(uuid);
if (actor) {
actor.sheet.render(true);
}
}
/** @override */
_onRender(context, options) {
super._onRender(context, options);
// Add click handler for linked actor names
this.element.querySelectorAll('.linked-actor-name').forEach(el => {
el.addEventListener('click', (event) => {
event.preventDefault();
this.constructor.#onOpenLinkedActor(event);
});
});
}
}