fixes paths

pull/65/head
macniel 2025-11-07 22:49:09 +01:00
parent 1adff7568d
commit 03de483e9a
34 changed files with 931 additions and 106 deletions

View File

@ -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(),

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
StringField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
ArrayField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
NumberField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
BooleanField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
DocumentIdField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
BooleanField,

View File

@ -1,4 +1,4 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
ArrayField,

View File

@ -1,6 +1,7 @@
import BaseItem from "./base-item.mjs";
import BaseItem from "./baseItem.mjs";
const {
SchemaField,
BooleanField,
NumberField,
ArrayField,
@ -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(),
}))
}
}

View File

@ -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 {

View File

@ -1,4 +1,3 @@
import {LiturgyData} from "../data/miracle/liturgydata.mjs";
import {Talent} from "../data/talent.mjs";
import {ATTRIBUTE} from "../data/attribute.mjs";

View File

@ -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 {

View File

@ -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,

View File

@ -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 =
"<option value='talentMin'>Mindest Talentwert</option>" +
"<option value='talentMax'>Maximal Talentwert</option>" +
"<option value='attributeMin'>Mindest Attributswert</option>" +
"<option value='attributeMax'>Maximal Attributswert</option>" +
"<option value='compare'>Vergleich</option>"
const type = await foundry.applications.api.DialogV2.prompt({
window: {title: "Neue Voraussetzung"},
content: `<select name="type">${selections}</select>`,
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 =
"<option value='talent'>Talent</option>" +
"<option value='talentGroup'>Talentgruppe</option>" +
"<option value='attribute'>Attribute</option>" +
"<option value='trait'>Merkmal</option>"
const type = await foundry.applications.api.DialogV2.prompt({
window: {title: "Neuer Modifikator"},
content: `<select name="type">${selections}</select>`,
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)
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
}
console.log(formData.object, this.document)
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)
}
})
}
}

View File

@ -1,4 +1,4 @@
import {LiturgyData} from "../../data/miracle/liturgydata.mjs";
import {LiturgyData} from "../../data/miracle/liturgyData.mjs";
export default {
_prepareContext: (context) => {

View File

@ -12,8 +12,14 @@ 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: {
@ -32,7 +38,12 @@ 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 =
"<option value='talentMin'>Mindest Talentwert</option>" +
"<option value='talentMax'>Maximal Talentwert</option>" +
"<option value='attributeMin'>Mindest Attributswert</option>" +
"<option value='attributeMax'>Maximal Attributswert</option>" +
"<option value='compare'>Vergleich</option>"
const type = await foundry.applications.api.DialogV2.prompt({
window: {title: "Neue Voraussetzung"},
content: `<select name="type">${selections}</select>`,
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 =
"<option value='talent'>Talent</option>" +
"<option value='talentGroup'>Talentgruppe</option>" +
"<option value='attribute'>Attribute</option>" +
"<option value='trait'>Merkmal</option>"
const type = await foundry.applications.api.DialogV2.prompt({
window: {title: "Neuer Modifikator"},
content: `<select name="type">${selections}</select>`,
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,10 +231,34 @@ 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)
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 */
async _prepareContext(options) {
const context = await super._prepareContext(options);
@ -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)
}
})
}
}

View File

@ -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";

View File

@ -10,23 +10,34 @@
"technik": "Der Elf spricht bhasama venya bhaza 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",

View File

@ -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",

View File

@ -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)",

View File

@ -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",

View File

@ -10,43 +10,54 @@
"technik": "Der Elf kauert sich auf den Boden zusammen und spricht leise die Formel adao 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",

View File

@ -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",

View File

@ -10,33 +10,46 @@
"technik": "Der Elf spricht eola dao winyabha 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)",

View File

@ -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)",

View File

@ -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)",

View File

@ -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",

View File

@ -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",

View File

@ -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. 35 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",

View File

@ -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;
}
}
}
}
}

View File

@ -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"
}

View File

@ -0,0 +1,50 @@
<section>
<div class="attributes {{#if this.colorfulDice}}colorfulDice{{/if}}">
<hr class="zier"/>
{{#each dice}}
{{> "systems/DSA_4-1/templates/ui/partial-attribute-button.hbs" this}}
{{/each}}
<hr class="zier"/>
</div>
<div class="scroll-y">
{{{this.text}}}
</div>
{{#if this.variants}}
<div>
<label>Variante
<select></select>
</label>
</div>
{{/if}}
<fieldset class="modding">
<legend>Erschwernisse</legend>
<div class="malus-and-mod">
<label><span>TaW</span>
<output name="lkp" type="number">{{taw}}</output>
</label>
<label><span>Umstände</span>
<input name="circumstance" type="number" value="{{circumstance}}">
</label>
<label><span>Modifikation</span>
<output name="penalty">{{penalty}}</output>
</label>
</div>
<output class="modResult"></output>
</fieldset>
<button class="actions" data-action="use"><i class="fa-solid fa-bolt"></i> Talenteinsatz {{#if modResult}}
[{{displayModResult}}]{{/if}}</button>
</section>

View File

@ -4,7 +4,7 @@
<div>
<label>Name</label>
<input type="text" name="system.name" value="{{system.name}}"/>
<input type="text" name="name" value="{{name}}"/>
</div>
{{#if hasModality}}
<div>

View File

@ -0,0 +1,144 @@
<section class="tab {{tabs.variants.id}} {{tabs.variants.cssClass}}"
data-tab="{{tabs.variants.id}}"
data-group="{{tabs.variants.group}}">
<fieldset>
<legend class="variant-operator"><select name="variant">
{{selectOptions variantChoices selected=currentSelectedVariantName inverted=true}}
</select>
<button {{#if currentSelectedVariant}}data-action="addVariant" {{else}}disabled="disabled"{{/if}}><i
class="fa-solid fa-plus"></i></button>
<button {{#if currentSelectedVariant}}data-action="removeVariant" {{else}}disabled="disabled"{{/if}}><i
class="fa-solid fa-minus"></i></button>
</legend>
{{#if currentSelectedVariant}}
<div>
<label>Name
<input type="text" name="vName" value="{{currentSelectedVariant.name}}"/>
</label>
</div>
<div class="selection">
<label>Voraussetzungen</label>
<table>
<tbody>
{{#each currentSelectedVariant.requirements}}
<tr>
{{#if this.compare}}
<td>
<input type="text" value="{{this.compare.ownAttribute}}"
name="requirements.{{@key}}.compare.ownAttribute"/>
</td>
<td>
<select name="requirements.{{@key}}.compare.operation">
<option value="lt"
{{#if (eq this.compare.operation 'lt') }}selected="selected"{{/if}}>
Kleiner als
</option>
<option value="lte"
{{#if (eq this.compare.operation 'lte')}}selected="selected"{{/if}}>
Kleiner gleich als
</option>
<option value="eq"
{{#if (eq this.compare.operation 'eq') }}selected="selected"{{/if}}>
Gleich
</option>
<option value="neq"
{{#if (eq this.compare.operation 'neq')}}selected="selected"{{/if}}>
Nicht gleich
</option>
<option value="gte"
{{#if (eq this.compare.operation 'gte')}}selected="selected"{{/if}}>
Größer gleich als
</option>
<option value="gt"
{{#if (eq this.compare.operation 'gt') }}selected="selected"{{/if}}>
Größer als
</option>
</select>
</td>
<td>
<input type="text" value="{{this.compare.targetAttribute}}"
name="requirements.{{@key}}.compare.targetAttribute"/>
</td>
{{else}}
<td>
{{#if this.attribute}}
<input type="text" value="{{this.attribute}}"
name="requirements.{{@key}}.attribute"/>
{{/if}}
{{#if this.talent}}
<input type="text" value="{{this.talent}}" name="requirements.{{@key}}.talent"/>
{{/if}}
</td>
{{#if this.minValue}}
<td>Mindestens</td>
{{/if}}
{{#if this.maxValue}}
<td>Maximal</td>
{{/if}}
{{#if this.minValue}}
<td><input type="number" value="{{this.minValue}}"
name="requirements.{{@key}}.minValue"/></td>
{{/if}}
{{#if this.maxValue}}
<td><input type="number" value="{{this.maxValue}}"
name="requirements.{{@key}}.maxValue"/></td>
{{/if}}
{{/if}}
<td>
<button data-action="removeRequirement" data-index="{{@key}}"><i
class="fa-solid fa-trash"></i></button>
</td>
</tr>
{{/each}}
</tbody>
<tfoot>
<tr>
<td colspan="4">
<button {{#if currentSelectedVariant}}data-action="addRequirement"
{{else}}disabled="disabled"{{/if}}><i class="fa-solid fa-plus"></i></button>
</td>
</tr>
</tfoot>
</table>
</div>
<div class="selection">
<label>Auswirkung</label>
<table>
<tbody>
{{#each currentSelectedVariant.mod}}
<tr>
<td><input type="text" value="{{this.name}}" name="mod.{{@key}}.name"/></td>
<td><input type="number" value="{{this.value}}" name="mod.{{@key}}.value"/></td>
<td>
<button data-action="removeMod" data-index="{{@key}}"><i class="fa-solid fa-trash"></i>
</button>
</td>
</tr>
{{/each}}
</tbody>
<tfoot>
<tr>
<td colspan="3">
<button {{#if currentSelectedVariant}}data-action="addMod"
{{else}}disabled="disabled"{{/if}}><i class="fa-solid fa-plus"></i></button>
</td>
</tr>
</tfoot>
</table>
</div>
{{/if}}
<button {{#if currentSelectedVariant}}data-action="saveVariant" {{else}}disabled="disabled"{{/if}}><i
class="fa-solid fa-save"></i> Speichern
</button>
</fieldset>
</section>