Files
fvtt-hawkmoon-cyd/modules/applications/sheets/cellule-sheet.mjs

143 lines
4.4 KiB
JavaScript

import HawkmoonActorSheet from "./base-actor-sheet.mjs"
const __ALLOWED_ITEM_CELLULE = { talent: 1, ressource: 1, contact: 1, equipement: 1, protection: 1, artefact: 1, arme: 1, monnaie: 1 }
export default class HawkmoonCelluleSheet extends HawkmoonActorSheet {
/** @override */
static DEFAULT_OPTIONS = {
...super.DEFAULT_OPTIONS,
classes: [...super.DEFAULT_OPTIONS.classes],
window: {
...super.DEFAULT_OPTIONS.window,
title: "SHEETS.Actor.cellule",
},
actions: {
...super.DEFAULT_OPTIONS.actions,
editActor: HawkmoonCelluleSheet.#onEditActor,
deleteActor: HawkmoonCelluleSheet.#onDeleteActor,
},
}
/** @override */
static PARTS = {
sheet: {
template: "systems/fvtt-hawkmoon-cyd/templates/cellule-sheet.hbs",
},
}
/** @override */
tabGroups = { primary: "talents" }
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
const actor = this.document
// Add cellule-specific data
context.talents = foundry.utils.duplicate(actor.getTalents() || {})
context.ressources = foundry.utils.duplicate(actor.getRessources ? actor.getRessources() : [])
context.contacts = foundry.utils.duplicate(actor.getContacts ? actor.getContacts() : [])
context.members = this.#getMembers()
context.equipements = foundry.utils.duplicate(actor.getEquipments ? actor.getEquipments() : [])
context.artefacts = foundry.utils.duplicate(actor.getArtefacts ? actor.getArtefacts() : [])
context.armes = foundry.utils.duplicate(actor.getWeapons ? actor.getWeapons() : [])
context.monnaies = foundry.utils.duplicate(actor.getMonnaies ? actor.getMonnaies() : [])
context.protections = foundry.utils.duplicate(actor.getArmors ? actor.getArmors() : [])
context.richesse = actor.computeRichesse ? actor.computeRichesse() : 0
context.valeurEquipement = actor.computeValeurEquipement ? actor.computeValeurEquipement() : 0
context.enrichedDescription = await foundry.applications.ux.TextEditor.implementation.enrichHTML(actor.system.description || "", { async: true })
return context
}
/**
* Get members of the cellule with full actor data
* @returns {Array}
* @private
*/
#getMembers() {
let membersFull = []
for (let memberId of this.actor.system.members) {
let actor = game.actors.get(memberId)
if (actor) {
membersFull.push({ name: actor.name, id: actor.id, img: actor.img })
}
}
return membersFull
}
/**
* Override _onDropItem to filter allowed item types for cellule
* @override
*/
async _onDropItem(event, data) {
const item = await fromUuid(data.uuid)
// Check if item type is allowed for cellule
if (!__ALLOWED_ITEM_CELLULE[item.type]) {
ui.notifications.warn(`Le type d'item ${item.type} n'est pas autorisé pour une cellule`)
return false
}
return super._onDropItem(event, data)
}
/**
* Override _onDropActor to handle adding members
* @override
*/
async _onDropActor(event, data) {
const droppedActor = await fromUuid(data.uuid)
if (droppedActor.type !== "personnage") {
ui.notifications.warn("Seuls les personnages peuvent être ajoutés à une cellule")
return false
}
// Check if already a member
const isMember = this.actor.system.members.includes(droppedActor.id)
if (isMember) {
ui.notifications.warn("Ce personnage est déjà membre de cette cellule")
return false
}
// Add member ID
const members = [...this.actor.system.members, droppedActor.id]
await this.actor.update({ "system.members": members })
return true
}
// #region Cellule-specific Actions
/**
* Edit an actor (member)
* @param {Event} event
* @param {HTMLElement} target
* @private
*/
static async #onEditActor(event, target) {
const li = target.closest(".item")
const actorId = li?.dataset.actorId
if (!actorId) return
const actor = game.actors.get(actorId)
if (actor) actor.sheet.render(true)
}
/**
* Delete an actor (remove member)
* @param {Event} event
* @param {HTMLElement} target
* @private
*/
static async #onDeleteActor(event, target) {
const li = target.closest(".item")
const actorId = li?.dataset.actorId
if (actorId) {
const members = this.actor.system.members.filter(id => id !== actorId)
await this.actor.update({ "system.members": members })
}
}
// #endregion
}