diff --git a/src/module/data/advantage.mjs b/src/module/data/advantage.mjs
index 772859a6..d01faf50 100644
--- a/src/module/data/advantage.mjs
+++ b/src/module/data/advantage.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
ArrayField,
@@ -28,7 +28,7 @@ export class AdvantageDataModel extends BaseItem {
auswahl: new ArrayField(
new SchemaField({
name: new StringField(),
- requirement: new ArrayField(
+ requirements: new ArrayField(
new SchemaField({
attribute: new StringField(),
minValue: new NumberField(),
diff --git a/src/module/data/culture.mjs b/src/module/data/culture.mjs
index 02d5fb11..9df8af77 100644
--- a/src/module/data/culture.mjs
+++ b/src/module/data/culture.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
StringField,
diff --git a/src/module/data/equipment.mjs b/src/module/data/equipment.mjs
index ac1a919e..b815b127 100644
--- a/src/module/data/equipment.mjs
+++ b/src/module/data/equipment.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
ArrayField,
diff --git a/src/module/data/liturgy.mjs b/src/module/data/liturgy.mjs
index 9c67e461..cb7d87d2 100644
--- a/src/module/data/liturgy.mjs
+++ b/src/module/data/liturgy.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
NumberField,
diff --git a/src/module/data/profession.mjs b/src/module/data/profession.mjs
index 34f4490a..d5a34482 100644
--- a/src/module/data/profession.mjs
+++ b/src/module/data/profession.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
BooleanField,
diff --git a/src/module/data/skill.mjs b/src/module/data/skill.mjs
index bee33cb9..b99bb339 100644
--- a/src/module/data/skill.mjs
+++ b/src/module/data/skill.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
DocumentIdField,
diff --git a/src/module/data/specialAbility.mjs b/src/module/data/specialAbility.mjs
index bef85785..43d2d567 100644
--- a/src/module/data/specialAbility.mjs
+++ b/src/module/data/specialAbility.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
BooleanField,
diff --git a/src/module/data/species.mjs b/src/module/data/species.mjs
index 8287199c..008945cc 100644
--- a/src/module/data/species.mjs
+++ b/src/module/data/species.mjs
@@ -1,4 +1,4 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
ArrayField,
diff --git a/src/module/data/spell.mjs b/src/module/data/spell.mjs
index 74e2a154..92e9c8f3 100644
--- a/src/module/data/spell.mjs
+++ b/src/module/data/spell.mjs
@@ -1,7 +1,8 @@
-import BaseItem from "./base-item.mjs";
+import BaseItem from "./baseItem.mjs";
const {
- BooleanField,
+ SchemaField,
+ BooleanField,
NumberField,
ArrayField,
StringField,
@@ -31,7 +32,13 @@ export class SpellDataModel extends BaseItem {
merkmal: new StringField(),
komplexität: new StringField(),
repräsentation: new StringField(),
- info: new StringField()
+ info: new StringField(),
+ varianten: new ArrayField(new SchemaField({
+ name: new StringField(),
+ description: new HTMLField(),
+ mod: new StringField(),
+ limit: new NumberField(),
+ }))
}
}
diff --git a/src/module/dialog/liturgyDialog.mjs b/src/module/dialog/liturgyDialog.mjs
index 3b2f640a..7d7764d6 100644
--- a/src/module/dialog/liturgyDialog.mjs
+++ b/src/module/dialog/liturgyDialog.mjs
@@ -1,4 +1,4 @@
-import {LiturgyData} from "../data/miracle/liturgydata.mjs";
+import {LiturgyData} from "../data/miracle/liturgyData.mjs";
import {Talent} from "../data/talent.mjs";
const {
diff --git a/src/module/dialog/talentDialog.mjs b/src/module/dialog/talentDialog.mjs
index 2c35252e..49723eed 100644
--- a/src/module/dialog/talentDialog.mjs
+++ b/src/module/dialog/talentDialog.mjs
@@ -1,4 +1,3 @@
-import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {Talent} from "../data/talent.mjs";
import {ATTRIBUTE} from "../data/attribute.mjs";
diff --git a/src/module/documents/character.mjs b/src/module/documents/character.mjs
index 4580f1fe..f158a631 100644
--- a/src/module/documents/character.mjs
+++ b/src/module/documents/character.mjs
@@ -1,5 +1,5 @@
-import {LiturgyData} from "../data/miracle/liturgydata.mjs";
-import {Zonenruestung, Zonenwunde, Wunde} from "../data/Trefferzone.js";
+import {LiturgyData} from "../data/miracle/liturgyData.mjs";
+import {Zonenruestung, Zonenwunde, Wunde} from "../data/trefferzone.mjs";
import {PlayerCharacterDataModel} from "../data/character.mjs";
export class Character extends Actor {
diff --git a/src/module/setup/config.mjs b/src/module/setup/config.mjs
index ab6b44c9..d2e9c7e7 100644
--- a/src/module/setup/config.mjs
+++ b/src/module/setup/config.mjs
@@ -4,16 +4,16 @@ import {CreatureDataModel} from "../data/creature.mjs";
import {MerchantDataModel} from "../data/merchant.mjs";
import {SkillDataModel} from "../data/skill.mjs";
import {SpellDataModel} from "../data/spell.mjs";
-import {VornachteileDataModel} from "../data/vornachteile.mjs";
+import {AdvantageDataModel} from "../data/advantage.mjs";
import {EquipmentDataModel} from "../data/equipment.mjs";
import {LiturgyDataModel} from "../data/liturgy.mjs";
import {BlessingDataModel} from "../data/blessing.mjs";
import {SpecialAbilityDataModel} from "../data/specialAbility.mjs";
-import {ActiveEffectDataModel} from "../data/activeeffect.mjs";
+import {ActiveEffectDataModel} from "../data/activeEffect.mjs";
import {ProfessionDataModel} from "../data/profession.mjs";
import {SpeciesDataModel} from "../data/species.mjs";
import {CultureDataModel} from "../data/culture.mjs";
-import {Trefferzone, Wunde, Zonenruestung, Zonenwunde} from "../data/Trefferzone.js";
+import {Trefferzone, Wunde, Zonenruestung, Zonenwunde} from "../data/trefferzone.mjs";
import {RestingDialog} from "../dialog/restingDialog.mjs";
import {BattleDialog} from "../dialog/battleDialog.mjs";
import {Talent} from "../data/talent.mjs";
@@ -50,7 +50,7 @@ function initDataModels(config) {
config.Item.dataModels = {
Skill: SkillDataModel,
Spell: SpellDataModel,
- Advantage: VornachteileDataModel,
+ Advantage: AdvantageDataModel,
Equipment: EquipmentDataModel,
Liturgy: LiturgyDataModel,
Blessing: BlessingDataModel,
diff --git a/src/module/sheets/advantageSheet.mjs b/src/module/sheets/advantageSheet.mjs
index 94c98341..5215a22f 100644
--- a/src/module/sheets/advantageSheet.mjs
+++ b/src/module/sheets/advantageSheet.mjs
@@ -7,10 +7,20 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
position: {width: 520, height: 480},
classes: ['dsa41', 'sheet', 'item', 'advantage'],
tag: 'form',
+ window: {
+ resizable: true
+ },
form: {
submitOnChange: true,
closeOnSubmit: false,
handler: AdvantageSheet.#onSubmitForm
+ },
+ actions: {
+ addRequirement: AdvantageSheet.#addRequirement,
+ removeRequirement: AdvantageSheet.#removeRequirement,
+ addMod: AdvantageSheet.#addMod,
+ removeMod: AdvantageSheet.#removeMod,
+ saveVariant: AdvantageSheet.#saveVariant
}
}
@@ -23,6 +33,7 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
}
}
+
/** @inheritDoc */
static PARTS = {
form: {
@@ -30,9 +41,14 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
},
advantage: {
template: `systems/DSA_4-1/templates/item/advantage/tab-advantage.hbs`
+ },
+ variants: {
+ template: `systems/DSA_4-1/templates/ui/tab-variants.hbs`
}
}
+ static _instance = null
+
_configureRenderOptions(options) {
super._configureRenderOptions(options)
@@ -43,6 +59,173 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
return options
}
+ constructor(...args) {
+ super(...args);
+ AdvantageSheet._instance = this
+ }
+
+ static async #addRequirement(event, target) {
+ const selections =
+ "" +
+ "" +
+ "" +
+ "" +
+ ""
+
+ const type = await foundry.applications.api.DialogV2.prompt({
+ window: {title: "Neue Voraussetzung"},
+ content: ``,
+ ok: {
+ label: `Hinzufügen`,
+ callback: (event, button, dialog) => button.form.elements.type.value
+ }
+ });
+
+ if (type) {
+ let newReq = {}
+ switch (type) {
+ case 'talentMin':
+ newReq = {
+ talent: 'Klettern',
+ minValue: '0'
+ }
+ break;
+ case 'talentMax':
+ newReq = {
+ talent: 'Zechen',
+ maxValue: '0'
+ }
+ break;
+ case 'attributeMin':
+ newReq = {
+ attribute: 'ge',
+ minValue: '0'
+ }
+ break;
+ case 'attributeMax':
+ newReq = {
+ attribute: 'mu',
+ maxValue: '0'
+ }
+ break;
+ case 'compare':
+ newReq = {
+ compare: {
+ ownAttribute: 'ini.aktuell',
+ operation: 'eq',
+ targetAttribute: 'ini.aktuell'
+ }
+ }
+ break;
+
+ }
+
+ const lastIndex = Object.keys(AdvantageSheet._instance._currentSelectedVariant.requirements).length
+ AdvantageSheet._instance._currentSelectedVariant.requirements[lastIndex] = newReq
+ AdvantageSheet._instance.render({parts: ["form", "advantage", "variants"]})
+ }
+ }
+
+ static async #removeRequirement(event, target) {
+
+ const {index} = target.dataset
+
+ if (index) {
+ delete AdvantageSheet._instance._currentSelectedVariant.requirements[index]
+ }
+
+ }
+
+ static async #addMod(event, target) {
+ const selections =
+ "" +
+ "" +
+ "" +
+ ""
+
+ const type = await foundry.applications.api.DialogV2.prompt({
+ window: {title: "Neuer Modifikator"},
+ content: ``,
+ ok: {
+ label: `Hinzufügen`,
+ callback: (event, button, dialog) => button.form.elements.type.value
+ }
+ });
+
+ if (type) {
+ let newReq = {}
+ switch (type) {
+ case 'talent':
+ newReq = {
+ talent: 'Klettern',
+ value: '0'
+ }
+ break;
+ case 'talentGroup':
+ newReq = {
+ talentGruppe: 'Gesellschaft',
+ value: '0'
+ }
+ break;
+ case 'trait':
+ newReq = {
+ merkmal: 'Elementar',
+ value: '0'
+ }
+ break;
+ case 'attribute':
+ newReq = {
+ name: 'ge',
+ value: '0'
+ }
+ break;
+ }
+
+ const lastIndex = Object.keys(AdvantageSheet._instance._currentSelectedVariant.mod).length
+ AdvantageSheet._instance._currentSelectedVariant.mod[lastIndex] = newReq
+ AdvantageSheet._instance.render({parts: ["form", "advantage", "variants"]})
+ }
+ }
+
+ static async #removeMod(event, target) {
+
+ const {index} = target.dataset
+
+ if (index) {
+ delete AdvantageSheet._instance._currentSelectedVariant.mod[index]
+ }
+ }
+
+ static async #saveVariant(event, target) {
+ /**
+ * @type {HTMLFormElement}
+ */
+ const form = AdvantageSheet._instance.form
+
+ let flattenObject = {}
+
+ Object.values(form).forEach(input => {
+ if (input.name.startsWith('mod') || input.name.startsWith('requirements')) {
+ flattenObject[`${input.name}`] = input.value
+ }
+ if (input.name === "vName") {
+ flattenObject[`name`] = input.value
+ }
+ })
+
+
+ let auswahl = AdvantageSheet._instance.document.system.auswahl
+
+ const fo = foundry.utils.expandObject(flattenObject)
+ auswahl[AdvantageSheet._instance._currentSelectedVariantIndex] = {
+ name: fo.name,
+ mod: Object.values(fo.mod),
+ requirements: Object.values(fo.requirements)
+ }
+
+ AdvantageSheet._instance.document.update({system: {auswahl}})
+ }
+
/**
* Handle form submission
* @this {AdvantageSheet}
@@ -52,10 +235,32 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
*/
static async #onSubmitForm(event, form, formData) {
event.preventDefault()
+ if (!form.querySelector('.tab.advantage.active')) {
+ const obj = foundry.utils.expandObject(formData.object)
- await this.document.update(formData.object) // Note: formData.object
+ if (obj.mod) this._currentSelectedVariant.mod = obj.mod
+ if (obj.vName) this._currentSelectedVariant.name = obj.vName
+ if (obj.requirements) this._currentSelectedVariant.requirements = obj.requirements
- console.log(formData.object, this.document)
+ } else {
+ delete formData.object.mod
+ delete formData.object.vName
+ delete formData.object.requirements
+ delete formData.object.variant
+ await this.document.update(formData.object) // Note: formData.object
+ }
+
+ this.render({parts: ["form", "advantage", "variants"]})
+ }
+
+ _getTabsConfig(group) {
+ const tabs = foundry.utils.deepClone(super._getTabsConfig(group))
+
+ if (this.document.system.auswahl) {
+ tabs.tabs.push({id: 'variants', group: 'sheet', label: 'Varianten'})
+ }
+
+ return tabs
}
/** @override */
@@ -71,7 +276,34 @@ export class AdvantageSheet extends HandlebarsApplicationMixin(DocumentSheetV2)
context.choices[a.name] = a.name
})
context.hasModality = context.system.value != null
+ context.name = advantageData.name
+ context.variantChoices = {}
+ context.variants = []
+
+ advantageData.system.auswahl?.forEach(variant => {
+ context.variantChoices[variant.name] = variant.name
+ context.variants.push(variant)
+ })
+ context.currentSelectedVariantName = this._currentSelectedVariant?.name
+ context.currentSelectedVariant = this._currentSelectedVariant
+ context.currentSelectedVariantIndex = this._currentSelectedVariantIndex
return context;
}
+
+ _onRender(context, options) {
+ if (this._selectedVariant == null) {
+ this._selectedVariant = this.document.system.auswahl[0].name
+ this._currentSelectedVariant = this.document.system.auswahl?.find(p => p.name === this._selectedVariant)
+ this._currentSelectedVariantIndex = this.document.system.auswahl?.findIndex(p => p.name === this._selectedVariant)
+ }
+ this.element.querySelector('select[name="variant"]').addEventListener('change', (event, target) => {
+ if (event.target.value != this._selectedVariant) {
+ this._selectedVariant = event.target.value
+ this._currentSelectedVariant = this.document.system.auswahl?.find(p => p.name === this._selectedVariant)
+ this._currentSelectedVariantIndex = this.document.system.auswahl?.findIndex(p => p.name === this._selectedVariant)
+ }
+ })
+ }
+
}
diff --git a/src/module/sheets/character/liturgies.mjs b/src/module/sheets/character/liturgies.mjs
index e32e3f85..c51cab64 100644
--- a/src/module/sheets/character/liturgies.mjs
+++ b/src/module/sheets/character/liturgies.mjs
@@ -1,4 +1,4 @@
-import {LiturgyData} from "../../data/miracle/liturgydata.mjs";
+import {LiturgyData} from "../../data/miracle/liturgyData.mjs";
export default {
_prepareContext: (context) => {
diff --git a/src/module/sheets/specialAbilitySheet.mjs b/src/module/sheets/specialAbilitySheet.mjs
index 7a8e5143..2c944636 100644
--- a/src/module/sheets/specialAbilitySheet.mjs
+++ b/src/module/sheets/specialAbilitySheet.mjs
@@ -12,9 +12,15 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee
closeOnSubmit: false,
handler: SpecialAbilitySheet.#onSubmitForm
},
+ actions: {
+ addRequirement: SpecialAbilitySheet.#addRequirement,
+ removeRequirement: SpecialAbilitySheet.#removeRequirement,
+ addMod: SpecialAbilitySheet.#addMod,
+ removeMod: SpecialAbilitySheet.#removeMod,
+ saveVariant: SpecialAbilitySheet.#saveVariant
+ }
}
-
static TABS = {
sheet: {
tabs: [
@@ -32,8 +38,13 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee
specialability: {
template: `systems/DSA_4-1/templates/item/specialability/tab-specialability.hbs`
},
+ variants: {
+ template: `systems/DSA_4-1/templates/ui/tab-variants.hbs`
+ }
}
+ _instance = null
+
_configureRenderOptions(options) {
super._configureRenderOptions(options)
@@ -44,6 +55,173 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee
return options
}
+ constructor(...args) {
+ super(...args);
+ SpecialAbilitySheet._instance = this
+ }
+
+ static async #addRequirement(event, target) {
+ const selections =
+ "" +
+ "" +
+ "" +
+ "" +
+ ""
+
+ const type = await foundry.applications.api.DialogV2.prompt({
+ window: {title: "Neue Voraussetzung"},
+ content: ``,
+ ok: {
+ label: `Hinzufügen`,
+ callback: (event, button, dialog) => button.form.elements.type.value
+ }
+ });
+
+ if (type) {
+ let newReq = {}
+ switch (type) {
+ case 'talentMin':
+ newReq = {
+ talent: 'Klettern',
+ minValue: '0'
+ }
+ break;
+ case 'talentMax':
+ newReq = {
+ talent: 'Zechen',
+ maxValue: '0'
+ }
+ break;
+ case 'attributeMin':
+ newReq = {
+ attribute: 'ge',
+ minValue: '0'
+ }
+ break;
+ case 'attributeMax':
+ newReq = {
+ attribute: 'mu',
+ maxValue: '0'
+ }
+ break;
+ case 'compare':
+ newReq = {
+ compare: {
+ ownAttribute: 'ini.aktuell',
+ operation: 'eq',
+ targetAttribute: 'ini.aktuell'
+ }
+ }
+ break;
+
+ }
+
+ const lastIndex = Object.keys(SpecialAbilitySheet._instance._currentSelectedVariant.requirements).length
+ SpecialAbilitySheet._instance._currentSelectedVariant.requirements[lastIndex] = newReq
+ SpecialAbilitySheet._instance.render({parts: ["form", "advantage", "variants"]})
+ }
+ }
+
+ static async #removeRequirement(event, target) {
+
+ const {index} = target.dataset
+
+ if (index) {
+ delete SpecialAbilitySheet._instance._currentSelectedVariant.requirements[index]
+ }
+
+ }
+
+ static async #addMod(event, target) {
+ const selections =
+ "" +
+ "" +
+ "" +
+ ""
+
+ const type = await foundry.applications.api.DialogV2.prompt({
+ window: {title: "Neuer Modifikator"},
+ content: ``,
+ ok: {
+ label: `Hinzufügen`,
+ callback: (event, button, dialog) => button.form.elements.type.value
+ }
+ });
+
+ if (type) {
+ let newReq = {}
+ switch (type) {
+ case 'talent':
+ newReq = {
+ talent: 'Klettern',
+ value: '0'
+ }
+ break;
+ case 'talentGroup':
+ newReq = {
+ talentGruppe: 'Gesellschaft',
+ value: '0'
+ }
+ break;
+ case 'trait':
+ newReq = {
+ merkmal: 'Elementar',
+ value: '0'
+ }
+ break;
+ case 'attribute':
+ newReq = {
+ name: 'ge',
+ value: '0'
+ }
+ break;
+ }
+
+ const lastIndex = Object.keys(SpecialAbilitySheet._instance._currentSelectedVariant.mod).length
+ SpecialAbilitySheet._instance._currentSelectedVariant.mod[lastIndex] = newReq
+ SpecialAbilitySheet._instance.render({parts: ["form", "advantage", "variants"]})
+ }
+ }
+
+ static async #removeMod(event, target) {
+
+ const {index} = target.dataset
+
+ if (index) {
+ delete SpecialAbilitySheet._instance._currentSelectedVariant.mod[index]
+ }
+ }
+
+ static async #saveVariant(event, target) {
+ /**
+ * @type {HTMLFormElement}
+ */
+ const form = AdvantageSheet._instance.form
+
+ let flattenObject = {}
+
+ Object.values(form).forEach(input => {
+ if (input.name.startsWith('mod') || input.name.startsWith('requirements')) {
+ flattenObject[`${input.name}`] = input.value
+ }
+ if (input.name === "vName") {
+ flattenObject[`name`] = input.value
+ }
+ })
+
+
+ let auswahl = SpecialAbilitySheet._instance.document.system.auswahl
+
+ const fo = foundry.utils.expandObject(flattenObject)
+ auswahl[AdvantageSheet._instance._currentSelectedVariantIndex] = {
+ name: fo.name,
+ mod: Object.values(fo.mod),
+ requirements: Object.values(fo.requirements)
+ }
+
+ SpecialAbilitySheet._instance.document.update({system: {auswahl}})
+ }
+
/**
* Handle form submission
* @this {EquipmentSheet}
@@ -53,8 +231,32 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee
*/
static async #onSubmitForm(event, form, formData) {
event.preventDefault()
+ if (!form.querySelector('.tab.specialability.active')) {
+ const obj = foundry.utils.expandObject(formData.object)
- await this.document.update(formData.object) // Note: formData.object
+ if (obj.mod) this._currentSelectedVariant.mod = obj.mod
+ if (obj.vName) this._currentSelectedVariant.name = obj.vName
+ if (obj.requirements) this._currentSelectedVariant.requirements = obj.requirements
+
+ } else {
+ delete formData.object.mod
+ delete formData.object.vName
+ delete formData.object.requirements
+ delete formData.object.variant
+ await this.document.update(formData.object) // Note: formData.object
+ }
+
+ this.render({parts: ["form", "specialability", "variants"]})
+ }
+
+ _getTabsConfig(group) {
+ const tabs = foundry.utils.deepClone(super._getTabsConfig(group))
+
+ if (this.document.system.auswahl) {
+ tabs.tabs.push({id: 'variants', group: 'sheet', label: 'Varianten'})
+ }
+
+ return tabs
}
/** @override */
@@ -82,7 +284,35 @@ export class SpecialAbilitySheet extends HandlebarsApplicationMixin(DocumentShee
})
context.hasModality = context.system.value != null
+ context.name = specialabilityData.name
+ context.variantChoices = {}
+ context.variants = []
+
+ specialabilityData.system.auswahl?.forEach(variant => {
+ context.variantChoices[variant.name] = variant.name
+ context.variants.push(variant)
+ })
+ context.currentSelectedVariantName = this._currentSelectedVariant?.name
+ context.currentSelectedVariant = this._currentSelectedVariant
+ context.currentSelectedVariantIndex = this._currentSelectedVariantIndex
+
+
return context;
}
+ _onRender(context, options) {
+ if (this._selectedVariant == null) {
+ this._selectedVariant = this.document.system.auswahl[0].name
+ this._currentSelectedVariant = this.document.system.auswahl?.find(p => p.name === this._selectedVariant)
+ this._currentSelectedVariantIndex = this.document.system.auswahl?.findIndex(p => p.name === this._selectedVariant)
+ }
+ this.element.querySelector('select[name="variant"]').addEventListener('change', (event, target) => {
+ if (event.target.value != this._selectedVariant) {
+ this._selectedVariant = event.target.value
+ this._currentSelectedVariant = this.document.system.auswahl?.find(p => p.name === this._selectedVariant)
+ this._currentSelectedVariantIndex = this.document.system.auswahl?.findIndex(p => p.name === this._selectedVariant)
+ }
+ })
+ }
+
}
diff --git a/src/module/xml-import/xml-import.mjs b/src/module/xml-import/xml-import.mjs
index ee3f3757..1fdaa9b3 100644
--- a/src/module/xml-import/xml-import.mjs
+++ b/src/module/xml-import/xml-import.mjs
@@ -1,4 +1,4 @@
-import {LiturgyData} from "../data/miracle/liturgydata.mjs";
+import {LiturgyData} from "../data/miracle/liturgyData.mjs";
import {Blessing} from "../documents/blessing.mjs";
import {Profession} from "../documents/profession.mjs";
import {Culture} from "../documents/culture.mjs";
diff --git a/src/packs/_source/zauber/Abvenenum.json b/src/packs/_source/zauber/Abvenenum.json
index faa03b1f..686d025c 100644
--- a/src/packs/_source/zauber/Abvenenum.json
+++ b/src/packs/_source/zauber/Abvenenum.json
@@ -10,23 +10,34 @@
"technik": "Der Elf spricht bha’sama venya bha’za yalza über die zu reinigende Nahrung.",
"zauberdauer": "mindestens 15 Aktionen",
"wirkung": "Der Zauber reinigt Nahrungsmittel und Ge tränke von sämtlichen Giften und Krankheitskeimen; verdorbene Nahr ung wird frisch und genießbar. Die Zauberprobe ist um die doppelte Stufe des Giftes oder der beim Verzehr zu befürchtenden Krankheit erschwert. Verdorbene Nahrung kann je nach Zustand einen Zuschlag von 2 bis 12 Punkten auf die Probe bedeuten. Dieser Zauber versetzt Nahrung in einen Zustand, die dem Spruchanwender nicht gefährlich werden kann. Da es aber von dem Entwickler des Spruches abhängt, in welchem Zustand Nahrung als gefährlich angesehen werden muss und in welchem nicht, variiert die genaue Wirkung je nach Repräsentation recht erheblich. So wandelt die elfische Repräsentation selbst Wein in Traubensaft um, während die Achazform des Spruches manche für Menschen und Elfen giftige Mahlzeiten unverändert lässt. Gift, das sich nicht in Nahrung befindet, wird von dem Zauber nicht als solches erkannt, weswegen das Gift auf der Klinge eines Meuchlers oder in der Phiole eines Alchimisten nicht verändert wird. Wenn allerdings zum Beispiel in einer Pilzpfanne giftige Pilze enthalten sind, dann wirkt der Zauber sehr wohl.",
- "kosten": "4 AsP pro Mahlzeit, die für etwa 10 Personen reicht (Sch: 3 AsP)",
+ "kosten": [
+ {
+ "cost": 4,
+ "herkunft": ""
+ },
+ {
+ "cost": 3,
+ "herkunft": "Scharlartan"
+ }
+ ],
"zielobjekt": "Nahrungsmenge (mehrere Objekte) nach AsP-Aufwand",
"reichweite": "1 Schritt",
"wirkungsdauer": "augenblicklich",
"modifikationen": "Zauberdauer, Reichweite",
- "varianten": {
- "Schutz vor Übelkeit": {
+ "varianten": [
+ {
+ "name": "Schutz vor Übelkeit",
"description": "Nahrung, die an sich nicht giftig ist, deren Genuss aber heftige Übelkeit erzeugt, wird in einen Zustand versetzt, der als harmlos gelten kann. So ist es zum Beispiel möglich, auch Meerwasser in Trinkwasser zu verwandeln. Horasische Sahnetorten werden jedoch nur von den wenigsten Repräsentationen in Mitleidenschaft gezogen.",
"mod": "+5",
"limit": ""
},
- "Schutz vor Vergiftung": {
+ {
+ "name": "Schutz vor Vergiftung",
"description": "Bewahrt die Nahrung für die nächsten ZfP* Stunden vor jeglicher in diesem Zeitraum geschehener Vergiftung und jedem Verschimmeln oder Verderben. Der Zaubernde muss sich hierbei selbst einen Aufschlag auf die Zauberprobe auferlegen, und zwar in Höhe der Stufe der Krankheit/des Giftes, gegen die der Schutz höchstens wirksam sein soll. Eine bereits vergiftete Speise wird dabei entgiftet.Vereinzelt existieren eingeschränkte Variationen dieses Spruches, die (bei geringerem Probenaufschlag und AsP-Aufwand) nur gegen gewisse Giftgruppen (Schlangengifte) oder gar nur gegen einzelne Gifte und Krankheiten wirken.",
"mod": "+5",
"limit": ""
}
- },
+ ],
"reversalis": "bewirkt das schlagartige Verfaulen und Verschimmeln von L ebensmitteln.",
"antimagie": "kann in einer Zone des OBJEKT ENTZAUBERN nur erschwert gesprochen wer den; lässt sich wegen der Wirkungsdauer augenblicklich nicht mittels Antimagie widerrufen.",
"merkmal": "Objekt",
diff --git a/src/packs/_source/zauber/Accuratum.json b/src/packs/_source/zauber/Accuratum.json
index 3a0ea7c5..94347069 100644
--- a/src/packs/_source/zauber/Accuratum.json
+++ b/src/packs/_source/zauber/Accuratum.json
@@ -10,38 +10,48 @@
"technik": "Die Magierin streicht über ihr Gewand, konzentriert sich auf die Eigenschaften des Stoffes und die Möglichkeiten der Wandlung desselben und murmelt dabei die Formel.",
"zauberdauer": "40 Aktionen",
"wirkung": "Farbe und Schnitt (nicht jedoch die Art des Stoffs) eines Kleidungsstücks können sich mit diesem Formel nach Wunsch der Magierin ändern. Die Zaubernde muss eine recht genaue Vorstellung vom Endergebnis besitzen, genaue Kenntnisse des Schneiderhandwerks sind jedoch nicht erforderlich, aber nützlich. Die Hälfte der TaP* einer – gedanklich ausgeführten – Schneidern-Probe erleichtern die Zauberprobe um den entsprechenden Betrag. Bei besonders gewagten Kreationen kann der Meister auf die Zauberprobe Zuschläge bis zu +7 verlangen. Die ZfP* geben die künstlerisch-handwerkliche Qualität des Kleidungsstücks an, wobei Werte über 10 für meisterliche Arbeit stehen.",
- "kosten": "4 AsP pro Stein Gewicht des Kleidungsstücks, mindestens aber 7 AsP",
+ "kosten": [
+ {
+ "cost": 7,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelobjekt",
"reichweite": "Berührung",
"wirkungsdauer": "bis zur nächsten Wintersonnenwende",
"modifikationen": "Zauberdauer, Kosten",
- "varianten": {
- "Nadel des Wanderers": {
+ "varianten": [
+ {
+ "name": "Nadel des Wanderers",
"description": "Wenn ein bereits mit ACCURATUM geformtes Kleidungsstück einmal einreißt, einer hungrigen Motte als Nahrung dient oder durchzuschleuern droht, kann mit dieser Variante für 3 AsP die betroffene Stelle ausgebessert werden. Erzielt man dabei mindestens halb so viele ZfP* wie bei der Herstellung, so ist die Reparatur kaum zu bemerken.",
"mod": "+3",
"limit": ""
},
- "Ohne Schere": {
+ {
+ "name": "Ohne Schere",
"description": "Es ist möglich, ein rohe Stoffbahn benötigter Größe in ein Kleidungsstück zu verwandeln.",
"mod": "+3",
"limit": ""
},
- "Haltbarkeit": {
+ {
+ "name": "Haltbarkeit",
"description": "Für den Einsatz von 7 AsP pro Stein Gewicht wird die Verwandlung dauerhaft.",
"mod": "+3",
"limit": ""
},
- "Webstuhl": {
+ {
+ "name": "Webstuhl",
"description": "Die Magierin kann das Kleidungsstück aus der nötigen Menge Garn herstellen, was jedoch eine gute Stunde Arbeit bedeutet.",
"mod": "+7",
"limit": "11"
},
- "Sackleinen und Spinnenseide": {
+ {
+ "name": "Sackleinen und Spinnenseide",
"description": "Die Magierin kann mit dieser Variante eine Stoffart in eine andere verwandeln (z. B. Leinen in Seide). Fell und Leder sind jedoch von solchen Verwandlungen ausgenommen. Nicht mit Haltbarkeit kombinierbar.",
"mod": "+7",
"limit": "14"
}
- },
+ ],
"reversalis": "bewirkt die Aufhebung eines bestehenden ACCURATUM oder verwandelt ein normales Kleidungsstück in unzusammenhängende Stoffbahnen, Fetzen und Fäden.",
"antimagie": "kann in einer Zone des OBJEKT ENTZAUBERN nur erschwert gewirkt und mit diesem Antimagie-Spruch beendet werden (gilt nicht für die Variante Haltbarkeit).",
"merkmal": "Objekt",
diff --git a/src/packs/_source/zauber/Adamantium.json b/src/packs/_source/zauber/Adamantium.json
index 54708882..3cbb2bda 100644
--- a/src/packs/_source/zauber/Adamantium.json
+++ b/src/packs/_source/zauber/Adamantium.json
@@ -10,38 +10,48 @@
"technik": "Der Kristallomant fährt mit einem Smaragd mehrmals über den zu verzaubernden Gegenstand.",
"zauberdauer": "40 Aktionen",
"wirkung": "Die Struktur des verzauberten Gegenstands wird gefestigt. Er wird hart wie ein Diamant und unbezwingbar wie ein Amboss. In der Regel bedeutet das: Strukturpunkte und Härte werden verdreifacht (Härte von 0 bleibt 0). Schadenausbeute wie ein SIGNIFIKATUS kann dem Objekt nur Schaden zufügen, wenn die angerichteten SP mindestens ein Drittel der Strukturpunkte betragen. Da die Formel ihre Kraft aus der Essenz des Gegenstandes zieht, wird dieser nach Ablauf der Wirkungsdauer ungewöhnlich zerbrechlich (Strukturpunkte und Härte halbiert).",
- "kosten": "5 AsP + 2 AsP pro angefangenen Stein Gewicht",
+ "kosten": [
+ {
+ "cost": 5,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelobjekt",
"reichweite": "Berührung",
"wirkungsdauer": "ZfP* Spielrunden; die negativen Nachwirkungen sind ablaufbedingt",
"modifikationen": "Zauberdauer, Kosten, Reichweite, Wirkungsdauer",
- "varianten": {
- "Adamantladung": {
+ "varianten": [
+ {
+ "name": "Adamantladung",
"description": "Kann ein fünffaches Gewicht verzaubern. Hält 15 Tage. Kosten: 15 AsP + 2 AsP pro Stein Gewicht.",
"mod": "+5",
"limit": ""
},
- "Kristallglanz": {
+ {
+ "name": "Kristallglanz",
"description": "Der verzauberte Gegenstand erhält eine zusätzliche Oberfläche, die wie ein anderes Metall, Gestein oder Kristall wirkt. Rein optische Komponente.",
"mod": "+3",
"limit": "7"
},
- "Zauberstahl": {
+ {
+ "name": "Zauberstahl",
"description": "Eine Variante mit zusätzlichen Elementarkräften, die für Waffen und Rüstungen entwickelt wurde. Bruchfaktor einer Waffe oder eines Schildes sinkt um ZfP* Punkte, TP steigen um ZfP*/3, RS einer verzauberten Rüstung oder TP eines Geschosses/Wurfwaffe um ZfP*/4. Nach Ablauf kehrt sich der Bonus ins Gegenteil.",
"mod": "+5",
"limit": "7"
},
- "Struktur wahren": {
+ {
+ "name": "Struktur wahren"
"description": "Der Zauber wird so modifiziert, dass er keine Kraft aus der Struktur des Materials zieht, sondern das Material nur stabilisiert. Kosten: 7 AsP + 4 AsP pro Stein Gewicht.",
"mod": "+7",
"limit": "11"
},
- "Permanent": {
+ {
+ "name": "Permanent"
"description": "Der Gegenstand wird dauerhaft gefestigt. Erfordert 1 permanenten AsP pro angefangenen Stein Gewicht. (Nur in kristallomantischer Repräsentation möglich.)",
"mod": "+7",
"limit": "11"
}
- },
+ ],
"reversalis": "Erzeugt am Gegenstand einen Zerfallsfluch wie beim EISENROST.",
"antimagie": "OBJEKT ENTZAUBERN und ERZBANN wirken in ihren Varianten gegen ADAMANTIUM. Bei den Zauberstahl-Varianten wie beim ARMATRUTZ.",
"merkmal": "Objekt, Elementar (Erz)",
diff --git a/src/packs/_source/zauber/AdleraugeLuchsenohr.json b/src/packs/_source/zauber/AdleraugeLuchsenohr.json
index 9ce967b7..2ee8fcd9 100644
--- a/src/packs/_source/zauber/AdleraugeLuchsenohr.json
+++ b/src/packs/_source/zauber/AdleraugeLuchsenohr.json
@@ -10,18 +10,24 @@
"technik": "Die Elfe legt die Hände an die Schläfen und konzentriert sich auf die Melodie des a'dao bunda visya'roel.",
"zauberdauer": "5 Aktionen",
"wirkung": "Das gesamte Wahrnehmungsvermögen der Zaubernden (alle fünf Sinne) wird so stark verbessert, dass alle Proben auf das Talent Sinnesschärfe um ZfP* Punkte erleichtert werden. Man kann auf große Distanz feinste Geräusche, Gerüche oder Bewegungen wahrnehmen. Der Zauber ermöglicht keine Nachtsicht, aber verstärkt tatsächlich vorhandene Sinneswahrnehmung. Geschärfte Sinne können zu Desorientierung führen, wenn plötzliche Reize auftreten (Selbstbeherrschungs-Probe nötig). Mit ADLERAUGE können auch andere Sinneszauber wie KATZENAUGEN (Nachtsicht) oder WARMES BLUT (Wärmesicht) verstärkt werden.",
- "kosten": "4 AsP",
+ "kosten": [
+ {
+ "cost": 4,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelperson, freiwillig",
"reichweite": "selbst",
"wirkungsdauer": "1 Spielrunde (A)",
"modifikationen": "Zauberdauer, Reichweite, Wirkungsdauer",
- "varianten": {
- "Einzelsinn schärfen": {
+ "varianten": [
+ {
+ "name": "Einzelsinn schärfen",
"description": "Der Zauber betrifft nur einen einzigen Sinn, der dafür umso stärker wird. Alle Sinnesschärfe-Proben für diesen Sinn sind um die doppelten ZfP* erleichtert.",
"mod": "+4",
"limit": ""
}
- },
+ ],
"reversalis": "Die Sinne der Verzauberten werden abgestumpft, dadurch verliert sie ZfP* Punkte Sinnesschärfe.",
"antimagie": "HELLSICHT TRÜBEN und EIGENSCHAFT WIEDERHERSTELLEN heben die Wirkung des Spruches auf; kann in entsprechenden Zonen nur erschwert gewirkt werden.",
"merkmal": "Hellsicht, Eigenschaften",
diff --git a/src/packs/_source/zauber/AdlerschwingeWolfsgestalt.json b/src/packs/_source/zauber/AdlerschwingeWolfsgestalt.json
index 3567d066..f080bedc 100644
--- a/src/packs/_source/zauber/AdlerschwingeWolfsgestalt.json
+++ b/src/packs/_source/zauber/AdlerschwingeWolfsgestalt.json
@@ -10,43 +10,54 @@
"technik": "Der Elf kauert sich auf den Boden zusammen und spricht leise die Formel a’dao valva iama — es folgt der Name des Tieres, in das er sich verwandeln will.",
"zauberdauer": "20 Aktionen",
"wirkung": "Der Zaubernde nimmt die Gestalt des beim Erlernen des Zaubers gewählten Tieres an. Kleidung und Ausrüstung werden nicht mitverwandelt. Der Elf behält seinen Verstand, erhält jedoch die körperlichen Eigenschaften, Sinne und Lebensenergie des Tieres. Zaubern im Tiergestalt ist nicht möglich. Körperliche Aktivitäten entsprechen den Möglichkeiten des Tieres, eingeschränkt durch das Maß an Menschenverständnis des Elfen. Lebenspunkte werden bei Rückverwandlung umgerechnet: Hat der Elf vor der Rückwandlung die Hälfte seiner LeP verloren, so hat er auch danach die Hälfte seiner LeP. Verletzungen werden übertragen. Der Zauber ist ein Kernzauber der Elfenmagie und wird häufig zur Jagd oder als Schutz genutzt.",
- "kosten": "4 AsP für die Verwandlung plus 1 AsP pro Spielrunde; amphibische Lebewesen 2 AsP/SR, wasserbewohnende und fliegende Lebewesen 3 AsP/SR",
+ "kosten": [
+ {
+ "cost": 4,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelperson, freiwillig",
"reichweite": "selbst",
"wirkungsdauer": "nach AsP-Aufwand (Meisterentscheid)",
"modifikationen": "Zauberdauer, Erzwingen, Kosten, Wirkungsdauer",
- "varianten": {
- "Achaz-Repräsentation": {
+ "varianten": [
+ {
+ "name": "Achaz-Repräsentation",
"description": "Erlaubt lediglich die Verwandlung in Reptilien oder Amphibien.",
"mod": "",
"limit": ""
},
- "Extreme Tiere": {
+ {
+ "name": "Extreme Tiere",
"description": "Bei Tieren mit extrem hoher LE steigen die Kosten um 1 bis 7 AsP (mindestens 7 AsP, wenn LE mindestens doppelt so hoch ist wie die des Helden).",
"mod": "",
"limit": ""
},
- "Bewusste Gestalt": {
+ {
+ "name": "Bewusste Gestalt",
"description": "Die Wirkungsdauer ist veränderbar, wenn der Zaubernde seine Aufmerksamkeit ändert.",
"mod": "+7",
"limit": "11"
},
- "Weitere Tierarten": {
+ {
+ "name": "Weitere Tierarten",
"description": "Erlaubt das Erlernen zusätzlicher Tierarten, nach den Regeln für Hexalogien (WdZ 383ff).",
"mod": "",
"limit": ""
},
- "Grenzenlose Gestalt": {
+ {
+ "name": "Grenzenlose Gestalt"
"description": "Wenn mindestens eine Version mit ZfW 15+ beherrscht wird, können alle Tiere bis Pferdgröße erlernt werden.",
"mod": "+7",
"limit": ""
},
- "Haut des Seelentiers": {
+ {
+ "name": "Haut des Seelentiers",
"description": "Der Elf verschmilzt mit seinem Seelentier und übernimmt dessen Instinkte vollständig. Dauer: 1 Tag. Alle Selbstbeherrschungsproben +10 erleichtert.",
"mod": "+7",
"limit": ""
}
- },
+ ],
"reversalis": "Verwandelt eine Tierform zurück in einen Elfen.",
"antimagie": "Kann in einer Zone des VERWANDLUNG BEENDEN nur erschwert gewirkt werden; endet durch Antimagie-Spruch.",
"merkmal": "Form",
diff --git a/src/packs/_source/zauber/AengsteLindern.json b/src/packs/_source/zauber/AengsteLindern.json
index 704fafb0..500dcbd7 100644
--- a/src/packs/_source/zauber/AengsteLindern.json
+++ b/src/packs/_source/zauber/AengsteLindern.json
@@ -10,17 +10,34 @@
"technik": "Die Hexe tritt vor die Person, der sie helfen möchte, sieht ihr in die Augen und legt ihre Hände auf die Schultern.",
"zauberdauer": "20 Aktionen",
"wirkung": "Stärkt das Selbstvertrauen des Betroffenen. Bei gelungener Probe kann eine misslungene Mut-Probe wiederholt werden, wobei die Probe um die ZfP* gesenkt oder die MU-Werte erhöht werden. Kann Ängste wie Höhenangst oder Phobien überwinden. Bei Aufschlägen (z. B. Klettern-Probe) muss der Zauber vorher gewirkt werden, um die Angst vollständig aufzuheben.",
- "kosten": "5 AsP",
+ "kosten": [
+ {
+ "cost": 5,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelperson, freiwillig",
"reichweite": "Berührung",
"wirkungsdauer": "Augenblicklich, wirkt solange wie die motivierende Kraft anhält",
"modifikationen": "Zauberdauer, Erzwingen, Kosten, Reichweite",
- "varianten": {
- "Vertrauten beruhigen": "In der satuarischen Repräsentation wirkt die Grundvariante auch auf den eigenen Vertrauten.",
- "Gegenzauber": "+MR des Patienten. Hilft gegen durch andere Zauber hervorgerufene Ängste wie Horriphobus, Böser Blick etc.",
- "Seele beruhigen": "+3. Wirkt speziell gegen andere schlechte Eigenschaften wie Jähzorn oder Goldgier.",
- "Tiere besänftigen": "+5 plus geistige MR des Tieres. Beruhigt Ängste von Tieren für gewisse Zeit."
- },
+ "varianten": [
+ {
+ "name": "Vertrauten beruhigen",
+ "description": "In der satuarischen Repräsentation wirkt die Grundvariante auch auf den eigenen Vertrauten."
+ },
+ {
+ "name": "Gegenzauber",
+ "description": "+MR des Patienten. Hilft gegen durch andere Zauber hervorgerufene Ängste wie Horriphobus, Böser Blick etc."
+ },
+ {
+ "name": "Seele beruhigen",
+ "description": "+3. Wirkt speziell gegen andere schlechte Eigenschaften wie Jähzorn oder Goldgier."
+ },
+ {
+ "name": "Tiere besänftigen",
+ "description": "+5 plus geistige MR des Tieres. Beruhigt Ängste von Tieren für gewisse Zeit."
+ }
+ ],
"reversalis": "bekannt als Ängste mehren: Alle vorhandenen Ängste verdoppeln sich für die nächste Viertelstunde.",
"antimagie": "Wirkt in der Zone des EINFLUSS BANNEN; erschwert zu bannen.",
"merkmal": "Einfluss",
diff --git a/src/packs/_source/zauber/AeolitusWindgebraus.json b/src/packs/_source/zauber/AeolitusWindgebraus.json
index 306c71f4..0bfe6ad5 100644
--- a/src/packs/_source/zauber/AeolitusWindgebraus.json
+++ b/src/packs/_source/zauber/AeolitusWindgebraus.json
@@ -10,33 +10,46 @@
"technik": "Der Elf spricht eo’la dao winya’bha und bläst durch die zu einem Trichter geformte Hand.",
"zauberdauer": "3 Aktionen",
"wirkung": "Der Luftstoß, den der Elf erzeugt, verstärkt sich zu einem kurzen, heftigen Windstoß, der sich kegelförmig in Blasrichtung ausbreitet. Jenseits der Reichweite verliert der Wind an Stärke. In der doppelten Reichweite ist er kaum noch spürbar. Der Windstoß ist kräftig genug, um Fackeln zu löschen, leichte Gegenstände umzuwenden, Rauch oder Nebel in einem kleinen Raum zu vertreiben oder einen Menschen zu Fall zu bringen.",
- "kosten": "4 AsP (Sch: 3 AsP)",
+ "kosten": [
+ {
+ "cost": 4,
+ "herkunft": ""
+ },
+ {
+ "cost": 3,
+ "herkunft": "Scharlartan"
+ }
+ ],
"zielobjekt": "Zone",
"reichweite": "ZfW × 2 Schritt, Basisbreite des Kegels maximal ZfW Schritt",
"wirkungsdauer": "augenblicklich",
"modifikationen": "Zauberdauer, Reichweite",
- "varianten": {
- "Langer Atem": {
+ "varianten": [
+ {
+ "name": "Langer Atem",
"description": "Der Windstoß hält so lange an, wie der Elf kräftig blasen kann, also KO Aktionen. In dieser Zeit muss jedes Wesen im Wirkungsbereich eine KK-Probe ablegen, um sich dem Elfen zu nähern.",
"mod": "+3",
"limit": ""
},
- "Sturm": {
+ {
+ "name": "Sturm",
"description": "Der Windstoß ist so heftig, dass sogar Personen umgeworfen werden. Misslingt die KK-Probe, ist sie um ZfP* erschwert.",
"mod": "+7",
"limit": ""
},
- "Übler Gestank": {
+ {
+ "name": "Übler Gestank",
"description": "Der Windstoß riecht nach Faulnis. Das Opfer muss eine KO-Probe ablegen, um nicht erbrechen zu müssen. Bei Misslingen erhält es ZfP* KR Abzüge von 1 Punkt auf alle Werte.",
"mod": "+7",
"limit": ""
},
- "Lieblicher Duft": {
+ {
+ "name": "Lieblicher Duft",
"description": "Der Windstoß trägt angenehmen Duft (z. B. für Elfen oder Gildenmagier).",
"mod": "+5",
"limit": ""
}
- },
+ ],
"reversalis": "Statt eines Windstoßes erzeugt der Zauber einen Sog zum Elf hin, der aber auch Staub und Kleinteile in den Mund des Elfen ziehen kann.",
"antimagie": "Kann nur erschwert in einer Zone des VERÄNDERUNG AUFHEBEN gewirkt werden; kann diesen Zauber verhindern.",
"merkmal": "Umwelt, Elementar (Luft)",
diff --git a/src/packs/_source/zauber/AerofugoVakuum.json b/src/packs/_source/zauber/AerofugoVakuum.json
index 0bad506d..a94563b1 100644
--- a/src/packs/_source/zauber/AerofugoVakuum.json
+++ b/src/packs/_source/zauber/AerofugoVakuum.json
@@ -10,12 +10,16 @@
"technik": "Die Magierin presst die Hände so fest sie kann aneinander, spricht die Formel und reißt die Hände blitzartig auseinander.",
"zauberdauer": "10 Aktionen",
"wirkung": "Nach Anwenden dieses Spruchs verschwindet aus einem Raum schlagartig Luft und magische Wesen der Luft, es herrscht ein Vakuum. Alle dort befindlichen Lebewesen drohen zu ersticken (Schaden nach Würgegriff: 1W6 + ZfP*(A)/KR). Außerdem erlöschen Flammen, und es treten beim Wiedereinströmen der Luft heftige Winde auf. Ist der Raum oder das Gefäß besonders gut gegen Lufteintritt versiegelt (z. B. Fässer, Flaschen), kann es durch den Unterdruck zerstört werden. Gegen elementare Wesenheiten der Luft wirkt der Zauber verheerend: Mindergeister sterben sofort, Elementargeister oder Dschinne der Luft erleiden 2 × ZfP* Schadenspunkte. Es heißt, selbst ein Elementarer Meister der Luft sei in Abwesenheit seines Elements gestorben.",
- "kosten": "10 AsP + 1 AsP pro 5 Raumschritt",
+ "kosten": [
+ {
+ "cost": 10,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Zone",
"reichweite": "Die luftleere Zone entsteht maximal ZfW Schritt vom Zaubernden entfernt; größte Ausdehnung ZfW × 5 Raumschritt",
"wirkungsdauer": "ZfP* KR, danach strömt Luft wieder ein",
"modifikationen": "Zauberdauer, Kosten, Reichweite, Wirkungsdauer",
- "varianten": {},
"reversalis": "Bewirkt einen AEROGELO.",
"antimagie": "Kann in einer Zone des VERÄNDERUNG AUFHEBEN nur erschwert gewirkt werden; ein ZORN DER LUFT kann (bei mehr TP als ZfP*) ein 'Leck' in die Vakuumbegrenzung schlagen.",
"merkmal": "Umwelt, Elementar (Luft)",
diff --git a/src/packs/_source/zauber/AerogeloAtemqual.json b/src/packs/_source/zauber/AerogeloAtemqual.json
index 603b4819..22b181e1 100644
--- a/src/packs/_source/zauber/AerogeloAtemqual.json
+++ b/src/packs/_source/zauber/AerogeloAtemqual.json
@@ -10,12 +10,16 @@
"technik": "Der Magier bläst Luft in seine zu einer Schale geschlossenen Handflächen. Dabei konzentriert er sich auf die Formel, die er im Anschluss ausspricht.",
"zauberdauer": "10 Aktionen",
"wirkung": "Die Luft verdichtet sich zu einem zähen, quasiflüssigen Medium, das Bewegungen erschwert. Alle AT/PA-Proben sind um 6 Punkte erschwert, ebenso GE-Proben. Waffen- und Manöver-Einschränkungen wie beim Kampf unter Wasser (WdS 86) gelten. Flammen erlöschen, das Atmen wird erschwert: Bei großer Anstrengung oder im Kampf muss jede KR eine KO-Probe gelingen (1 SP(A) Verlust bei Gelingen, 1W6 SP(A) bei Misslingen). Alle KO-Proben auf Luftanhalten oder ähnliches sind um 4 Punkte erschwert. Jede zusätzliche KR kostet 1W6 Punkte Erschöpfung pro SR. Stürze sind wie ins Wasser zu werten (1/3 Fallschaden). Die Sonderfertigkeit Unterwasserkampf verhindert Abzüge auf AT, PA, GE.",
- "kosten": "5 AsP + 1 AsP pro 20 Raumschritt",
+ "kosten": [
+ {
+ "cost": 5,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Zone (quaderförmig)",
"reichweite": "Max. ZfW × 3 Schritt; Volumen max. ZfW × 20 Raumschritt",
"wirkungsdauer": "ZfP* Spielrunden",
"modifikationen": "Zauberdauer, Kosten, Wirkungsdauer",
- "varianten": {},
"reversalis": "Bewirkt den AEROFUGO.",
"antimagie": "Kann in einer Zone des VERÄNDERUNG AUFHEBEN oder LUFTBANN nur erschwert gewirkt werden. Ein ZORN DER LUFT kann (bei mehr TP als ZfP*) ein Leck schlagen, sodass Luft langsam wieder einströmt.",
"merkmal": "Umwelt, Elementar (Luft)",
diff --git a/src/packs/_source/zauber/Alpgestalt.json b/src/packs/_source/zauber/Alpgestalt.json
index 202d0df3..1b0ec6da 100644
--- a/src/packs/_source/zauber/Alpgestalt.json
+++ b/src/packs/_source/zauber/Alpgestalt.json
@@ -10,16 +10,30 @@
"technik": "Der Druide konzentriert sich auf das Unterbewusstsein seines Opfers, hebt die Arme und geht drohend auf das Opfer zu.",
"zauberdauer": "20 Aktionen",
"wirkung": "Der Zaubernde weckt im Unterbewusstsein des Opfers schlummernde Angstvorstellungen, sodass es eine schreckenerregende Gestalt wahrnimmt. Es erleidet seine schlimmsten Alpträume, ist starr vor Furcht und bringt keinen Laut hervor. Die maximale Dauer beträgt ZfP* × 5 KR. Danach ist eine MU-Probe + ZfP* nötig, sonst fällt das Opfer in Ohnmacht für ZfP* KR. Passende Ängste können die Wirkung verstärken.",
- "kosten": "MR des Opfers in AsP, mindestens 6 AsP",
+ "kosten": [
+ {
+ "cost": 6,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelperson",
"reichweite": "ZfW Schritt",
"wirkungsdauer": "ZfP* × 5 KR",
"modifikationen": "Zauberdauer, Wirkungsdauer, Erzwingen, Kosten, Reichweite, Zielobjekte (mehrere)",
- "varianten": {
- "mehrere Opfer": "+5 AsP pro Opfer",
- "Fremdgestalt": "+5; Der Zaubernde lässt nicht sich selbst, sondern eine andere Gestalt erscheinen.",
- "Alpdrücken": "+7; ab ZfW 11. Opfer wird in Träumen weiterhin verfolgt (Nachteil Alpträume)."
- },
+ "varianten": [
+ {
+ "name": "mehrere Opfer",
+ "description": "+5 AsP pro Opfer"
+ },
+ {
+ "name": "Fremdgestalt",
+ "description": "+5; Der Zaubernde lässt nicht sich selbst, sondern eine andere Gestalt erscheinen."
+ },
+ {
+ "name": "Alpdrücken",
+ "description": "+7; ab ZfW 11. Opfer wird in Träumen weiterhin verfolgt (Nachteil Alpträume)."
+ }
+ ],
"reversalis": "Opfer sieht den Zaubernden in grotesker Gestalt, die ihn verspottet. Nach Ende: MU-Probe + ZfP*, sonst weitere ZfP* × 5 KR Schlaf mit schreckhaften Träumen.",
"antimagie": "EINFLUSS BANNEN und BEHERRSCHUNG BRECHEN können den Zauber aufheben. ÄNGSTE LINDERN kann die Wirkung mindern.",
"merkmal": "Einfluss, Herrschaft",
diff --git a/src/packs/_source/zauber/AnalysArcanstruktur.json b/src/packs/_source/zauber/AnalysArcanstruktur.json
index 4fe78340..d66f8046 100644
--- a/src/packs/_source/zauber/AnalysArcanstruktur.json
+++ b/src/packs/_source/zauber/AnalysArcanstruktur.json
@@ -10,12 +10,16 @@
"technik": "Die Magierin fixiert das Ziel ihres Interesses und spricht die Formel.",
"zauberdauer": "mindestens 1 Spielrunde",
"wirkung": "Ermöglicht es, magische Wirkungsstrukturen und Gewebe aus den Fäden und Bahnen der Kraft zu erkennen. Damit können Artefakte, magische Wesen oder Zauber identifiziert und klassifiziert werden. Je nach Höhe der ZfP* können Merkmale, Repräsentationen, Matrixfehler oder versteckte Zauber ermittelt werden. Erweiterte Effekte: Erkennen von Zaubertradition, Signatur des Schöpfers, Art von Artefakten, Wirkungen von Elixieren oder Tränken. Je länger die Konzentration aufrechterhalten wird, desto mehr Details können sichtbar werden.",
- "kosten": "6 AsP + 3 AsP je angefangene halbe Stunde, die die Analyse dauert",
+ "kosten": [
+ {
+ "cost": 6,
+ "herkunft": ""
+ }
+ ],
"zielobjekt": "Einzelobjekt, Einzelwesen",
"reichweite": "1 Schritt",
"wirkungsdauer": "Identisch mit Zauberdauer, nach AsP-Aufwand",
"modifikationen": "Zauberdauer, Kosten, Reichweite",
- "varianten": {},
"reversalis": "keine Wirkung",
"antimagie": "HELLSICHT TRÜBEN und SCHLEIER DER UNWISSENHEIT erschweren die Analyse.",
"merkmal": "Hellsicht, Metamagie",
diff --git a/src/packs/_source/zauber/Attributo.json b/src/packs/_source/zauber/Attributo.json
index ba3d64c8..c7e6fb6e 100644
--- a/src/packs/_source/zauber/Attributo.json
+++ b/src/packs/_source/zauber/Attributo.json
@@ -10,68 +10,88 @@
"technik": "Der Magier berührt seinen Gefährten mit beiden Händen und spricht die Formel. Je nach Eigenschaft z. B. Oberarm für Körperkraft, Schläfen für Klugheit, Augen für Intuition, Hände für Fingerfertigkeit usw.",
"zauberdauer": "30 Aktionen",
"wirkung": "Der Zauber hebt die in der Probe durch 'Eigenschaft' bezeichneten Werte des Verzauberten für die Dauer einer Stunde um ZfP* / 3 Punkte.",
- "kosten": "7 AsP (Sch: 5 AsP)",
+ "kosten": [
+ {
+ "cost": 7,
+ "herkunft": ""
+ },
+ {
+ "cost": 5,
+ "herkunft": "Scharlartan"
+ }
+ ],
"zielobjekt": "Einzelperson, Einzelwesen (s. u.), freiwillig",
"reichweite": "Berührung",
"wirkungsdauer": "1 Stunde",
"modifikationen": "Zauberdauer, Reichweite (Selbst), Wirkungsdauer",
- "varianten": {
- "Mut": {
+ "varianten": [
+ {
+ "name": "Mut",
"description": "Wirkt auch auf Tiere beliebiger Art. In diesem Fall ist die Probe um 3 Punkte erschwert.",
"mod": "",
"limit": ""
},
- "Klugheit": {
+ {
+ "name": "Klugheit",
"description": "Kann auch auf Vertraute, Reit- und Haustiere angewandt werden, sogar auf Pflanzen. 3–5 Punkte für Tiere, 7 Punkte für Pflanzen. Erlaubt auch eine Art 'Erinnerungslesen'.",
"mod": "",
"limit": ""
},
- "Intuition": {
+ {
+ "name": "Intuition",
"description": "Bei Lebewesen ohne höhere Verstandesfunktionen (Tiere) wird Wahrnehmung und Aufmerksamkeit um 3 Punkte gesteigert.",
"mod": "",
"limit": ""
},
- "Charisma": {
+ {
+ "name": "Charisma",
"description": "Wirkt ausschließlich auf kulturschaffende Wesen.",
"mod": "",
"limit": ""
},
- "Fingerfertigkeit": {
+ {
+ "name": "Fingerfertigkeit",
"description": "Kann nur auf Lebewesen angewandt werden, die über einen Greifhand verfügen.",
"mod": "",
"limit": ""
},
- "Gewandtheit": {
+ {
+ "name": "Gewandtheit",
"description": "Erhöht GE von Vierbeinern oder Schlangen: +3 Punkte, Vögel/Schlangen +5 Punkte, Achtbeiner/Flugwesen +7 Punkte.",
"mod": "",
"limit": ""
},
- "Konstitution": {
+ {
+ "name": "Konstitution",
"description": "Verändert die KO von Tieren. Kosten und Schwierigkeit steigen je nach Körpermasse des Tieres. Mindestens 40 AsP bei Pferden.",
"mod": "",
"limit": ""
},
- "Körperkraft": {
+ {
+ "name": "Körperkraft",
"description": "Wie Konstitution.",
"mod": "",
"limit": ""
},
- "Schnellsteigerung": {
+ {
+ "name": "Schnellsteigerung",
"description": "Nur in gildenmagischer, elfischer, druidischer oder saurischer Rep. Kleine Mutanda: +ZfP* Punkte für ZfW KR, Kosten 1 AsP pro Punkt. Mächtigere Version bringt Dauerbonus.",
"mod": "+3 ab ZfW 11",
"limit": ""
},
- "Übernatürliche Begabung": {
+ {
+ "name": "Übernatürliche Begabung",
"description": "Nur für Magiedilettanten. Steigert eine Eigenschaft um ZfP* Punkte für ZfP* KR, kostet ZfP* AsP.",
"mod": "",
"limit": ""
},
- "Scharlatanische Version": {
+ {
+ "name": "Scharlatanische Version",
"description": "Ermöglicht Reichweite 'selbst', Zielobjekt 'Einzelperson, freiwillig'.",
"mod": "",
"limit": ""
}
- },
+ ],
"reversalis": "Die entsprechende Eigenschaft des Opfers sinkt um den entsprechenden Betrag.",
"antimagie": "In einer Zone des EIGENSCHAFT WIEDERHERSTELLEN nur erschwert wirksam und kann mit diesem Antimagie-Spruch beendet werden.",
"merkmal": "Eigenschaften",
diff --git a/src/style/molecules/_fieldset.scss b/src/style/molecules/_fieldset.scss
index 682178b9..781e6bcb 100644
--- a/src/style/molecules/_fieldset.scss
+++ b/src/style/molecules/_fieldset.scss
@@ -8,6 +8,45 @@
legend {
padding: 0 16px;
text-align: center;
+
+ &.variant-operator {
+
+ display: flex;
+
+ select {
+ border: none;
+ background: none;
+ padding: 0;
+ margin: 0;
+ }
+
+ button {
+ border: none;
+ background: none;
+ padding: 0;
+ margin: 0;
+ width: 32px;
+ height: 32px;
+ position: relative;
+
+ i {
+ position: absolute;
+ height: 28px;
+ line-height: 32px;
+ }
+
+ &:hover {
+ color: black;
+ text-shadow: 0 0 2px red;
+ }
+
+ &[disabled] {
+ opacity: 0.5;
+ }
+ }
+
+ }
+
}
}
diff --git a/src/system.json b/src/system.json
index c5d2baa1..33004e28 100644
--- a/src/system.json
+++ b/src/system.json
@@ -2,7 +2,7 @@
"id": "DSA_4-1",
"title": "Das Schwarze Auge 4.1",
"description": "Noch ein Spielsystem für Das Schwarze Auge 4.1",
- "version": "0.4.1-rc1",
+ "version": "0.0.1",
"compatibility": {
"minimum": 12,
"verified": 13
@@ -348,5 +348,5 @@
"primaryTokenAttribute": "lep.aktuell",
"url": "https://git.macniel.online/macniel/foundry-dsa41-game",
"manifest": "https://git.macniel.online/macniel/foundry-dsa41-game/raw/branch/main/src/system.json",
- "download": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/0.4.1-rc1/release.zip"
+ "download": "https://git.macniel.online/macniel/foundry-dsa41-game/releases/download/0.0.1/release.zip"
}
diff --git a/src/templates/dialog/spell-dialog.hbs b/src/templates/dialog/spell-dialog.hbs
new file mode 100644
index 00000000..969789b3
--- /dev/null
+++ b/src/templates/dialog/spell-dialog.hbs
@@ -0,0 +1,50 @@
+
+
+ {{#each dice}}
+
+ {{> "systems/DSA_4-1/templates/ui/partial-attribute-button.hbs" this}}
+
+ {{/each}}
+
+
+
+