Adds Inventory Management

pull/48/head
macniel 2025-10-03 14:44:26 +02:00
parent 691a811275
commit edf6dcab1a
16 changed files with 620 additions and 34 deletions

View File

@ -9,6 +9,8 @@ import { CharacterSheet } from "./module/sheets/characterSheet.mjs";
import { VornachteilSheet } from "./module/sheets/vornachteilSheet.mjs"; import { VornachteilSheet } from "./module/sheets/vornachteilSheet.mjs";
import {GroupDataModel} from "./module/data/group.mjs"; import {GroupDataModel} from "./module/data/group.mjs";
import {GroupSheet} from "./module/sheets/groupSheet.mjs"; import {GroupSheet} from "./module/sheets/groupSheet.mjs";
import {EquipmentDataModel} from "./module/data/equipment.mjs";
import {AusruestungSheet} from "./module/sheets/equipmentSheet.mjs";
async function preloadHandlebarsTemplates() { async function preloadHandlebarsTemplates() {
return loadTemplates([ return loadTemplates([
@ -17,7 +19,8 @@ async function preloadHandlebarsTemplates() {
'systems/DSA_4-1/templates/ui/partial-attribute-button.hbs', 'systems/DSA_4-1/templates/ui/partial-attribute-button.hbs',
'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs', 'systems/DSA_4-1/templates/ui/partial-talent-editable.hbs',
'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-advantage-button.hbs' 'systems/DSA_4-1/templates/ui/partial-advantage-button.hbs',
'systems/DSA_4-1/templates/ui/partial-array-editor.hbs'
]); ]);
} }
@ -39,7 +42,8 @@ Hooks.once("init", () => {
CONFIG.Item.dataModels = { CONFIG.Item.dataModels = {
Skill: SkillDataModel, Skill: SkillDataModel,
Spell: SpellDataModel, Spell: SpellDataModel,
Advantage: VornachteileDataModel Advantage: VornachteileDataModel,
Equipment: EquipmentDataModel,
} }
CONFIG.Combat.initiative = { CONFIG.Combat.initiative = {
@ -76,7 +80,11 @@ Hooks.once("init", () => {
makeDefault: true, makeDefault: true,
label: 'DSA41.VornachteilLabels.Item' label: 'DSA41.VornachteilLabels.Item'
}) })
Items.registerSheet('dsa41.equipment', AusruestungSheet, {
types: ["Equipment"],
makeDefault: true,
label: 'DSA41.AusruestungLabels.Item'
})
return preloadHandlebarsTemplates(); return preloadHandlebarsTemplates();
}) })

View File

@ -0,0 +1,41 @@
import BaseItem from "./base-item.mjs";
const {
ArrayField, NumberField, StringField, HTMLField
} = foundry.data.fields;
export class EquipmentDataModel extends BaseItem {
static defineSchema() {
return {
quantity: new NumberField({ required: true, integer: true, initial: 1}),
category: new ArrayField(new StringField({ required: true })),
description: new HTMLField(),
weight: new NumberField({ required: true }),
price: new StringField(),
breakFactor: new NumberField({ required: false }),
iniModifier: new NumberField({ required: false }),
attackModifier: new NumberField({ required: false }),
parryModifier: new NumberField({ required: false }),
meleeAttackModifier: new NumberField({ integer: true }),
meleeAttackModifierIncrement: new NumberField({ integer: true }),
meleeSkills: new ArrayField(
new StringField({ required: true }),
),
meleeAttackDamage: new StringField(),
rangedSkills: new ArrayField(
new StringField({ required: true }),
),
rangedRangeModifier: new StringField({ required: false }),
rangeRangeDamageModifier: new StringField({ required: false }),
rangedAttackDamage: new StringField(),
rangedReloadTime: new NumberField({ required: false }),
armorValue: new NumberField({ required: false }),
armorHandicap: new NumberField({ required: false }),
}
}
}

View File

@ -0,0 +1,10 @@
export class Equipment extends Item {
/**
* Augment the basic Item data model with additional dynamic data.
*/
prepareData() {
super.prepareData();
}
}

View File

@ -34,6 +34,7 @@ export class CharacterSheet extends ActorSheet {
this.#addSkillsToContext(context) this.#addSkillsToContext(context)
this.#addAdvantagesToContext(context) this.#addAdvantagesToContext(context)
this.#addAttributesToContext(context) this.#addAttributesToContext(context)
this.#addEquipmentsToContext(context)
return context; return context;
} }
@ -152,6 +153,21 @@ export class CharacterSheet extends ActorSheet {
} }
#addEquipmentsToContext(context) {
context.equipments = [];
const actorData = context.data;
Object.values(actorData.items).forEach( (item, index) => {
if (item.type === "Equipment") {
context.equipments.push({
index: index,
id: item._id,
quantity: item.system.quantity,
name: item.name,
})
}
})
}
prepareEigenschaftRoll(actorData, name) { prepareEigenschaftRoll(actorData, name) {
return actorData.system.attribute[name.toLowerCase()].aktuell return actorData.system.attribute[name.toLowerCase()].aktuell
} }
@ -306,6 +322,11 @@ export class CharacterSheet extends ActorSheet {
evt.stopPropagation(); evt.stopPropagation();
}) })
html.on('click', '.equipment .name', (evt) => {
this.openEmbeddedDocument(evt.target.dataset.id);
evt.stopPropagation();
})
new ContextMenu(html, '.talent.rollable', [ new ContextMenu(html, '.talent.rollable', [
{ {
name: "Entfernen", name: "Entfernen",
@ -357,6 +378,16 @@ export class CharacterSheet extends ActorSheet {
} }
} }
#handleDroppedEquipment(actor, equipment) {
const array = Array.from(actor.items);
for ( let i = 0; i < array.length; i++ ) {
if (array[i].name === equipment.name) { // TODO: adjust item quantity if item is the same
console.log(equipment);
return false;
}
}
}
static getElementByName(collection, id) { static getElementByName(collection, id) {
const array = Array.from(collection); const array = Array.from(collection);
for (const element of array) { for (const element of array) {
@ -380,6 +411,9 @@ export class CharacterSheet extends ActorSheet {
return characterSheet.#handleDroppedSkill(actor, document); // on false cancel this whole operation return characterSheet.#handleDroppedSkill(actor, document); // on false cancel this whole operation
case "Advantage": case "Advantage":
return characterSheet.#handleDroppedAdvantage(actor, document); return characterSheet.#handleDroppedAdvantage(actor, document);
case "Equipment":
return characterSheet.#handleDroppedEquipment(actor, document);
default: default:
return false; return false;
} }

View File

@ -0,0 +1,109 @@
export class AusruestungSheet extends ItemSheet {
/**@override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ['dsa41', 'sheet', 'item', 'equipment'],
width: 520,
height: 480,
tabs: [
{
navSelector: '.sheet-tabs',
contentSelector: '.sheet-body',
initial: 'description',
},
],
});
}
/** @override */
get template() {
return `systems/DSA_4-1/templates/item/item-equipment-sheet.hbs`;
}
/** @override */
getData() {
// Retrieve the data structure from the base sheet. You can inspect or log
// the context variable to see the structure, but some key properties for
// sheets are the actor object, the data object, whether or not it's
// editable, the items array, and the effects array.
const context = super.getData();
// Use a safe clone of the actor data for further operations.
const equipmentData = context.data;
// Add the actor's data to context.data for easier access, as well as flags.
context.system = equipmentData.system;
context.flags = equipmentData.flags;
context.quantity = context.system.quantity;
context.description = context.system.description;
context.categoryAndOptions = {
options: {
Gegenstand: "Gegenstand",
Nahkampfwaffe: "Nahkampfwaffe",
Fernkampfwaffe: "Fernkampfwaffe",
Behälter: "Behälter",
Rüstung: "Rüstung",
},
entries: context.system.category,
targetField: "category"
};
context.isMeleeWeapon = context.system.category.includes("Nahkampfwaffe");
context.isRangedWeapon = context.system.category.includes("Fernkampfwaffe");
context.isContainer = context.system.category.includes("Behälter");
context.isArmor = context.system.category.includes("Rüstung");
context.price = context.system.price;
context.weight = context.system.weight;
context.meleeSkillsAndOptions = {
options: {
"": "",
Dolche: "Dolche",
Fechtwaffen: "Fechtwaffen",
Säbel: "Säbel",
Schwerter: "Schwerter",
Anderthalbhänder: "Anderthalbhänder",
"Zweihandschwerter/-säbel": "Zweihandschwerter/-säbel",
"Infanteriewaffen": "Infanteriewaffen",
"Speere": "Speere",
"Stäbe": "Stäbe",
"Hiebwaffen": "Hiebwaffen",
"Zweihand-Hiebwaffen": "Zweihand-Hiebwaffen",
"Kettenwaffen": "Kettenwaffen",
"Raufen": "Raufen"
},
entries: context.system.meleeSkills,
targetField: "meleeSkills"
}
context.rangedSkillsAndOptions = {
options: {
"": "",
"Wurfmesser": "Wurfmesser",
"Wurfspeer": "Wurfspeer",
"Wurfbeil": "Wurfbeil",
"Armbrust": "Armbrust",
"Bogen": "Bogen",
},
entries: context.system.rangedSkills,
targetField: "rangedSkills"
}
return context;
}
activateListeners(html) {
super.activateListeners(html);
html.on('change', '.array-editor select', (evt) => {
const addingValue = evt.currentTarget.value;
const fieldToTarget = evt.currentTarget.dataset.targetField;
const newSkills = [...this.object.system[fieldToTarget], addingValue];
this.object.update( { system: { [fieldToTarget]: newSkills }} );
evt.currentTarget.value = "";
})
// Everything below here is only needed if the sheet is editable
if (!this.isEditable) return;
}
}

View File

@ -20,49 +20,52 @@ export class GroupSheet extends ActorSheet {
const context = super.getData(); const context = super.getData();
// Use a safe clone of the actor data for further operations. // Use a safe clone of the actor data for further operations.
const skillData = context.data; const groupData = context.data;
// Add the actor's data to context.data for easier access, as well as flags. // Add the actor's data to context.data for easier access, as well as flags.
context.system = skillData.system; context.system = groupData.system;
context.flags = skillData.flags; context.flags = groupData.flags;
context.characters = []; context.characters = [];
for (const characterId of skillData.system.characters) { for (const characterId of groupData.system.characters) {
const character = await game.actors.get(characterId) const character = await game.actors.get(characterId)
context.characters.push( context.characters.push(
{ {
img: character.img, img: character.img,
name: character.name, name: character.name,
id: character._id,
attributes: [ attributes: [
{ name: "MU", value: character.system.attribute.mu.aktuell }, {name: "MU", value: character.system.attribute.mu.aktuell},
{ name: "KL", value: character.system.attribute.kl.aktuell }, {name: "KL", value: character.system.attribute.kl.aktuell},
{ name: "IN", value: character.system.attribute.in.aktuell }, {name: "IN", value: character.system.attribute.in.aktuell},
{ name: "CH", value: character.system.attribute.ch.aktuell }, {name: "CH", value: character.system.attribute.ch.aktuell},
{ name: "FF", value: character.system.attribute.ff.aktuell }, {name: "FF", value: character.system.attribute.ff.aktuell},
{ name: "GE", value: character.system.attribute.ge.aktuell }, {name: "GE", value: character.system.attribute.ge.aktuell},
{ name: "KO", value: character.system.attribute.ko.aktuell }, {name: "KO", value: character.system.attribute.ko.aktuell},
{ name: "KK", value: character.system.attribute.kk.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").map((advantage) => {
return { return {
name: advantage.name, name: advantage.name,
id: advantage._id, id: advantage._id,
value: advantage.system.value, value: advantage.system.value,
} }
}), }),
skills: character.items.filter( (i) => i.type === "Skill").map( (skill) => { skills: character.items.filter((i) => i.type === "Skill").map((skill) => {
return { return {
name: skill.name, name: skill.name,
taw: skill.system.taw, taw: skill.system.taw,
id: skill._id id: skill._id
} }
}), }),
isLimited: character.isOwner || !character.limited,
isVisible: character.isOwner || character.visible,
isOwner: character.isOwner isOwner: character.isOwner
} }
) )
} }
console.log(context.characters) console.log(groupData, context.characters)
return await context; return await context;
} }
@ -76,6 +79,14 @@ export class GroupSheet extends ActorSheet {
if (data.type === "Actor") { if (data.type === "Actor") {
const uuid = await foundry.utils.parseUuid(data.uuid); const uuid = await foundry.utils.parseUuid(data.uuid);
const character = await (game.actors.get(uuid.id)) 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({ await group.update({
system: { system: {
characters: [ characters: [
@ -87,4 +98,29 @@ export class GroupSheet extends ActorSheet {
ui.notifications.info(`${character.name} ist der Heldengruppe ${group.name} beigetreten`) ui.notifications.info(`${character.name} ist der Heldengruppe ${group.name} beigetreten`)
} }
} }
activateListeners(html) {
super.activateListeners(html);
html.on('click', '.owneroption.clickable', async (evt) => {
const dataset = evt.target.dataset;
const group = this.object;
switch (dataset.operation) {
case "removeFromParty":
const charactersWithoutMember = group.system.characters.filter(id => id !== dataset.id)
await group.update({
system: {
characters: charactersWithoutMember
}
})
}
});
html.on('click', '.header.clickable', async (evt) => {
const {id, operation} = evt.currentTarget.dataset;
if (operation === "openActorSheet") {
evt.stopPropagation();
(await game.actors.get(id)).sheet.render(true);
}
})
}
} }

View File

@ -0,0 +1,133 @@
.app.window-app.dsa41.sheet.item.equipment {
.sheet-body {
position: relative;
top: 5px;
.tab.meta.active {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
padding: 4px;
display: grid;
grid-auto-columns: 1fr 1fr;
grid-template-columns: 80px auto;
grid-template-rows: 24px 48px auto 48px;
gap: 0px 0px;
grid-template-areas:
"category category"
"quantity name"
"description description"
"bottomline bottomline";
.name {
grid-area: name;
}
.bottomline {
grid-area: bottomline;
display: grid;
grid-template-columns: repeat(2, 1fr);
.named-value {
position: relative;
height: 48px;
label {
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 80px;
line-height: 24px;
vertical-align: middle;
input {
position: absolute;
left: 80px;
top: 0;
bottom: 0;
right: 0;
}
}
}
}
.category {
grid-area: category;
position: relative;
label {
line-height: 24px;
vertical-align: middle;
}
.array-editor {
position: absolute;
right: 0;
left: 80px;
top: 0;
bottom: 0;
ul {
list-style-type: none;
padding: 0;
margin: 0;
text-indent: 0;
li {
display: inline-block;
border: 1px solid #333;
background-color: rgba(255, 255, 255, 0.2);
border-radius: 12px;
line-height: 24px;
vertical-align: middle;
padding: 0 8px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
}
select {
position: absolute;
right: 0;
top: 0;
}
}
}
.quantity {
grid-area: quantity;
}
.description {
grid-area: description;
position: relative;
label {
height: 14px;
}
.editor {
position: absolute;
top: 14px;
left: 0;
right: 0;
bottom: 0;
border-bottom: 1px inset #333;
}
}
}
}
}

View File

@ -42,6 +42,16 @@
height: 100%; height: 100%;
width: 100%; width: 100%;
&.minimal {
display: unset!important;
.character {
display: inline-block;
margin: 4px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
}
.character { .character {
width: 192px; width: 192px;

View File

@ -2,7 +2,7 @@
@use "./colours"; @use "./colours";
@use "./assets"; @use "./assets";
.dsa41.sheet.actor { .dsa41.sheet {
nav.sheet-tabs.tabs { nav.sheet-tabs.tabs {

View File

@ -5,4 +5,4 @@
@use "_character-sheet"; @use "_character-sheet";
@use "_group-sheet"; @use "_group-sheet";
@use "_tabs"; @use "_tabs";
@use "_equipment-sheet";

View File

@ -101,6 +101,17 @@
} }
}, },
"Item": { "Item": {
"Equipment": {
"stringFields": [
"name", "category"
],
"htmlFields": [
"description"
],
"numberFields": [
"quantity"
]
},
"Advantage": { "Advantage": {
"stringFields": [ "stringFields": [
"name" "name"

View File

@ -67,10 +67,6 @@
</ul> </ul>
</div> </div>
<div class="tab attributes" data-group="primary" data-tab="attributes">
</div>
<div class="tab combat" data-group="primary" data-tab="combat"> <div class="tab combat" data-group="primary" data-tab="combat">
</div> </div>
@ -150,6 +146,15 @@
</div> </div>
<div class="tab backpack" data-group="primary" data-tab="backpack"> <div class="tab backpack" data-group="primary" data-tab="backpack">
<ul>
{{#each equipments}}
<li class="equipment">
<span class="quantity">{{this.quantity}}</span>
<span class="name" data-id="{{this.id}}">{{this.name}}</span>
</li>
{{/each}}
</ul>
</div> </div>
<div class="tab spells" data-group="primary" data-tab="spells"> <div class="tab spells" data-group="primary" data-tab="spells">

View File

@ -16,16 +16,32 @@
{{!-- Sheet Body --}} {{!-- Sheet Body --}}
<section class="sheet-body"> <section class="sheet-body">
<div class="tab characters" data-group="primary" data-tab="characters"> <div class="tab characters" data-group="primary" data-tab="characters">
<div class="characters-overview"> {{#if actor.limited}}
<div class="characters-overview minimal">
{{#each characters}} {{#each characters}}
{{#if this.isVisible}}
<div class="character"> <div class="character">
<div class="header"> <div class="header clickable" data-id="{{this.id}}" data-operation="openActorSheet">
<img class="profile-img" src="{{this.img}}" style="object-fit: cover;" title="{{this.name}}" alt="{{this.name}}"/> <img class="profile-img" src="{{this.img}}" style="object-fit: cover;" title="{{this.name}}" alt="{{this.name}}"/>
<span class="name">{{this.name}}</span> <span class="name">{{this.name}}</span>
</div> </div>
</div>
{{/if}}
{{/each}}
</div>
{{else}}
<div class="characters-overview">
{{#each characters}}
{{#if this.isVisible}}
<div class="character">
<div class="header clickable" data-id="{{this.id}}" data-operation="openActorSheet">
<img class="profile-img" src="{{this.img}}" style="object-fit: cover;" title="{{this.name}}" alt="{{this.name}}"/>
<span class="name">{{this.name}}</span>
</div>
{{#if this.isLimited}}
<div class="mini-attributes"> <div class="mini-attributes">
{{#each this.attributes}} {{#each this.attributes}}
<div class="mini-attribute"> <div class="mini-attribute" data-actor-id="{{actor.id}}" data-attribute="{{this.name}}" data-roll-data="{{this.value}}">
<span class="value">{{this.value}}</span> <span class="value">{{this.value}}</span>
<span class="name">{{this.name}}</span> <span class="name">{{this.name}}</span>
</div> </div>
@ -33,20 +49,23 @@
</div> </div>
<div class="fixedElements"> <div class="fixedElements">
<ul class="inline-list"> <ul class="inline-list">
{{#each skills}}<li class="mini-skill clickable" data-id="{{this.id}}">{{this.name}}: {{this.taw}}</li>{{/each}} {{#each skills}}<li class="mini-skill clickable" data-actor-id="{{this.id}}" data-id="{{this.id}}">{{this.name}}: {{this.taw}}</li>{{/each}}
</ul> </ul>
<ul class="inline-list"> <ul class="inline-list">
{{#each advantages}}<li class="mini-advantage clickable" data-id="{{this.id}}">{{this.name}} {{#if this.value}}[{{this.value}}]{{/if}}</li>{{/each}} {{#each advantages}}<li class="mini-advantage clickable" data-actor-id="{{this.id}}" data-id="{{this.id}}">{{this.name}} {{#if this.value}}[{{this.value}}]{{/if}}</li>{{/each}}
</ul> </ul>
</div> </div>
{{/if}}
{{#if this.isOwner}} {{#if this.isOwner}}
<div class="owneroptions"> <div class="owneroptions">
<button>Leave Group</button> <button class="owneroption clickable" data-operation="removeFromParty" data-id="{{this.id}}">Leave Group</button>
</div> </div>
{{/if}} {{/if}}
</div> </div>
{{/if}}
{{/each}} {{/each}}
</div> </div>
{{/if}}
</div> </div>
<div class="tab inventory" data-group="primary" data-tab="inventory"> <div class="tab inventory" data-group="primary" data-tab="inventory">
</div> </div>

View File

@ -0,0 +1,160 @@
<form class="{{cssClass}} {{item.type}} flexcol" autocomplete="off">
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" style="flex: 0" data-group="primary">
<a class="item" data-tab="meta">Gegenstand</a>
{{#if isMeleeWeapon}}
<a class="item" data-tab="melee">Nahkampfwaffe</a>
{{/if}}
{{#if isRangedWeapon}}
<a class="item" data-tab="ranged">Fernkampfwaffe</a>
{{/if}}
{{#if isContainer}}
<a class="item" data-tab="container">Behälter</a>
{{/if}}
{{#if isArmor}}
<a class="item" data-tab="armor">Rüstung</a>
{{/if}}
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body" style="flex: 1">
<div class="tab meta" data-group="primary" data-tab="meta">
<div class="name">
<label>Name
<input name="name" type="text" value="{{item.name}}" placeholder="Name"/>
</label>
</div>
<div class="quantity">
<label>Anzahl
<input type="number" name="system.quantity"
value="{{quantity}}" />
</label>
</div>
<div class="category"><label>Kategorie:
{{> "systems/DSA_4-1/templates/ui/partial-array-editor.hbs" this.categoryAndOptions}}
</label></div>
<div class="description">
<label>Beschreibungstext</label>
{{editor system.description target="system.description" button=true owner=owner editable=editable}}
</div>
<div class="bottomline">
<label class="named-value"><span>Preis (Silbertaler)</span>
<input type="number" name="system.price" value="{{price}}" />
</label>
<label class="named-value"><span>Gewicht (in Stein)</span>
<input type="number" name="system.weight" value="{{weight}}" />
</label>
</div>
</div>
{{#if isMeleeWeapon}}
<div class="tab melee" data-group="primary" data-tab="melee">
<div>
<label>TP
<input type="text" name="system.meleeAttackDamage" value="{{system.meleeAttackDamage}}" />
</label>
</div>
<div>
<label>TP/KK
<input name="system.meleeAttackModifier" type="number" value="{{system.meleeAttackModifier}}" />
<input name="system.meleeAttackModifierIncrement" type="number" value="{{system.meleeAttackModifierIncrement}}" />
</label>
</div>
<div>
<label>Geführte Talente
{{> "systems/DSA_4-1/templates/ui/partial-array-editor.hbs" this.meleeSkillsAndOptions}}
</label>
</div>
<div>
<label>Initiative
<input name="system.iniModifier" type="number" value="{{system.iniModifier}}" />
</label>
</div>
<div>
<label>Bruchfaktor
<input name="system.breakFactor" type="number" value="{{system.breakFactor}}" />
</label>
</div>
<div>
<label>Attacke
<input name="system.attackModifier" type="number" value="{{system.attackModifier}}" />
</label>
</div>
<div>
<label>Parade
<input name="system.parryModifier" type="number" value="{{system.parryModifier}}" />
</label>
</div>
</div>
{{/if}}
{{#if isRangedWeapon}}
<div class="tab ranged" data-group="primary" data-tab="ranged">
<div>
<label>TP
<input type="text" name="system.rangedAttackDamage" value="{{system.rangedAttackDamage}}" />
</label>
</div>
<div>
<label>Reichweiten
<input type="text" name="system.rangedRangeModifier" value="{{system.rangedRangeModifier}}" />
</label>
</div>
<div>
<label>TP+
<input type="text" name="system.rangeRangeDamageModifier" value="{{system.rangeRangeDamageModifier}}" />
</label>
</div>
<div>
<label>Geführte Talente
{{> "systems/DSA_4-1/templates/ui/partial-array-editor.hbs" this.rangedSkillsAndOptions}}
</label>
</div><div>
<label>Ladedauer (Aktionen)
<input type="text" name="system.rangedReloadTime" value="{{system.rangedReloadTime}}" />
</label>
</div>
</div>
{{/if}}
{{#if isContainer}}
<div class="tab container" data-group="primary" data-tab="container">
Behälter Specs
</div>
{{/if}}
{{#if isArmor}}
<div class="tab armor" data-group="primary" data-tab="armor">
<div>
<label>Gesamt Rüstungswert
<input type="text" name="system.armorValue" value="{{system.armorValue}}" />
</label>
</div>
<div>
<label>Gesamt Behinderung
<input type="text" name="system.armorHandicap" value="{{system.armorHandicap}}" />
</label>
</div>
<div>
<label>Initiative Modifaktor
<input type="text" name="system.iniModifier" value="{{system.iniModifier}}" />
</label>
</div>
<div>
<label>Bruchfaktor
<input type="text" name="system.breakFactor" value="{{system.breakFactor}}" />
</label>
</div>
<div>
<label>Attacke
<input type="text" name="system.attackModifier" value="{{system.attackModifier}}" />
</label>
</div>
<div>
<label>Parade
<input type="text" name="system.parryModifier" value="{{system.parryModifier}}" />
</label>
</div>
</div>
{{/if}}
</section>
</form>

View File

@ -53,9 +53,8 @@
</div> </div>
<div class="tab description" data-group="primary" data-tab="description"> <div class="tab description" data-group="primary" data-tab="description">
<div> <div>
<label>Beschreibungstext <label>Beschreibungstext</label>
{{editor system.text target="system.talent" button=true owner=owner editable=editable}} {{editor system.talent target="system.talent" button=true owner=owner editable=editable}}
</label>
</div> </div>
<div> <div>
<label>Voraussetzung</label> <label>Voraussetzung</label>

View File

@ -0,0 +1,11 @@
<div class="array-editor">
<ul>
{{#each entries}}
<li>{{this}}</li>
{{/each}}
</ul>
<select data-target-field="{{targetField}}">
{{selectOptions options inverted=true}}
</select>
</div>