From bbfac43c02fb503e094d154c524e21fd7f9e019d Mon Sep 17 00:00:00 2001 From: macniel Date: Sun, 5 Oct 2025 16:00:23 +0200 Subject: [PATCH] adds creature documents and models --- src/module/data/creature.mjs | 31 +++++ src/module/documents/creature.mjs | 28 ++++ src/module/sheets/creatureSheet.mjs | 97 +++++++++++++ src/templates/actor/actor-creature-sheet.hbs | 137 +++++++++++++++++++ 4 files changed, 293 insertions(+) create mode 100644 src/module/data/creature.mjs create mode 100644 src/module/documents/creature.mjs create mode 100644 src/module/sheets/creatureSheet.mjs create mode 100644 src/templates/actor/actor-creature-sheet.hbs diff --git a/src/module/data/creature.mjs b/src/module/data/creature.mjs new file mode 100644 index 00000000..4725e155 --- /dev/null +++ b/src/module/data/creature.mjs @@ -0,0 +1,31 @@ +const { + SchemaField, NumberField, StringField, HTMLField, ArrayField +} = foundry.data.fields; + +export class CreatureDataModel extends foundry.abstract.TypeDataModel { + + static defineSchema() { + + return { + ini: new SchemaField({ + aktuell: new NumberField(), + wuerfel: new NumberField(), + }), + lep: new SchemaField({ + max: new NumberField(), + aktuell: new NumberField(), + }), + mr: new NumberField(), + rs: new NumberField(), + attacks: new ArrayField( + new SchemaField({ + at: new NumberField(), + pa: new NumberField(), + tp: new StringField(), + name: new StringField(), + }), {min: 0}), + description: new HTMLField() + } + } + +} diff --git a/src/module/documents/creature.mjs b/src/module/documents/creature.mjs new file mode 100644 index 00000000..8bfe1165 --- /dev/null +++ b/src/module/documents/creature.mjs @@ -0,0 +1,28 @@ +export class Creature extends Actor { + + /** + * Augment the basic Item data model with additional dynamic data. + */ + prepareData() { + super.prepareData(); + this.prepareEmbeddedDocuments(); + } + + getRollData() { + const data = super.getRollData(); + + console.log(this.type) + + if (this.type !== 'character' && this.type !== 'creature') return; + + // Copy the ability scores to the top level, so that rolls can use + // formulas like `@str.mod + 4`. + if (data.attribute) { + for (let [k, v] of Object.entries(data.attribute)) { + data[k] = foundry.utils.deepClone(v); + } + } + return data; + } + +} diff --git a/src/module/sheets/creatureSheet.mjs b/src/module/sheets/creatureSheet.mjs new file mode 100644 index 00000000..a712b187 --- /dev/null +++ b/src/module/sheets/creatureSheet.mjs @@ -0,0 +1,97 @@ +export class CreatureSheet extends foundry.appv1.sheets.ActorSheet { + /**@override */ + static get defaultOptions() { + return foundry.utils.mergeObject(super.defaultOptions, { + classes: ['dsa41', 'sheet', 'actor', 'creature'], + width: 520, + height: 480, + tabs: [ + { + navSelector: '.sheet-tabs', + contentSelector: '.sheet-body', + initial: 'meta', + }, + ], + }); + } + + /** @override */ + get template() { + return `systems/DSA_4-1/templates/actor/actor-creature-sheet.hbs`; + } + + /** @override */ + getData() { + + const context = super.getData(); + const actorData = context.data; + + context.attacks = []; + + actorData.system.attacks.forEach((attack, index) => { + context.attacks.push({ + namepath: `system.attacks.${index}.name`, + name: attack.name, + atpath: `system.attacks.${index}.at`, + at: attack.at, + papath: `system.attacks.${index}.pa`, + pa: attack.pa, + tppath: `system.attacks.${index}.tp`, + tp: attack.tp, + index: index, + + }) + }) + + + return context; + } + + activateListeners(html) { + super.activateListeners(html); + + // Everything below here is only needed if the sheet is editable + if (!this.isEditable) return; + + html.on('click', '.remove-attack', async (evt) => { + const {index} = evt.target.dataset; + let sans = Array.from(this.object.system.attacks); + sans.splice(index, 1); + await this.object.update({'system.attacks': sans}) + }) + + html.on('click', '.attacks-die.die', async (evt) => { + const {rollType, rollName, roll} = evt.currentTarget.dataset; + let r = new Roll(roll, this.actor.getRollData()); + const label = `${rollType} (${rollName})` + await r.toMessage({ + speaker: ChatMessage.getSpeaker({actor: this.object}), + flavor: label, + rollMode: game.settings.get('core', 'rollMode'), + }); + }) + + html.on('click', '.editor .add-attack', async (evt) => { + const name = evt.target.parentElement.querySelector('#attack_name').value + const at = evt.target.parentElement.querySelector('#attack_at').value + const pa = evt.target.parentElement.querySelector('#attack_pa').value + const tp = evt.target.parentElement.querySelector('#attack_tp').value + + const newAttack = { + name, + at, + pa, + tp + } + + await this.object.update({'system.attacks': [...this.object.system.attacks, newAttack]}) + + evt.target.parentElement.querySelector('#attack_name').value = "" + evt.target.parentElement.querySelector('#attack_at').value = "" + evt.target.parentElement.querySelector('#attack_pa').value = "" + evt.target.parentElement.querySelector('#attack_tp').value = "" + }) + + } + +} diff --git a/src/templates/actor/actor-creature-sheet.hbs b/src/templates/actor/actor-creature-sheet.hbs new file mode 100644 index 00000000..221b9a79 --- /dev/null +++ b/src/templates/actor/actor-creature-sheet.hbs @@ -0,0 +1,137 @@ +
+ + {{!-- Sheet Header --}} +
+ {{!-- Header stuff goes here --}} + + + + +
+ + {{!-- Sheet Tab Navigation --}} + + + {{!-- Sheet Body --}} +
+ +
+
+
+ + +
+
+ + +
+
+ + + +
+
+ +
+ + w6 + +
+ + +
+
+
+
+ + + + + + + + + + + + + {{#each this.attacks}} + + + + + + + + {{/each}} + + + + + + + + + + + + + + + + +
NameAttackeParadeSchaden
+ + +
+ {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} +
+ +
+
+ {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} +
+ +
+
+ {{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }} +
+ +
+ +
Attacke hinzufügen
+ + + + + + + + + + +
+ +
+
+ {{editor system.description target="system.description" button=true owner=owner editable=editable}} + +
+
+