implements simple filter method for group member' skills and advantages

feature/attribute-rolls
macniel 2025-10-09 23:55:38 +02:00
parent faa3bc1328
commit 169e41d2c8
4 changed files with 78 additions and 42 deletions

View File

@ -1,5 +1,12 @@
const {
SchemaField, NumberField, StringField, EmbeddedDocumentField, DocumentIdField, ArrayField, ForeignDocumentField
SchemaField,
ObjectField,
NumberField,
StringField,
EmbeddedDocumentField,
DocumentIdField,
ArrayField,
ForeignDocumentField
} = foundry.data.fields;
export class GroupDataModel extends foundry.abstract.TypeDataModel {
@ -13,7 +20,8 @@ export class GroupDataModel extends foundry.abstract.TypeDataModel {
}),
characters: new ArrayField(
new DocumentIdField(Actor)
)
),
settings: new ObjectField(),
}
}

View File

@ -15,6 +15,54 @@ export class GroupSheet extends ActorSheet {
});
}
static async onDroppedData(group, sheet, data) {
if (data.type === "Actor") {
const uuid = await foundry.utils.parseUuid(data.uuid);
const character = await (game.actors.get(uuid.id))
// check if character already is part of the group
if (group.system.characters.includes(character._id)) {
ui.notifications.warn(`${character.name} befindet sich bereits in der Heldengruppe ${group.name}`)
return false;
}
// update group
const settings = {...group.system.settings}
character.items.filter((i) => i.type === "Advantage").forEach((advantage) => {
settings[this.#stringToKeyFieldName(advantage.name)] = false
})
character.items.filter((i) => i.type === "Skill").forEach((skill) => {
settings[this.#stringToKeyFieldName(skill.name)] = false
}),
await group.update({
system: {
characters: [
...group.system.characters,
character._id
],
settings: settings
}
})
ui.notifications.info(`${character.name} ist der Heldengruppe ${group.name} beigetreten`)
}
if (data.type === "Equipment") {
const uuid = await foundry.utils.parseUuid(data.uuid);
const equipment = await (game.actors.get(uuid.id))
ui.notifications.info(`${equipment.name} befindet sich nun im Inventar der Heldengruppe ${group.name}`)
return true;
}
}
#stringToKeyFieldName(s) {
return s.replace(/[ \[\]:]/g, "_").toLowerCase()
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/actor/group-sheet.hbs`;
}
/** @override */
async getData() {
const context = super.getData();
@ -25,8 +73,11 @@ export class GroupSheet extends ActorSheet {
// Add the actor's data to context.data for easier access, as well as flags.
context.system = groupData.system;
context.flags = groupData.flags;
context.characters = []
context.characters = [];
context.fields = [];
const hiddenFields = Object.entries(groupData.system.settings).filter(([key, value]) => value === true).map(([key, value]) => key)
for (const characterId of groupData.system.characters) {
const character = await game.actors.get(characterId)
@ -45,14 +96,14 @@ export class GroupSheet extends ActorSheet {
{name: "KO", value: character.system.attribute.ko.aktuell},
{name: "KK", value: character.system.attribute.kk.aktuell},
],
advantages: character.items.filter((i) => i.type === "Advantage").map((advantage) => {
advantages: character.items.filter((i) => i.type === "Advantage").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((advantage) => {
return {
name: advantage.name,
id: advantage._id,
value: advantage.system.value,
}
}),
skills: character.items.filter((i) => i.type === "Skill").map((skill) => {
skills: character.items.filter((i) => i.type === "Skill").filter((i) => hiddenFields.includes(this.#stringToKeyFieldName(i.name))).map((skill) => {
return {
name: skill.name,
taw: skill.system.taw,
@ -66,7 +117,6 @@ export class GroupSheet extends ActorSheet {
)
}
context.equipments = [];
const actorData = context.data;
Object.values(actorData.items).forEach((item, index) => {
@ -84,41 +134,6 @@ export class GroupSheet extends ActorSheet {
return await context;
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/actor/group-sheet.hbs`;
}
static async onDroppedData(group, sheet, data) {
if (data.type === "Actor") {
const uuid = await foundry.utils.parseUuid(data.uuid);
const character = await (game.actors.get(uuid.id))
// check if character already is part of the group
if (group.system.characters.includes(character._id)) {
ui.notifications.warn(`${character.name} befindet sich bereits in der Heldengruppe ${group.name}`)
return false;
}
// update group
await group.update({
system: {
characters: [
...group.system.characters,
character._id
]
}
})
ui.notifications.info(`${character.name} ist der Heldengruppe ${group.name} beigetreten`)
}
if (data.type === "Equipment") {
const uuid = await foundry.utils.parseUuid(data.uuid);
const equipment = await (game.actors.get(uuid.id))
ui.notifications.info(`${equipment.name} befindet sich nun im Inventar der Heldengruppe ${group.name}`)
return true;
}
}
openEmbeddedDocument(documentId) {
this.object.items.get(documentId).sheet.render(true)
}

View File

@ -49,7 +49,9 @@ export class VornachteilSheet extends ItemSheet {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
if (!this.isEditable)
if (!this.isEditable) {
}
}
}

View File

@ -11,6 +11,7 @@
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="characters">Charaktere</a>
<a class="item" data-tab="inventory">Inventar</a>
{{#if owner}}<a class="item" data-tab="settings">Sichtbarkeiten</a>{{/if}}
</nav>
{{!-- Sheet Body --}}
@ -80,6 +81,16 @@
<div class="tab inventory" data-group="primary" data-tab="inventory">
{{> 'systems/DSA_4-1/templates/ui/partial-equipment-group-button.hbs' equipments}}
</div>
{{#if owner}}
<div class="tab settings" data-group="primary" data-tab="settings">
{{#each actor.system.settings}}
<div>
<label><input name="system.settings.{{@key}}" type="checkbox" {{checked this}}> {{@key}}</label>
</div>
{{/each}}
</div>
{{/if}}
</section>
</form>