Merge remote-tracking branch 'origin/main' into feature/spells
commit
02c7f5ad9b
|
|
@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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 = ""
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
<form class="{{cssClass}} {{actor.type}}" autocomplete="off">
|
||||||
|
|
||||||
|
{{!-- Sheet Header --}}
|
||||||
|
<header class="sheet-header">
|
||||||
|
{{!-- Header stuff goes here --}}
|
||||||
|
|
||||||
|
<img src="{{actor.img}}" data-edit="img" title="{{actor.name}}"/>
|
||||||
|
<input type="text" name="name" value="{{actor.name}}" placeholder="Name"/>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{{!-- Sheet Tab Navigation --}}
|
||||||
|
<nav class="sheet-tabs tabs" style="flex: 0" data-group="primary">
|
||||||
|
<a class="item" data-tab="meta">Kopfdaten</a>
|
||||||
|
<a class="item" data-tab="attacks">Attacken</a>
|
||||||
|
<a class="item" data-tab="description">Beschreibung</a>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
{{!-- Sheet Body --}}
|
||||||
|
<section class="sheet-body" style="flex: 1">
|
||||||
|
|
||||||
|
<div class="tab meta" data-group="primary" data-tab="meta">
|
||||||
|
<div>
|
||||||
|
<div class="input">
|
||||||
|
<label for="system.lep.aktuell">Lebenspunkte</label>
|
||||||
|
<input type="text" name="system.lep.aktuell"
|
||||||
|
value="{{actor.system.lep.aktuell}}"/>
|
||||||
|
</div>
|
||||||
|
<div class="input">
|
||||||
|
<label for="system.rs">Rüstungsschutz</label>
|
||||||
|
<input type="text" name="system.rs"
|
||||||
|
value="{{actor.system.rs}}"/>
|
||||||
|
</div>
|
||||||
|
<div class="input">
|
||||||
|
<label for="system.mr">Magieresistenz</label>
|
||||||
|
<input type="text" name="system.mr"
|
||||||
|
value="{{actor.system.mr}}"/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="input compound">
|
||||||
|
<label>Initiative</label>
|
||||||
|
<div class="inline-label">
|
||||||
|
<input type="number" name="system.ini.wuerfel"
|
||||||
|
value="{{actor.system.ini.wuerfel}}"/>
|
||||||
|
<span class="inline">w6 + </span>
|
||||||
|
</div>
|
||||||
|
<input type="number" name="system.ini.aktuell"
|
||||||
|
value="{{actor.system.ini.aktuell}}"/>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="tab attacks" data-group="primary" data-tab="attacks">
|
||||||
|
|
||||||
|
<table class="attacks-table">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Name</th>
|
||||||
|
<th>Attacke</th>
|
||||||
|
<th>Parade</th>
|
||||||
|
<th>Schaden</th>
|
||||||
|
<th></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{#each this.attacks}}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input type="text" name="{{this.namepath}}"
|
||||||
|
value="{{this.name}}"/>
|
||||||
|
</td>
|
||||||
|
<td class="rollable tablecell">
|
||||||
|
<div class="attacks-die die rollable attack" data-actor="{{actor.name}}"
|
||||||
|
data-roll-type="attack" data-roll-name="{{this.name}}" data-roll="1d20<{{this.at}}cs">
|
||||||
|
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
|
||||||
|
</div>
|
||||||
|
<input type="text" name="{{this.atpath}}"
|
||||||
|
value="{{this.at}}"/>
|
||||||
|
</td>
|
||||||
|
<td class="rollable tablecell">
|
||||||
|
<div class="attacks-die die" data-roll-type="parry" data-roll-name="{{this.name}}"
|
||||||
|
data-roll="1d20 + {{this.pa}}">
|
||||||
|
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
|
||||||
|
</div>
|
||||||
|
<input type="text" name="{{this.papath}}"
|
||||||
|
value="{{this.pa}}"/>
|
||||||
|
</td>
|
||||||
|
<td class="rollable tablecell">
|
||||||
|
<div class="attacks-die die" data-roll-type="damage" data-roll-name="{{this.name}}"
|
||||||
|
data-roll="{{this.tp}}">
|
||||||
|
{{> 'systems/DSA_4-1/templates/ui/partial-die.hbs' }}
|
||||||
|
</div>
|
||||||
|
<input type="text" name="{{this.tppath}}"
|
||||||
|
value="{{this.tp}}"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button class="button-inline remove-attack" data-index="{{this.index}}"><i
|
||||||
|
class="fa-solid fa-trash"></i></button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{/each}}
|
||||||
|
</tbody>
|
||||||
|
<tfoot class="editor">
|
||||||
|
<tr>
|
||||||
|
<th colspan="5">Attacke hinzufügen</th>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<input type="text" id="attack_name"/>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
<input type="text" id="attack_at" placeholder="8"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" id="attack_pa" placeholer="12"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<input type="text" id="attack_tp" placeholder="1d6+3"/>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button class="button-inline add-attack"><i class="fa-solid fa-plus"></i></button>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
</tfoot>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="tab description" data-group="primary" data-tab="description">
|
||||||
|
{{editor system.description target="system.description" button=true owner=owner editable=editable}}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</form>
|
||||||
Loading…
Reference in New Issue