143 lines
4.4 KiB
JavaScript
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
|
|
}
|