export default {
_prepareContext: (context, actor, thisObject) => {
const actorData = context.document
context.spells = []
context.system = actorData.system
context.flags = actorData.flags
context.derived = context.document.system
context.originalName = actorData.name
context.name = context.derived.name ?? actorData.name
context.effects = actorData.effects ?? []
context.equipments = []
context.carryingweight = 0
actorData.itemTypes["Equipment"].sort((a, b) => a.sort - b.sort).forEach((item, index) => {
// worn items are halved weight
let effectiveWeight = item.system.weight ?? 0
if (context.document.isWorn(item._id)) {
effectiveWeight = item.system.weight ? item.system.weight / 2 : 0
}
context.equipments.push({
index: index,
id: item._id,
quantity: item.system.quantity,
name: item.name,
icon: item.img ?? "",
weight: item.system.weight,
worn: context.document.isWorn(item._id)
})
context.carryingweight += item.system.quantity * effectiveWeight;
})
context.maxcarryingcapacity = actorData.system.attribute.kk.aktuell
context.carryingpercentage = Math.min((context.carryingweight / context.maxcarryingcapacity) * 100, 100);
context.wealth = 0
actorData.itemTypes["Equipment"].forEach(coin => {
if (coin.system.category.indexOf("Währung") !== -1) {
context.wealth += (coin.system.quantity * coin.system.currencyDenominator)
}
})
const maxSets = 3
const romanNumerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"]
context.sets = []
for (let setIndex = 0; setIndex < maxSets; setIndex++) {
context.sets.push({
tab: "pane" + (setIndex + 1),
label: romanNumerals[setIndex],
index: setIndex,
actorId: actorData.id,
setEquipped: actorData.system.setEquipped === setIndex,
slots: [
{
target: "links",
id: actorData.system.heldenausruestung[setIndex]?.links,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.links)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.links)?.img
},
{
target: "rechts",
id: actorData.system.heldenausruestung[setIndex]?.rechts,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.rechts)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.rechts)?.img
},
{
target: "brust",
id: actorData.system.heldenausruestung[setIndex]?.brust,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.brust)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.brust)?.img
},
{
target: "ruecken",
id: actorData.system.heldenausruestung[setIndex]?.ruecken,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.ruecken)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.ruecken)?.img
},
{
target: "kopf",
id: actorData.system.heldenausruestung[setIndex]?.kopf,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.kopf)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.kopf)?.img
},
{
target: "fernkampf",
id: actorData.system.heldenausruestung[setIndex]?.fernkampf,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.fernkampf)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.fernkampf)?.img
},
{
target: "munition",
id: actorData.system.heldenausruestung[setIndex]?.munition,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.munition)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.munition)?.img
},
{
target: "armlinks",
id: actorData.system.heldenausruestung[setIndex]?.armlinks,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.armlinks)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.armlinks)?.img
},
{
target: "armrechts",
id: actorData.system.heldenausruestung[setIndex]?.armrechts,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.armrechts)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.armrechts)?.img
},
{
target: "bauch",
id: actorData.system.heldenausruestung[setIndex]?.bauch,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.bauch)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.bauch)?.img
},
{
target: "beinlinks",
id: actorData.system.heldenausruestung[setIndex]?.beinlinks,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.beinlinks)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.beinlinks)?.img
},
{
target: "beinrechts",
id: actorData.system.heldenausruestung[setIndex]?.beinrechts,
name: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.beinrechts)?.name,
icon: actorData.items.get(actorData.system.heldenausruestung[setIndex]?.beinrechts)?.img
}
]
})
}
context.selectedTab = thisObject.selectedTab ?? context.sets[0].tab
context.setEquipped = actorData.system.setEquipped
return context
},
_onRender: (context, options, thisObject) => {
new foundry.applications.ux.DragDrop.implementation({
dragSelector: ".inventory-table .equipment",
dropSelector: ".tab",
permissions: {
dragstart: thisObject._canDragStart.bind(thisObject),
drop: thisObject._canDragDrop.bind(thisObject)
},
callbacks: {
dragstart: thisObject._onDragStart.bind(thisObject),
drop: thisObject._onDrop.bind(thisObject),
dragover: thisObject._onDragOver.bind(thisObject)
}
}).bind(thisObject.element);
const tabs = new foundry.applications.ux.Tabs({
navSelector: ".set .tabs.sets",
contentSelector: ".set .tab",
initial: thisObject.actor.system.setEquipped ? "pane" + (thisObject.actor.system.setEquipped + 1) : "pane1",
group: "set-tabs",
callback: (event, tab, tabName) => {
thisObject.selectedTab = tabName
thisObject.element.querySelectorAll(tab._contentSelector).forEach(
(tab) => {
if (tab.dataset["tab"] === tabName) {
tab.classList.add("active")
} else {
tab.classList.remove("active")
}
}
)
}
})
tabs.bind(thisObject.element)
new ContextMenu(
thisObject.element,
".paperdoll .equipped",
[
{
name: "Abrüsten",
icon: '',
callback: (targetElement) => {
const {setId, target} = targetElement.dataset
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
delete updateObject[`system.heldenausruestung.${setId}.${target}`]
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
return thisObject.document.isWorn(itemId)
}
},
], {jQuery: false})
new ContextMenu(
thisObject.element,
".inventory-table .equipment",
[
{
name: "Abrüsten",
icon: '',
callback: (target) => {
const {itemId} = target.dataset
const itemSlot = thisObject.document.isWorn(itemId)
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
delete updateObject[`system.heldenausruestung.${thisObject.document.system.setEquipped}.${itemSlot}`]
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const itemIsWorn = thisObject.document.isWorn(itemId)
return itemIsWorn
}
},
{
name: "Ausrüsten (Munition)",
callback: (target) => {
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
updateObject[`system.heldenausruestung.${thisObject.document.system.setEquipped}.munition`] = target.dataset.itemId
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return !thisObject.document.isWorn(itemId) && item.system.category.indexOf("Munition") != -1
}
},
{
name: "Ausrüsten",
callback: (target) => {
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
// find next unoccupied slot and enter the item
const nextUnoccupiedSlot = Object.entries(updateObject).find(([key, value]) => {
// but not when it is a weapon slot
return value === null
&& key.indexOf(".links") === -1
&& key.indexOf(".rechts") === -1
&& key.indexOf(".fernkampf") === -1
&& key.indexOf(".Munition") === -1
})
updateObject[nextUnoccupiedSlot[0]] = target.dataset.itemId
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return !thisObject.document.isWorn(itemId) && item.system.category.indexOf("Rüstung") != -1
}
},
{
name: "Ausrüsten (Rechte Hand)",
callback: (target) => {
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
updateObject[`system.heldenausruestung.${thisObject.document.system.setEquipped}.rechts`] = target.dataset.itemId
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return !thisObject.document.isWorn(itemId) && item.system.category.indexOf("Nahkampfwaffe") != -1
}
},
{
name: "Ausrüsten (Linke Hand)",
callback: (target) => {
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
updateObject[`system.heldenausruestung.${thisObject.document.system.setEquipped}.links`] = target.dataset.itemId
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return !thisObject.document.isWorn(itemId) && item.system.category.indexOf("Nahkampfwaffe") != -1
}
},
{
name: "Ausrüsten (Fernkampf)",
callback: (target) => {
const updateObject = thisObject.document.getEquipmentSetUpdateObject()
updateObject[`system.heldenausruestung.${thisObject.document.system.setEquipped}.fernkampf`] = target.dataset.itemId
thisObject.document.update(updateObject)
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return !thisObject.document.isWorn(itemId) && item.system.category.indexOf("Fernkampfwaffe") != -1
}
},
{
name: "Aufteilen",
icon: '',
callback: async (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
const previousStackSize = item.system.quantity
const newStackSize = await foundry.applications.api.DialogV2.prompt({
window: {title: "Größe des neuen Stapels"},
content: ``,
ok: {
label: "Aufteilen",
callback: (event, button, dialog) => button.form.elements.size.valueAsNumber
}
});
if (newStackSize) {
const clone = item.clone({
system: {
quantity: newStackSize
}
})
thisObject.document.createEmbeddedDocuments('Item', [clone])
item.update({"system.quantity": previousStackSize - newStackSize})
}
},
condition: (target) => {
const {itemId} = target.dataset
const item = thisObject.document.items.get(itemId)
return item.system.quantity > 1
}
},
{
name: "Aus dem Inventar entfernen",
icon: '',
callback: (target) => {
game.DSA41.socket.executeAsGM("removeFromLootTable", thisObject.document.id, target.dataset.itemId)
},
condition: (target) => {
const {itemId} = target.dataset
return !thisObject.document.isWorn(itemId)
}
}
], {jQuery: false});
},
_getTabConfig: (group) => {
group?.tabs.push({id: "equipment", group: "sheet", label: "Ausrüstung"})
},
template: `systems/DSA_4-1/templates/actor/character/tab-equipment.hbs`
}