From f5c485fdcc1d0606e66c486135f89b6d7e0f9391 Mon Sep 17 00:00:00 2001 From: TobenderZephyr Date: Tue, 27 Apr 2021 18:11:47 +0200 Subject: [PATCH] added related messages, added skillcheck for spells (cast) --- commands/Cast.js | 175 ++++---- commands/Chants.js | 88 ++-- commands/Skill.js | 45 +- commands/Spells.js | 81 ++-- commands/Talent.js | 170 ++++---- data/Chants.js | 522 +++++++--------------- data/Spells.js | 767 ++++++++++++++------------------- functions/CompareResults.js | 75 ++-- functions/CreateResultTable.js | 21 + functions/getChant.js | 30 +- functions/getSpell.js | 5 +- globals.js | 3 +- 12 files changed, 798 insertions(+), 1184 deletions(-) create mode 100644 functions/CreateResultTable.js diff --git a/commands/Cast.js b/commands/Cast.js index e85de8d..430ca58 100644 --- a/commands/Cast.js +++ b/commands/Cast.js @@ -1,101 +1,88 @@ const globals = require('../globals'); const Discord = require('discord.js'); const db = globals.db; -const { roll } = require('@dsabot/Roll'); -const { findMessage } = require('@dsabot/findMessage'); -const { getSkill } = require('@dsabot/getSkill'); +const { roll } = require('@dsabot/Roll'); +const { findMessage } = require('@dsabot/findMessage'); +const { getSpell } = require('@dsabot/getSpell'); const { CalculateQuality } = require('@dsabot/CalculateQuality'); const { CompareResults } = require('@dsabot/CompareResults'); +const { CreateResultTable } = require('@dsabot/CreateResultTable'); module.exports = { - name: 'cast', - description: ' Du machst eine Fertigkeitsprobe auf Magietalente.\n' + - ' Es werden drei Würfel auf deine Eigenschaftswerte geworfen. Deine Boni werden in' + - ' die Berechnung einbezogen.', - aliases: ['zaubern'], - usage: ' [<-Erschwernis> / <+Erleichterung>]', - needs_args: true, - async exec(message, args) { - try { - db.find({ - user: message.author.tag, - }, function (err, docs) { - if (docs.length === 0) { - return message.reply(findMessage('NOENTRY')); - } - if (!isNaN(args[0])) { - return message.reply(findMessage('WRONG_ARGUMENTS')); - } else { - - const Skill = getSkill({Character: docs[0].character, args: args}); - if(!Skill) { return message.reply(findMessage('TALENT_UNKNOWN'));} - - const Attributes = Skill.Attributes; - const DiceThrow = roll(3, 20, message.author.tag).dice; - const Bonus = parseInt(args[1]) || 0; - let { Passed, - CriticalHit, - Fumbles, - PointsUsed, - PointsRemaining } = CompareResults( - DiceThrow, - Attributes.map(attr => attr.Level), - Bonus, - Skill.Level); - const Reply = new Discord.MessageEmbed(); - Reply.addFields({ - name: `Du würfelst auf das Talent **${Skill.Name}** (Stufe ${Skill.Level} + ${Bonus})`, - value: CreateTable({Attributes: Attributes, Throws: DiceThrow, PointsUsed: PointsUsed}), - inline: false - }); - if (Fumbles >= 2) { - Reply.setColor('#900c3f'); - Reply.addFields({ - name: findMessage('TITLE_CRIT_FAILURE'), - value: findMessage('MSG_CRIT_FAILURE'), - inline: false - }); - } else if (CriticalHit >= 2) { - Reply.setColor('#1E8449'); - Reply.addFields({ - name: findMessage('TITLE_CRIT_SUCCESS'), - value: findMessage('MSG_CRIT_SUCCESS'), - inline: false - }); - } else if (Passed < 3) { - Reply.addFields({ - name: findMessage('TITLE_FAILURE'), - value: `${(Passed === 0) ? 'Keine Probe' : `nur ${Passed}/3 Proben`} erfolgreich. 😪`, - inline: false - }); - } else { - Reply.addFields({ - name: findMessage('TITLE_SUCCESS'), - value: `Dein verbleibender Bonus: ${PointsRemaining}/${Skill.Level} (QS${CalculateQuality(PointsRemaining)})`, - inline: false - }); - } - - message.reply(Reply); - } - }); - } catch (e) { - throw e; - } - }, + name: 'cast', + description: + ' Du machst eine Fertigkeitsprobe auf Magietalente.\n' + + ' Es werden drei Würfel auf deine Eigenschaftswerte geworfen. Deine Boni werden in' + + ' die Berechnung einbezogen.', + aliases: ['zaubern'], + usage: ' [<-Erschwernis> / <+Erleichterung>]', + needs_args: true, + async exec(message, args) { + db.find({ user: message.author.tag }, (err, docs) => { + if (docs.length === 0) { + return message.reply(findMessage('NOENTRY')); + } + if (!isNaN(args[0])) { + return message.reply(findMessage('WRONG_ARGUMENTS')); + } + + console.log(args[0]); + const Spell = getSpell({ Character: docs[0].character, spell_name: args[0] }); + if (!Spell) { + return message.reply(findMessage('SPELL_UNKNOWN')); + } + if (!Spell.Level || !Spell.Attributes) { + return; + } + const Attributes = Spell.Attributes; + const DiceThrow = roll(3, 20, message.author.tag).dice; + const Bonus = parseInt(args[1]) || 0; + let { Passed, CriticalHit, Fumbles, PointsUsed, PointsRemaining } = CompareResults( + DiceThrow, + Attributes.map(attr => attr.Level), + Bonus, + Spell.Level + ); + const Reply = new Discord.MessageEmbed(); + Reply.addFields({ + name: `Du würfelst auf das Talent **${Spell.Name}** (Stufe ${Spell.Level} + ${Bonus})`, + value: CreateResultTable({ + Attributes: Attributes, + Throws: DiceThrow, + PointsUsed: PointsUsed, + }), + inline: false, + }); + if (Fumbles >= 2) { + Reply.setColor('#900c3f'); + Reply.addFields({ + name: findMessage('TITLE_CRIT_FAILURE'), + value: findMessage('MSG_CRIT_FAILURE'), + inline: false, + }); + } else if (CriticalHit >= 2) { + Reply.setColor('#1E8449'); + Reply.addFields({ + name: findMessage('TITLE_CRIT_SUCCESS'), + value: findMessage('MSG_CRIT_SUCCESS'), + inline: false, + }); + } else if (Passed < 3) { + Reply.addFields({ + name: findMessage('TITLE_FAILURE'), + value: `${Passed === 0 ? 'Keine Probe' : `nur ${Passed}/3 Proben`} erfolgreich. 😪`, + inline: false, + }); + } else { + Reply.addFields({ + name: findMessage('TITLE_SUCCESS'), + value: `Dein verbleibender Bonus: ${PointsRemaining}/${Spell.Level} (QS${CalculateQuality( + PointsRemaining + )})`, + inline: false, + }); + } + + message.reply(Reply); + }); + }, }; - -function Pad(Number = 0) { - return Number.toString().padStart(1, ' '); -} - -const CreateTable = ({Attributes: Attributes, Throws: Throws, PointsUsed: PointsUsed}) => { - return ` - \`\`\` - ${' '.padEnd(15)} ${Attributes.map(attr => `${attr.Name}`.padStart(5)).join('\t|\t')}\t| - ${'Dein Wert'.padEnd(15)} ${Attributes.map(attr => `${attr.Level}`.padStart(5)).join('\t|\t')}\t| - ${'Dein Wurf'.padEnd(15)} ${Throws.map(Throw => `${Throw}`.padStart(5)).join('\t|\t')}\t| - ${'Abzüge'.padEnd(15)} ${PointsUsed.map(Points => `${Points}`.replace(0,'--').padStart(5)).join('\t|\t')}\t| - ${'Gesamt'.padEnd(15)} ${PointsUsed.reduce((acc,cur) => acc+cur).toString().padStart(5)} - \`\`\` - `; -}; \ No newline at end of file diff --git a/commands/Chants.js b/commands/Chants.js index 7ae32ad..0f1c0c8 100644 --- a/commands/Chants.js +++ b/commands/Chants.js @@ -11,73 +11,45 @@ module.exports = { needs_args: true, async exec(message, args) { - try { - console.log(message.author.tag); - db.find( - { - user: message.author.tag, - }, - function (err, docs) { - if (docs.length === 0) { - return message.reply(findMessage('NOENTRY')); - } else { - Character = docs[0].character; - if (args.length === 0) { - //console.log(ReplySpellList(createSpellList(Character))); - return message.reply(ReplyChantList(createChantList(Character))); //?+ - } else { - const Spell = getChant({ - Character: Character, - spell_name: args[0], - }); - if (!Spell) { - return message.reply(findMessage('SPELL_UNKNOWN')); - } - return message.reply(ReplyChant(Spell)); - // `Du hast folgenden Wert in **${Spell.Name}**: ${Spell.Level}` - //); - } - } - } - ); - } catch (e) { - throw e; - } + console.log(message.author.tag); + db.find({ user: message.author.tag }, (err, docs) => { + if (docs.length === 0) { + return message.reply(findMessage('NOENTRY')); + } + Character = docs[0].character; + if (args.length === 0) { + return message.reply(ReplyChantList(createChantList(Character))); //?+ + } + const Spell = getChant({ + Character: Character, + chant_name: args[0], + }); + if (!Spell) { + return message.reply(findMessage('SPELL_UNKNOWN')); + } + return message.reply(ReplyChant(Spell)); + }); }, }; + +const createChantList = (Character = {}) => { + if (!Character || !Character.hasOwnProperty('chants')) return; + let ChantList = []; + + // todo: send 'chant' to getChant() so we can filter out blessings. + Character.chants.forEach(chant => ChantList.push(getChant({ Character: Character, chant_name: chant.id }))); + return ChantList.filter(value => value !== undefined); //?+ +}; + const ReplyChantList = (ChantList = []) => { if (!ChantList) return; - - return `${ChantList.map(s => `${s.Name} (${s.Level})`).join('\n')}`; + return `${ChantList.map(chant => `${chant.name} ${chant.level ? `(${chant.level})` : ''}`).join('\n')}`; }; const ReplyChant = (Chant = {}) => { if (!Chant) return; + return `Deine Werte für ${Chant.name} ${Chant.level ? '(' + Chant.level + ')' : ''} sind: - return `Deine Werte für ${Chant.Name} (${Chant.Level}) sind: ${Chant.Attributes.map(attribute => `${attribute.Name}: ${attribute.Level}`).join(' ')} `; }; - -const createChantList = (Character = {}) => { - if (!Character || !Character.hasOwnProperty('spells')) return; - let ChantList = []; - Character.spells.forEach(chant => - ChantList.push(getChant({ Character: Character, spell_name: chant.id })) - ); - return ChantList.filter(value => value !== undefined); //?+ -}; - -const s = require('./Spells'); -const user = 'hmpf1992#1074'; -//const user = 'Jens#5449'; -const message = { - author: { - tag: user, - }, - reply: function (e) { - console.log(e); - }, -}; -const args = ['armatrutz']; -s.exec(message, args); diff --git a/commands/Skill.js b/commands/Skill.js index f8f623e..d0f3f44 100644 --- a/commands/Skill.js +++ b/commands/Skill.js @@ -1,31 +1,24 @@ const globals = require('../globals'); const db = globals.db; -const { findMessage }= require('@dsabot/findMessage'); +const { findMessage } = require('@dsabot/findMessage'); const { getSkill } = require('@dsabot/getSkill'); module.exports = { - name: 'skill', - description: 'Zeigt dir deinen Fertigkeitswert im jeweiligen Talent.', - aliases: [], - usage: '', - needs_args: true, + name: 'skill', + description: 'Zeigt dir deinen Fertigkeitswert im jeweiligen Talent.', + aliases: [], + usage: '', + needs_args: true, - async exec(message, args) { - try { - db.find({ - user: message.author.tag, - }, function(err, docs) { - if (docs.length === 0) { - return message.reply(findMessage('NOENTRY')); - } - else { - const Skill = getSkill({Character: docs[0].character, args: args}); - if(!Skill) { return message.reply(findMessage('TALENT_UNKNOWN'));} - return message.reply(`Du hast folgenden Wert in **${Skill.Name}**: ${Skill.Level}`) - } - }); - } - catch (e) { - throw e; - } - }, -}; \ No newline at end of file + async exec(message, args) { + db.find({ user: message.author.tag }, (err, docs) => { + if (docs.length === 0) { + return message.reply(findMessage('NOENTRY')); + } + const Skill = getSkill({ Character: docs[0].character, args: args }); + if (!Skill) { + return message.reply(findMessage('TALENT_UNKNOWN')); + } + return message.reply(`Du hast folgenden Wert in **${Skill.Name}**: ${Skill.Level}`); + }); + }, +}; diff --git a/commands/Spells.js b/commands/Spells.js index 6bacbd1..afc6740 100644 --- a/commands/Spells.js +++ b/commands/Spells.js @@ -11,50 +11,33 @@ module.exports = { needs_args: true, async exec(message, args) { - try { - console.log(message.author.tag); - db.find( - { - user: message.author.tag, - }, - function (err, docs) { - if (docs.length === 0) { - return message.reply(findMessage('NOENTRY')); - } else { - Character = docs[0].character; - if (args.length === 0) { - //console.log(ReplySpellList(createSpellList(Character))); - return message.reply(ReplySpellList(createSpellList(Character))); //?+ - } else { - const Spell = getSpell({ - Character: Character, - spell_name: args[0], - }); - if (!Spell) { - return message.reply(findMessage('SPELL_UNKNOWN')); - } - return message.reply(ReplySpell(Spell)); - // `Du hast folgenden Wert in **${Spell.Name}**: ${Spell.Level}` - //); - } - } - } - ); - } catch (e) { - throw e; - } + db.find({ user: message.author.tag }, (err, docs) => { + if (docs.length === 0) { + return message.reply(findMessage('NOENTRY')); + } + Character = docs[0].character; + if (args.length === 0) { + return message.reply(ReplySpellList(createSpellList(Character))); + } + const Spell = getSpell({ + Character: Character, + spell_name: args[0], + }); + if (!Spell) return message.reply(findMessage('SPELL_UNKNOWN')); + return message.reply(ReplySpell(Spell)); + }); }, }; -const ReplySpellList = (SpellList = []) => { - if (!SpellList) return; +const ReplySpellList = (SpellList = []) => { + if (!SpellList) return findMessage('NO_SPELLS'); return `${SpellList.map(s => `${s.Name} (${s.Level})`).join('\n')}`; }; const ReplySpell = (Spell = {}) => { if (!Spell) return; - return `Deine Werte für ${Spell.Name} (${Spell.Level}) sind: + ${Spell.Attributes.map(attribute => `${attribute.Name}: ${attribute.Level}`).join(' ')} `; }; @@ -62,31 +45,21 @@ const ReplySpell = (Spell = {}) => { const createSpellList = (Character = {}) => { if (!Character || !Character.hasOwnProperty('spells')) return; let SpellList = []; - Character.spells.forEach(spell => - SpellList.push(getSpell({ Character: Character, spell_name: spell.id })) - ); + Character.spells.forEach(spell => SpellList.push(getSpell({ Character: Character, spell_name: spell.id }))); return SpellList.filter(value => value !== undefined); //?+ }; - -const s = require('./Spells'); +/* +//const s = require('./Spells'); +const c = require('./Cast'); const user = 'hmpf1992#1074'; //const user = 'Jens#5449'; const message = { - author: { - tag: user, - }, + author: { tag: user }, reply: function (e) { console.log(e); }, }; -const args = ['armatrutz']; -s.exec(message, args); - -const createChantList = (Character = {}) => { - if (!Character || !Character.hasOwnProperty('chants')) return; - let ChantList = []; - Character.chants.forEach(chant => - ChantList.push(getChant({ Character: Character, spell_name: chant.id })) - ); - return ChantList.filter(value => value !== undefined); //?+ -}; +const args = ['fulminictus']; +//s.exec(message, args); +c.exec(message, args); +*/ diff --git a/commands/Talent.js b/commands/Talent.js index 220c76a..3467ea3 100644 --- a/commands/Talent.js +++ b/commands/Talent.js @@ -1,101 +1,85 @@ const globals = require('../globals'); const Discord = require('discord.js'); const db = globals.db; -const { roll } = require('@dsabot/Roll'); -const { findMessage } = require('@dsabot/findMessage'); +const { roll } = require('@dsabot/Roll'); +const { findMessage } = require('@dsabot/findMessage'); const { getSkill } = require('@dsabot/getSkill'); const { CalculateQuality } = require('@dsabot/CalculateQuality'); const { CompareResults } = require('@dsabot/CompareResults'); +const { CreateResultTable } = require('@dsabot/CreateResultTable'); module.exports = { - name: 'talent', - description: ' Du machst eine Fertigkeitsprobe.\n' + - ' Es werden drei Würfel auf deine Eigenschaftswerte geworfen. Hast du Boni auf dein Talent und/oder' + - ' ist der Wurf erleichtert oder erschwert, wird dies in die Berechnung einbezogen.', - aliases: ['t'], - usage: ' [<-Erschwernis> / <+Erleichterung>]', - needs_args: true, - async exec(message, args) { - try { - db.find({ - user: message.author.tag, - }, function (err, docs) { - if (docs.length === 0) { - return message.reply(findMessage('NOENTRY')); - } - if (!isNaN(args[0])) { - return message.reply(findMessage('WRONG_ARGUMENTS')); - } else { - - const Skill = getSkill({Character: docs[0].character, args: args}); - if(!Skill) { return message.reply(findMessage('TALENT_UNKNOWN'));} - - const Attributes = Skill.Attributes; - const DiceThrow = roll(3, 20, message.author.tag).dice; - const Bonus = parseInt(args[1]) || 0; - let { Passed, - CriticalHit, - Fumbles, - PointsUsed, - PointsRemaining } = CompareResults( - DiceThrow, - Attributes.map(attr => attr.Level), - Bonus, - Skill.Level); - const Reply = new Discord.MessageEmbed(); - Reply.addFields({ - name: `Du würfelst auf das Talent **${Skill.Name}** (Stufe ${Skill.Level} + ${Bonus})`, - value: CreateTable({Attributes: Attributes, Throws: DiceThrow, PointsUsed: PointsUsed}), - inline: false - }); - if (Fumbles >= 2) { - Reply.setColor('#900c3f'); - Reply.addFields({ - name: findMessage('TITLE_CRIT_FAILURE'), - value: findMessage('MSG_CRIT_FAILURE'), - inline: false - }); - } else if (CriticalHit >= 2) { - Reply.setColor('#1E8449'); - Reply.addFields({ - name: findMessage('TITLE_CRIT_SUCCESS'), - value: findMessage('MSG_CRIT_SUCCESS'), - inline: false - }); - } else if (Passed < 3) { - Reply.addFields({ - name: findMessage('TITLE_FAILURE'), - value: `${(Passed === 0) ? 'Keine Probe' : `nur ${Passed}/3 Proben`} erfolgreich. 😪`, - inline: false - }); - } else { - Reply.addFields({ - name: findMessage('TITLE_SUCCESS'), - value: `Dein verbleibender Bonus: ${PointsRemaining}/${Skill.Level} (QS${CalculateQuality(PointsRemaining)})`, - inline: false - }); - } - - message.reply(Reply); - } - }); - } catch (e) { - throw e; - } - }, + name: 'talent', + description: + ' Du machst eine Fertigkeitsprobe.\n' + + ' Es werden drei Würfel auf deine Eigenschaftswerte geworfen. Hast du Boni auf dein Talent und/oder' + + ' ist der Wurf erleichtert oder erschwert, wird dies in die Berechnung einbezogen.', + aliases: ['t'], + usage: ' [<-Erschwernis> / <+Erleichterung>]', + needs_args: true, + async exec(message, args) { + db.find({ user: message.author.tag }, (err, docs) => { + if (docs.length === 0) { + return message.reply(findMessage('NOENTRY')); + } + if (!isNaN(args[0])) { + return message.reply(findMessage('WRONG_ARGUMENTS')); + } + + const Skill = getSkill({ Character: docs[0].character, args: args }); + if (!Skill) { + return message.reply(findMessage('TALENT_UNKNOWN')); + } + + const Attributes = Skill.Attributes; + const DiceThrow = roll(3, 20, message.author.tag).dice; + const Bonus = parseInt(args[1]) || 0; + let { Passed, CriticalHit, Fumbles, PointsUsed, PointsRemaining } = CompareResults( + DiceThrow, + Attributes.map(attr => attr.Level), + Bonus, + Skill.Level + ); + const Reply = new Discord.MessageEmbed(); + Reply.addFields({ + name: `Du würfelst auf das Talent **${Skill.Name}** (Stufe ${Skill.Level} + ${Bonus})`, + value: CreateResultTable({ + Attributes: Attributes, + Throws: DiceThrow, + PointsUsed: PointsUsed, + Bonus: Bonus, + }), + inline: false, + }); + if (Fumbles >= 2) { + Reply.setColor('#900c3f'); + Reply.addFields({ + name: findMessage('TITLE_CRIT_FAILURE'), + value: findMessage('MSG_CRIT_FAILURE'), + inline: false, + }); + } else if (CriticalHit >= 2) { + Reply.setColor('#1E8449'); + Reply.addFields({ + name: findMessage('TITLE_CRIT_SUCCESS'), + value: findMessage('MSG_CRIT_SUCCESS'), + inline: false, + }); + } else if (Passed < 3) { + Reply.addFields({ + name: findMessage('TITLE_FAILURE'), + value: `${Passed === 0 ? 'Keine Probe' : `nur ${Passed}/3 Proben`} erfolgreich. 😪`, + inline: false, + }); + } else { + Reply.addFields({ + name: findMessage('TITLE_SUCCESS'), + value: `Dein verbleibender Bonus: ${PointsRemaining}/${Skill.Level} (QS${CalculateQuality( + PointsRemaining + )})`, + inline: false, + }); + } + message.reply(Reply); + }); + }, }; - -function Pad(Number = 0) { - return Number.toString().padStart(1, ' '); -} - -const CreateTable = ({Attributes: Attributes, Throws: Throws, PointsUsed: PointsUsed}) => { - return ` - \`\`\` - ${' '.padEnd(15)} ${Attributes.map(attr => `${attr.Name}`.padStart(5)).join('\t|\t')}\t| - ${'Dein Wert'.padEnd(15)} ${Attributes.map(attr => `${attr.Level}`.padStart(5)).join('\t|\t')}\t| - ${'Dein Wurf'.padEnd(15)} ${Throws.map(Throw => `${Throw}`.padStart(5)).join('\t|\t')}\t| - ${'Abzüge'.padEnd(15)} ${PointsUsed.map(Points => `${Points}`.replace(0,'--').padStart(5)).join('\t|\t')}\t| - ${'Gesamt'.padEnd(15)} ${PointsUsed.reduce((acc,cur) => acc+cur).toString().padStart(5)} - \`\`\` - `; -}; \ No newline at end of file diff --git a/data/Chants.js b/data/Chants.js index 948cab1..f8bab4e 100644 --- a/data/Chants.js +++ b/data/Chants.js @@ -3,666 +3,474 @@ module.exports = [ id: 'bannderdunkelheit', name: 'Bann der Dunkelheit', attributes: ['MU', 'KL', 'CH'], - cost: { - initial: 4, - additional: { amount: 2, interval: 1, unit: 'Minute' }, - }, + cost: { initial: 4, additional: { amount: 2, interval: 1, unit: 'Minute' } }, effect: { description: 'Aus der Hand des Geweihten strahlt ein helles Licht. Das Licht zählt regeltechnisch als Sonnenlicht.', - duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', + duration: {}, + instant: false, + pulse: true, }, + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'bannderfurcht', name: 'Bann der Furcht', attributes: ['IN', 'CH', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Durch diese Liturgie wird pro QS eine Stufe des Zustands Furcht aufgehoben.', duration: {}, - unit: null, - }, - chant: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: true, + pulse: false, }, + chant: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'banndeslichts', name: 'Bann des Lichts', attributes: ['MU', 'KL', 'CH'], - cost: { - initial: 16, - additional: { amount: 8, interval: 5, unit: 'Minuten' }, - }, + cost: { initial: 16, additional: { amount: 8, interval: 5, unit: 'Minuten' } }, effect: { description: 'Um den Geweihten herum bildet sich eine Kugel aus Dunkelheit mit einem Durchmesser von QS x 3 Schritt. Pro QS erschweren sich die Sichtverhältnisse um eine Stufe. Natürliche und magische Lichtquellen können die Dunkelheit nicht erhellen. Bei karmalen Lichtquellen entscheidet die höhere QS (wie bei einer Vergleichsprobe), ob das Licht zu sehen ist oder nicht. Hierbei gilt alles oder nichts Das Licht wird nicht um die QS der Liturgie gedämpft, sondern die höhere QS entscheidet darüber ob Licht zu sehen ist oder nicht. Für den Geweihten werden die Sichtverhältnisse durch die Liturgie nicht erschwert. Der Geweihte muss vor dem Wirken der Liturgie entscheiden, ob die Zone der Dunkelheit an Ort und Stelle verbleiben oder sich mit ihm als Zentrum bewegen soll.', - duration: { amount: 5, modifier: null, unit: 'Minuten' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + duration: {}, + instant: false, + pulse: true, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'blendstrahl', name: 'Blendstrahl', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Der Betroffene wird geblendet. Es erhält eine Stufe des Zustands Verwirrung.', duration: { amount: 1, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, - }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'ehrenhaftigkeit', name: 'Ehrenhaftigkeit', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Ehrenhaft bedeutet in diesem Fall, dass der Betroffene sich an die Gebote des Geweihten hält. Dies kann je nach Auslegung und Kultur bedeuten, dass der Betroffene bei Patzern des Gegners auf weitere Angriffe verzichtet, nicht von hinten angreift, dem Gegner die Chance gibt, eine verlorene Waffe wieder aufzusammeln, auf Waffengifte verzichtet usw.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'entzifferung', name: 'Entzifferung', attributes: ['KL', 'KL', 'IN'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Die Textmenge richtet sich nach der QS. Für jede QS kann er fünf Foliantenseiten in normaler Schriftgröße entziffern.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, - }, - chant: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'ermutigung', name: 'Ermutigung', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Das Ziel wird zuversichtlicher und mutiger. Je nach QS erhält es verschiedene Boni. Die Boni sind kumulativ, d.h. bei QS 3 hat das Ziel insgesamt MU +2 und AT +1.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, - }, - chant: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'fallinsnichts', name: 'Fall ins Nichts', attributes: ['MU', 'IN', 'GE'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Für jede QS kann der Geweihte drei Schritt Fallschaden ignorieren.', duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, - }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'friedvolleaura', name: 'Friedvolle Aura', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Um den Geweihten anzugreifen, ist eine Probe auf Willenskraft (Bedrohungen standhalten) des Gegners notwendig, bei der er mehr QS haben muss als der Geweihte. Ist diese Probe nicht erfolgreich, kann der Angriff nicht ausgeführt werden. Gelingt sie, so ist die Attacke gegen den Geweihten dennoch um QS der Liturgie erschwert. Die Wirkung der Liturgie bezieht sich nur auf den Geweihten. Während der Wirkung der Liturgie kann der Geweihte keine Angriffe (Attacke, Fernkampf) oder sonstige offensive Handlungen gegen seine Feinde ausführen, wohl aber seine Kampfgefährten mit Handlungen unterstützen.', duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, - }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'giftbann', name: 'Giftbann', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 2, - additional: { amount: 2, interval: 1, unit: 'Giftstufe(n)' }, - }, + cost: { initial: 2, additional: { amount: 2, interval: 1, unit: 'Giftstufe(n)' } }, effect: { description: 'Der Giftbann neutralisiert ein Gift. Die maximale Giftstufe darf die QS nicht übersteigen, sonst wirkt die Liturgie nicht und gilt als misslungen.', duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'goettlicherfingerzeig', name: 'Göttlicher Fingerzeig', attributes: ['KL', 'IN', 'IN'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Voraussetzung ist, dass ein solcher Gegenstand überhaupt in Reichweite liegt. Dies kann z. B. ein verborgener Schlüssel für eine Truhe, ein Zettel mit Hinweisen oder ein benötigtes improvisiertes Werkzeug sein. Ist der Gegenstand durch Magie oder karmales Wirken verborgen, kann der Geweihte das Objekt nicht mittels dieser Liturgie entdecken. Der Gegenstand darf sich maximal QS Schritt vom Geweihten entfernt.', duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'goettlicheszeichen', name: 'Göttliches Zeichen', attributes: ['IN', 'IN', 'CH'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Das Zeichen äußert sich z. B. als Donnergrollen, obwohl keine Wolken am Himmel zu sehen sind (Rondra), das Schnattern eines Storches (Peraine) oder als kurzer Moment der Stille (Boron). Innerhalb der Zone der Liturgie können Personen das göttliche Zeichen wahrnehmen. Der Radius der Zone beträgt QS x 10 in Schritt. Bei Proben auf Bekehren & Überzeugen kann der Meister eine Erleichterung von 1 gewähren, wenn der Geweihte das Zeichen bei der Anwendung miteinbezieht.', duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'heilsegen', name: 'Heilsegen', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 4, - additional: { amount: 1, interval: 1, unit: 'LeP' }, - }, + cost: { initial: 4, additional: { amount: 1, interval: 1, unit: 'LeP' } }, effect: { description: 'Der Betroffene erhält innerhalb von 5 Minuten nach dem Wirken der Liturgie verlorene LeP in Höhe der verwendeten KaP zurück. Der Geweihte kann maximal so viele KaP einsetzen, wie er FW hat. Wird die Liturgie vor dem Ablauf der durch den Konstitutionswert angegebenen Frist für den Tod eines Helden begonnen, kann er gerettet werden. Wird die Liturgie jedoch unterbrochen, überlebt der Patient danach nur noch die verbliebenen Kampfrunden.', duration: {}, - unit: null, - }, - chant: { - duration: { amount: 16, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: true, + pulse: false, }, + chant: { duration: { amount: 16, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'kleinerbannwideruntote', name: 'Kleiner Bann wider Untote', attributes: ['MU', 'MU', 'CH'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Der Bann verursacht 2W6+(QS x2) SP gegen ein untotes Wesen. Der Bann trifft automatisch sein Ziel und dieses kann sich dagegen nicht verteidigen.', duration: {}, - unit: null, - }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: true, + pulse: false, }, + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'kleinerbannstrahl', name: 'Kleiner Bannstrahl', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Bannstrahl richtet gegen einen Dämon 2W6+(QS x2) SP an. Gegen Dämonen aus Blakharaz’ Domäne wird der Schaden verdoppelt. Der Bannstrahl trifft automatisch sein Ziel und dieses kann sich dagegen nicht verteidigen. Der kleine Bannstrahl ist nicht davon abhängig, ob der Himmel zu sehen ist. Der Strahl entsteht direkt beim Dämon, auf den der Strahl wirken soll.', duration: {}, - unit: null, - }, - chant: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: true, + pulse: false, }, + chant: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'krankheitsbann', name: 'Krankheitsbann', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 2, - additional: { amount: 2, interval: 1, unit: 'Krankheitsstufe(n)' }, - }, + cost: { initial: 2, additional: { amount: 2, interval: 1, unit: 'Krankheitsstufe(n)' } }, effect: { description: 'Diese Liturgie heilt Krankheiten (die bisher erlittenen Auswirkungen werden nicht geheilt). Die maximale Krankheitsstufe darf die QS nicht übersteigen, sonst wirkt die Liturgie nicht und gilt als misslungen. Die Liturgie heilt auch alle Symptome der Krankheit, aber keine bis dahin entstandenen Schäden (LeP-Verlust, Narben usw.).', duration: {}, - unit: null, - }, - chant: { - duration: { amount: 16, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: true, + pulse: false, }, + chant: { duration: { amount: 16, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'lautlos', name: 'Lautlos', attributes: ['IN', 'IN', 'GE'], - cost: { - initial: 4, - additional: { amount: 2, interval: 1, unit: 'Minute' }, - }, + cost: { initial: 4, additional: { amount: 2, interval: 1, unit: 'Minute' } }, effect: { description: 'Proben auf Verbergen (Schleichen) sind um QS erleichtert.', - duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + duration: {}, + instant: false, + pulse: true, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'magieschutz', name: 'Magieschutz', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 8, - additional: { amount: 4, interval: 10, unit: 'Minuten' }, - }, + cost: { initial: 8, additional: { amount: 4, interval: 10, unit: 'Minuten' } }, effect: { description: 'Er erhält einen Bonus von QS –1 auf SK und ZK (mindestens jedoch 1 Punkt) gegen magische Effekte.', - duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + duration: {}, + instant: false, + pulse: true, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'magiesicht', name: 'Magiesicht', attributes: ['KL', 'IN', 'IN'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Mit dieser Liturgie lässt sich aktives magisches Wirken auf Gegenständen und Personen erkennen. Je nach Stärke der astralen Kräfte im Objekt kann die Probe erleichtert oder erschwert werden. Je nach QS können dabei nachfolgende Analysen mittels des Zaubers ANALYS oder entsprechenden Liturgien beeinflusst werden. Der Geweihte kann nur ein ausgewähltes Wesen oder Objekt in Reichweite untersuchen. Er hat keine Rundumsicht.', duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'mondsicht', name: 'Mondsicht', attributes: ['KL', 'KL', 'IN'], - cost: { - initial: 2, - additional: { amount: 1, interval: 10, unit: 'Minuten' }, - }, + cost: { initial: 2, additional: { amount: 1, interval: 10, unit: 'Minuten' } }, effect: { description: 'Erschwernisse der Sichtverhältnisse durch Dunkelheit werden um QS –1 Stufen gesenkt (mindestens jedoch 1', - duration: { amount: 1, modifier: null, unit: 'Minute' }, - unit: null, - }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', + duration: {}, + instant: false, + pulse: true, }, + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, }, { id: 'mondsilberzunge', name: 'Mondsilberzunge', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Held wirkt vertrauenerweckend. Er erhält eine Erleichterung von QS auf die Fertigkeiten Überreden und Handel (Feilschen).', duration: { amount: 3, modifier: 'QS', unit: 'Minute' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 1, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - }, { + chant: { duration: { amount: 1, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'objektsegen', name: 'Objektsegen', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Mit dieser Liturgie werden für Götterdienste benötigte Materialien (z. B. Salbungsöl eines Borongeweihten, das Saatgut eines Perainegeweihten oder Sternenstaub bei Phexgeweihten) gesegnet. Der Gegenstand zählt nicht als geweiht, sondern nur als gesegnet.', duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'ortderruhe', name: 'Ort der Ruhe', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 4, - additional: {}, - }, + cost: { initial: 4, additional: {} }, effect: { description: 'Innerhalb der Zone werden Geräusche gedämpft. Der Radius der Zone beträgt QS x 3 Schritt. Proben gegen Sinnesschärfe (Wahrnehmen), um leise Geräusche wie Flüstern zu hören, sind innerhalb der Zone um QS erschwert. Die Zone verbleibt an Ort und Stelle. Geräusche, die aus der Zone dringen, bleiben gedämpft, Geräusche, die in die Zone eindringen, werden gedämpft.', duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'pflanzenwuchs', name: 'Pflanzenwuchs', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Die Liturgie lässt eine maximal buschgroße Pflanze übernatürlich schnell wachsen. Pro QS wächst die Pflanze 30 % schneller als für die Gattung typisch.', duration: { amount: 1, modifier: null, unit: 'Jahr' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 16, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 16, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'rabenruf', name: 'Rabenruf', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Geweihte ruft bis zu QS x 3 Raben aus einem Radius von QS x 3 Meilen herbei. Die Vögel verhalten sich ihm gegenüber zutraulich. Der Geweihte kann einen der Raben dazu benutzen, einen kleinen Gegenstand wie einen Ring zu transportieren, maximal bis zu einer Reichweite von QS x 3 Meile. Der Rabe findet den Zielort in der Regel automatisch. Es können maximal so viele Raben zum Geweihten fliegen, wie sich zu diesem Zeitpunkt in der Reichweite der Liturgie befinden.', duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 16, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 16, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'schlaf', name: 'Schlaf', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Geweihte betäubt den Betroffenen. Erreicht dieser so Betäubung Stufe IV, schläft er ein und ist vor Ablauf der Wirkungsdauer nur durch großen Lärm, kräftiges Anstoßen oder Ähnliches zu wecken. Ungestört schläft er, bis er auf natürlichem Wege erwacht.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'schlangenstab', name: 'Schlangenstab', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Die Schlange beschützt den Geweihten mit den ihr zur Verfügung stehenden Mitteln und folgt ihm. Stirbt die Schlange, verwandelt sie sich wieder zurück in das Objekt. Die Schlange gilt als gesegnet wie durch einen Objektsegen.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'schlangenzunge', name: 'Schlangenzunge', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Für Umstehende klingt dies wie zischende Laute. Bei der Darstellung eines solchen Gespräches sollte bedacht werden, dass Schlangen einen tierischen Verstand haben und die Welt anders wahrnehmen als Menschen.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Chant', property: '' }, + }, + { id: 'schmerzresistenz', name: 'Schmerzresistenz', attributes: ['MU', 'IN', 'KO'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Alle Effekte der Stufen des Zustands Schmerz können ignoriert werden, bis auf Stufe IV (ab Stufe IV wird der Geweihe von den ganz normalen Auswirkungen des Zustands betroffen).', duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, + }, + { id: 'schutzderwehrlosen', name: 'Schutz der Wehrlosen', attributes: ['MU', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Geweihte kann einen Kämpfer, der eine wehr- oder schutzlose Person angreift oder angreifen will, herausfordern. Der Herausgeforderte lässt von seinem Opfer ab und greift stattdessen den Rondrageweihten an.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 1, unit: 'Aktion' }, type: 'Chant', property: '' }, + }, + { id: 'sternenglanz', name: 'Sternenglanz', attributes: ['KL', 'IN', 'CH'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Es kann so einen um QS x 10 % höheren Preis erzielen. Misstrauische Käufer können diese Täuschung durchschauen, wenn ihnen eine vergleichende Probe auf Sinnesschärfe (Suchen) erschwert um QS +2 gelingt.', duration: { amount: 15, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 2, unit: 'Aktion' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 2, unit: 'Aktion' }, type: 'Chant', property: '' }, + }, + { id: 'wahrheit', name: 'Wahrheit', attributes: ['MU', 'KL', 'IN'], - cost: { - initial: 16, - additional: {}, - }, + cost: { initial: 16, additional: {} }, effect: { description: 'Der Betroffene muss dem Geweihten (und nur ihm) wahrheitsgemäß auf jede seiner Frage antworten, so lange die Wirkungsdauer der Liturgie anhält. Das Opfer der Liturgie weiß, was es sagt.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + instant: false, + pulse: false, }, - chant: { - duration: { amount: 8, unit: 'Aktion' }, - type: 'Chant', - property: '', - }, - },{ + chant: { duration: { amount: 8, unit: 'Aktion' }, type: 'Chant', property: '' }, + }, + { id: 'wieselflink', name: 'Wieselflink', attributes: ['IN', 'IN', 'GE'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Geweihte wird flinker und schneller. Je nach QS erhält er verschiedene Boni. Die Boni sind kumulativ, d.h. bei QS 5 hat der Geweihte insgesamt GE +3, GS + 1 und AW +1. Durch die Steigerung der GE können auch die Schadensschwellen bei Kampftechniken mit GE betroffen sein. Der Geweihte macht also eventuell mehr Schaden mit einigen Waffen.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, - }, - chant: { - duration: { amount: 2, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 2, unit: 'Aktion' }, type: 'Chant', property: '' }, }, { id: 'wundersameverstaendigung', name: 'Wundersame Verständigung', attributes: ['KL', 'KL', 'IN'], - cost: { - initial: 8, - additional: {}, - }, + cost: { initial: 8, additional: {} }, effect: { description: 'Der Geweihte erhält die Stufen in der Sprache, die er gerade für seine Kommunikation benötigt. Es ist nicht notwendig, dass der Geweihte schon einmal etwas von der Sprache gehört oder gelesen hat.', duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, - unit: null, - }, - chant: { - duration: { amount: 2, unit: 'Aktion' }, - type: 'Chant', - property: '', + instant: false, + pulse: false, }, + chant: { duration: { amount: 2, unit: 'Aktion' }, type: 'Chant', property: '' }, }, ]; diff --git a/data/Spells.js b/data/Spells.js index cc74a69..1d52c8c 100644 --- a/data/Spells.js +++ b/data/Spells.js @@ -1,15 +1,57 @@ +/* + { + id: 'invocatiomanor', // id of the spell + name: 'Invocatio Manor', // the Name of the spell + attributes: [ + 'MU', // shorthand form of attributes for skill checks. + 'CH', + 'KO' + ], + modified_by: [ // is this spell modified when casted on another person? + ], + cost: { + initial: 32, // this many astral points does the spell cost upon casting. + additional: { // any additional needed astral points below: + amount: null, // it takes this many astral points ... + interval: null, // in a given interval + unit: null // is the interval 'minutes' or 'combat rounds'? maybe 'hours'? + } + }, + effect: { + description: '', // a short description what the spell does. + duration: { // how long does the spell last? see pulse or instant, if _that's_ the case. + amount: 3, // in this example the duration lasts 3x QS Minutes. + modifier: 'QS', + unit: 'Minute' + }, + pulse: false, // is this a pulsiing spell? (so does it need astral points after initial cast?) + instant: false, // is this an 'instant' action like throwing a fireball? + }, + talent: null, // can the spell be modified with another talent? elves do this with their songs. + spell: { + duration: { + amount: 8, // casting the spell takes this long. (8 hours in this case.) + unit: 'Stunden' + }, + type: 'Ritual', // what is the spell-type? + property: 'Sphaeren' // what is the property of the spell? Elemental,Spheres,Illusion... + }, +}; +*/ + module.exports = [ { id: 'adlerauge', name: 'Adlerauge', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' }, type: 'AsP' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: 'Das Talent Sinnesschärfe wird während der Wirkungsdauer um QS +3 des Zaubers erhöht.', - duration: { amount: 5, modifier: 'aufrechterhaltend', unit: 'Minuten' }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Heilung' }, @@ -19,12 +61,13 @@ module.exports = [ name: 'Analys Arkanstruktur', attributes: ['KL', 'KL', 'IN'], modified_by: [], - cost: { initial: 16, additional: {}, type: 'AsP' }, + cost: { initial: 16, additional: {} }, effect: { description: 'Der Zauberer erhält detaillierte Hinweise, ob das Objekt magisch ist und falls ja, wie seine magische Struktur beschaffen ist. Durch die so gesammelten Informationen kann der Zauberer bei einer Magischen Analyse mehr QS ansammeln als üblich. Jede QS des Analys entspricht der Höhe der maximal ansammelbaren QS der Probe auf Magiekunde (unterschiedliche Anwendungsgebiete) für die Magische Analyse.', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, spell: { duration: { amount: 32, unit: 'Aktionen' }, type: 'Spell', property: 'Hellsicht' }, @@ -34,12 +77,13 @@ module.exports = [ name: 'Armatrutz', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { initial: 4, additional: null, type: 'AsP' }, + cost: { initial: 4, additional: null }, effect: { description: 'Die Haut des Zaubernden verhärtet sich, ohne ihre Flexibilität zu verlieren. So erhält er einen natürlichen Rüstungsschutz, der sich auf getragene Rüstung aufaddiert, ohne die Belastung zu erhöhen. Die Höhe des gewünschten zusätzlichen Rüstungsschutzes muss der Zaubernde vor der Probe festlegen. Maximal ist ein zusätzlicher RS von 3 möglich.', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: 'Minuten', + pulse: false, + instant: false, }, talent: null, spell: { duration: { amount: 1, unit: 'Aktionen' }, type: 'Spell', property: 'Heilung' }, @@ -49,111 +93,89 @@ module.exports = [ name: 'Axxeleratus', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { initial: 8, additional: {}, type: 'AsP' }, + cost: { initial: 8, additional: {} }, effect: { description: 'Die Bewegungen des Verzauberten werden übernatürlich beschleunigt. Dies bringt folgende Erleichterungen: +1 Verteidigung, GS x 2, INI-Basiswert x 2. Gegner können Attacken und Fernkampfangriffe des Beschleunigten schlechter abwehren und erhalten auf Verteidigung eine Erschwernis von 2.', duration: { amount: 5, modifier: 'QS', unit: 'Kampfrunden' }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 1, unit: 'Aktionen' }, - type: 'Spell', - property: 'Heilung', - }, + spell: { duration: { amount: 1, unit: 'Aktionen' }, type: 'Spell', property: 'Heilung' }, }, { id: 'balsamsalabunde', name: 'Balsam Salabunde', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { initial: 4, additional: { amount: 1, interval: 1, unit: 'LeP' }, type: 'AsP' }, + cost: { initial: 4, additional: { amount: 1, interval: 1, unit: 'LeP' } }, effect: { description: 'Der Verzauberte erhält innerhalb von 6 Minuten nach dem Wirken des Zaubers verlorene LeP in Höhe der verwendeten AsP zurück. Der Zauberer kann maximal so viele AsP einsetzen, wie er FW hat. Für jede QS sinkt die Zeit um 1 Minute. Wird der Zauber vor dem Ablauf der durch den Konstitutionswert angegebenen Frist für den Tod eines Helden begonnen, kann er gerettet werden. Wird der Zauber jedoch unterbrochen, überlebt der Patient danach nur noch die verbliebenen Kampfrunden.', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 16, unit: 'Aktionen' }, - type: 'Spell', - property: 'Heilung', - }, + spell: { duration: { amount: 16, unit: 'Aktionen' }, type: 'Spell', property: 'Heilung' }, }, { id: 'bannbaladin', name: 'Bannbaladin', attributes: ['MU', 'IN', 'CH'], modified_by: ['ZK'], - cost: { initial: 8, additional: {}, type: 'asp' }, + cost: { initial: 8, additional: {} }, effect: { description: '', duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'blickindiegedanken', name: 'Blick in die Gedanken', attributes: ['MU', 'KL', 'IN'], modified_by: ['ZK'], - cost: { - initial: 8, - additional: { amount: 4, interval: 30, unit: 'Sekunden' }, - type: 'AsP', - }, + cost: { initial: 8, additional: { amount: 4, interval: 30, unit: 'Sekunden' } }, effect: { description: '', - duration: { amount: 30, modifier: 'aufrechterhaltend', unit: 'Sekunden' }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Hellsicht', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Hellsicht' }, }, { id: 'blitzdichfind', name: 'Blitz dich find', attributes: ['MU', 'IN', 'CH'], modified_by: ['ZK'], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'QS Kampfrunden', modifier: 'QS Kampfrunden', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 1, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 1, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'corpofesso', name: 'Corpofesso', attributes: ['KL', 'IN', 'KO'], modified_by: ['ZK'], - cost: { - initial: 16, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 16, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x2 Kampfrunden', modifier: 'QS x2 Kampfrunden', unit: null }, - unit: null, + duration: { amount: 2, modifier: 'QS', unit: 'Kampfrunden' }, + pulse: false, + instant: false, }, talent: null, spell: { @@ -167,51 +189,46 @@ module.exports = [ name: 'Disruptivo', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Spell', - property: 'Antimagie', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Spell', property: 'Antimagie' }, }, { id: 'duplicatus', name: 'Duplicatus', attributes: ['KL', 'IN', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x3 Kampfrunden', modifier: 'QS x3 Kampfrunden', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Kampfrunden' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Illusion', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Illusion' }, }, { id: 'falkenauge', name: 'Falkenauge', attributes: ['MU', 'KL', 'IN'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { - amount: 'Bis zum nächsten Schuss, maximal QS x2 Kampfrunden', - modifier: 'Bis zum nächsten Schuss, maximal QS x2 Kampfrunden', - unit: null, + amount: 2, + modifier: 'QS', + unit: 'Kampfrunden', }, - unit: null, + pulse: false, + instant: false, }, talent: null, spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: null }, @@ -221,101 +238,87 @@ module.exports = [ name: 'Flim Flam', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 2, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 2, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Spell', - property: 'Elementar', - }, + spell: { duration: { amount: 1, unit: 'Aktion' }, type: 'Spell', property: 'Elementar' }, }, { id: 'fulminictus', name: 'Fulminictus', attributes: ['KL', 'IN', 'KO'], modified_by: ['ZK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Spell', - property: 'Verwandlung', - }, + spell: { duration: { amount: 1, unit: 'Aktion' }, type: 'Spell', property: 'Verwandlung' }, }, { id: 'gardianum', name: 'Gardianum', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: '5 Minuten', modifier: '5 Minuten', unit: null }, - unit: null, + duration: { amount: 5, modifier: null, unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 1, unit: 'Aktion' }, - type: 'Spell', - property: 'Antimagie', - }, + spell: { duration: { amount: 1, unit: 'Aktion' }, type: 'Spell', property: 'Antimagie' }, }, { id: 'grossegier', name: 'Große Gier', attributes: ['MU', 'IN', 'CH'], modified_by: ['SK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 15 Minuten', modifier: 'QS x 15 Minuten', unit: null }, - unit: null, + duration: { amount: 15, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'harmlosegestalt', name: 'Harmlose Gestalt', attributes: ['KL', 'IN', 'CH'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Illusion', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Illusion' }, }, { id: 'hexengalle', name: 'Hexengalle', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, spell: { @@ -329,11 +332,12 @@ module.exports = [ name: 'Hexenkrallen', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Minuten', modifier: 'QS x 3 Minuten', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, spell: { @@ -347,65 +351,57 @@ module.exports = [ name: 'Horriphobos', attributes: ['MU', 'IN', 'CH'], modified_by: ['SK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Minuten', modifier: 'QS x 3 Minuten', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'ignifaxius', name: 'Ignifaxius', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Elementar', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Elementar' }, }, { id: 'invocatiominima', name: 'Invocatio Minima', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Sphaeren', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Sphaeren' }, }, { id: 'katzenaugen', name: 'Katzenaugen', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 2, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 2, additional: { amount: 1, interval: 10, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { @@ -419,11 +415,12 @@ module.exports = [ name: 'Krötensprung', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 2, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 2, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, spell: { @@ -437,119 +434,102 @@ module.exports = [ name: 'Manifesto', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Elementar', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Elementar' }, }, { id: 'manusmiracula', name: 'Manus Miracula', attributes: ['KL', 'FF', 'KK'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Telekinese', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Telekinese' }, }, { id: 'motoricus', name: 'Motoricus', attributes: ['KL', 'FF', 'KK'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Telekinese', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Telekinese' }, }, { id: 'nebelwand', name: 'Nebelwand', attributes: ['MU', 'KL', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 15 Minuten', modifier: 'QS x 15 Minuten', unit: null }, - unit: null, + duration: { amount: 15, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Elementar', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Elementar' }, }, { id: 'oculusillusionis', name: 'Oculus Illusionis', attributes: ['KL', 'IN', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Illusion', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Illusion' }, }, { id: 'odemarcanum', name: 'Odem Arcanum', attributes: ['MU', 'KL', 'IN'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: '1 Minute', modifier: '1 Minute', unit: null }, - unit: null, + duration: { amount: 1, modifier: null, unit: 'Minute' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Hellsicht', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Hellsicht' }, }, { id: 'paralys', name: 'Paralys', attributes: ['KL', 'IN', 'KO'], modified_by: ['ZK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 2 Minuten', modifier: 'QS x 2 Minuten', unit: null }, - unit: null, + duration: { amount: 2, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, spell: { @@ -563,87 +543,72 @@ module.exports = [ name: 'Penetrizzel', attributes: ['MU', 'KL', 'IN'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 1, unit: 'Minute' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Hellsicht', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Hellsicht' }, }, { id: 'psychostabilis', name: 'Psychostabilis', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 10, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Spell', - property: 'Heilung', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Spell', property: 'Heilung' }, }, { id: 'radau', name: 'Radau', attributes: ['KL', 'FF', 'KK'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 1, unit: 'Kampfrunde' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Telekinese', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Telekinese' }, }, { id: 'respondami', name: 'Respondami', attributes: ['MU', 'IN', 'CH'], modified_by: ['SK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 15 Minuten', modifier: 'QS x 15 Minuten', unit: null }, - unit: null, + duration: { amount: 15, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'salander', name: 'Salander', attributes: ['KL', 'IN', 'KO'], modified_by: ['ZK'], - cost: { - initial: 16, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 16, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Stunden', modifier: 'QS x 3 Stunden', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, + pulse: false, + instant: false, }, talent: null, spell: { @@ -657,29 +622,27 @@ module.exports = [ name: 'Sanftmut', attributes: ['MU', 'IN', 'CH'], modified_by: ['SK'], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Minuten', modifier: 'QS x 3 Minuten', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 2, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 2, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'satuariasherrlichkeit', name: 'Satuarias Herrlichkeit', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Stunden', modifier: 'QS x 3 Stunden', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Stunden' }, + pulse: false, + instant: false, }, talent: null, spell: { @@ -693,47 +656,42 @@ module.exports = [ name: 'Silentium', attributes: ['KL', 'FF', 'KK'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Spell', - property: 'Telekinese', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Spell', property: 'Telekinese' }, }, { id: 'somnigravis', name: 'Somnigravis', attributes: ['MU', 'IN', 'CH'], modified_by: ['SK'], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'QS x 3 Minuten', modifier: 'QS x 3 Minuten', unit: null }, - unit: null, + duration: { amount: 3, modifier: 'QS', unit: 'Minuten' }, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Spell', - property: 'Einfluss', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Spell', property: 'Einfluss' }, }, { id: 'spinnenlauf', name: 'Spinnenlauf', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { @@ -747,47 +705,42 @@ module.exports = [ name: 'Spurlos', attributes: ['KL', 'FF', 'KK'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, - spell: { - duration: { amount: 4, unit: 'Aktionen' }, - type: 'Spell', - property: 'Telekinese', - }, + spell: { duration: { amount: 4, unit: 'Aktionen' }, type: 'Spell', property: 'Telekinese' }, }, { id: 'transversalis', name: 'Transversalis', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', - duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + duration: {}, + pulse: false, + instant: true, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Spell', - property: 'Sphaeren', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Spell', property: 'Sphaeren' }, }, { id: 'visibili', name: 'Visibili', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: 4, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { @@ -801,11 +754,12 @@ module.exports = [ name: 'Wasseratem', attributes: ['KL', 'IN', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: 2, interval: 5, unit: 'Minuten' } }, effect: { description: '', - duration: { amount: 'aufrechterhaltend', modifier: 'aufrechterhaltend', unit: null }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { @@ -819,12 +773,13 @@ module.exports = [ name: 'Blut trinken', attributes: ['MU', 'IN', 'CH'], modified_by: [], - cost: { initial: 3, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 3, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Animist kann das Blut eines von ihm getöteten Kulturschaffenden trinken, um sich dessen letzte Lebenskräfte anzueignen. Dadurch kann der Animist QS LeP bei sich heilen, allerdings nur maximal bis zum eigenen Maximalwert. Der Einsatz dieser Fähigkeit dauert mindestens 2 Aktionen, nach Meisterentscheid auch noch länger.', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, spell: { duration: { amount: null, unit: 'Aktionen' }, type: null, property: null }, @@ -834,12 +789,13 @@ module.exports = [ name: 'Durch feste Materie', attributes: ['IN', 'IN', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Animist lässt eine Wesenheit in sich einfahren, die seinen physischen Körper und sein Traditionsartefakt durchscheinend werden lässt. Er kann sich während der Wirkungsdauer durch feste, unbelebte Materie und Objekte wie Wände, Türen und Tische, nicht aber durch lebende Wesen, hindurchbewegen. Der Animist ist während der Wirkungsdauer immun gegen profane Waffen, nicht jedoch gegen magische oder karmale Waffen oder Angriffe.', duration: { amount: 'QS x 2 KR', modifier: 'QS x 2 KR', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, spell: { duration: { amount: null, unit: 'Aktionen' }, type: null, property: null }, @@ -849,12 +805,13 @@ module.exports = [ name: 'Großer Sprung', attributes: ['IN', 'GE', 'KO'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Animist kann mit dieser Kraft erstaunlich hoch und weit springen. Die normale Sprungreichweite wird pro QS um 50 % erhöht. Pro KR kann der Animist mit 1 Aktion einen Sprungversuch durchführen.', duration: { amount: 'QS x 2 KR', modifier: 'QS x 2 KR', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, spell: { duration: { amount: null, unit: 'Aktionen' }, type: null, property: null }, @@ -864,20 +821,13 @@ module.exports = [ name: 'Erinnerungsmelodie', attributes: ['KL', 'IN', 'IN'], modified_by: [], - cost: { - initial: null, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: null, additional: { amount: 1, interval: 5, unit: 'Minuten' } }, effect: { description: 'Mit dem Lied ruft sich der Elf eine Erinnerung aus lang vergangener Zeit zurück.Für je ein Jahr, das das Ereignis zurückliegt, muss er 5 Minuten spielen.Zusätzlich spielt er so lange, wie die Situation dauert, an die er sich zurück entsinnen will.', - duration: { - amount: '1 AsP pro 5 Minuten', - modifier: '1 AsP pro 5 Minuten', - unit: null, - }, - unit: null, + duration: {}, + pulse: true, + instant: false, }, talent: null, spell: { duration: { amount: null, unit: 'Aktionen' }, type: null, property: null }, @@ -887,16 +837,13 @@ module.exports = [ name: 'Freundschaftslied', attributes: ['IN', 'CH', 'CH'], modified_by: [], - cost: { - initial: null, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: null, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Mit dem Freundschaftslied können zwei Elfen, die es gemeinsam spielen, ein festes Band der Freundschaft zwischeneinander weben. Dies ist nur einmal im Leben eines Elfen möglich.Es besteht aus drei einstündigen Strophen, die an drei aufeinanderfolgenden Tagen von beiden gemeinsam gespielt werden müssen. So miteinander verbundene Elfen spüren die Anwesenheit des anderen und können starke Emotionen des anderen auch auf größere Entfernungen wahrnehmen. Sie können gegenseitig den Zauberspruch BALSAM aufeinander wirken, selbst wenn sie keine AsP zur Verfügung haben. In solchen Fällen können sie mit dem Zauberspruch ihre Lebensenergie direkt auf den anderen übertragen.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: null, unit: 'Aktionen' }, type: null, property: null }, @@ -906,16 +853,13 @@ module.exports = [ name: 'Friedenslied', attributes: ['MU', 'IN', 'CH'], modified_by: [], - cost: { - initial: null, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: null, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Nach 5 Minuten des Spielens erzeugt dieses Lied eine Zone des Friedens um den Elfen herum (QS x 3 Schritt Radius). So lange er weiterspielt, verlieren Tiere und kulturschaffende Wesen das Interesse daran, mit Gewalt gegeneinander oder gegen den Elfen vorzugehen. Um trotzdem aktiv zu kämpfen, ist eine Fertigkeitsprobe auf Willenskraft, erschwert durch die QS x 2 in der Probe auf das Friedenslied fällig. Die Möglichkeit, sich zu verteidigen, ist durch das Friedenslied nicht eingeschränkt. Nicht betroffen sind widernatürliche Wesenheiten wie Untote, Dämonen, Elementare oder Golems.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 8, unit: 'Aktionen' }, type: null, property: null }, @@ -925,12 +869,13 @@ module.exports = [ name: 'Zaubermelodie', attributes: ['MU', 'IN', 'CH'], modified_by: [], - cost: { initial: 8, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 8, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Spielt der Elf ungestört eine Stunde lang diese Melodie, kann er sich in einen tranceartigen Zustand versetzen, in dem er sich in Einklang mit den astralen Strömungen der Umgebung bringen kann. Er erwacht nach einer halben Stunde aus der Trance. Wenn er aus der Trance erwacht, sind für ihn alle Proben auf Zaubersprüche und Rituale bis zum nächsten Sonnenaufgang erleichtert. Bei QS 1-3 um 1, bei QS 4-6 um 2', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 60, unit: 'Aktionen' }, type: null, property: null }, @@ -940,12 +885,13 @@ module.exports = [ name: 'Sorgenlied', attributes: ['MU', 'IN', 'IN'], modified_by: [], - cost: { initial: 2, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 2, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Elf flicht Fragen in das Lied ein, die er an einen guten Freund stellen möchte. Hierdurch kann er erfahren, ob sein Freund gesund, krank oder gar tot ist, ob er um sein Leben fürchtet oder ob er zufrieden und glücklich ist. Mit dem Lied sind nur allgemeine Eindrücke zu erzielen. Klar formulierte Gedankenbilder lassen sich so nicht übertragen. Je weiter der gesuchte Freund vom Sänger entfernt ist, desto länger dauert das Lied. Pro 100 Meilen muss er 5 Minuten singen, um ihn zu erreichen.', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'singen', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -955,12 +901,13 @@ module.exports = [ name: 'Melodie der Kunstfertigkeit', attributes: ['IN', 'IN', 'CH'], modified_by: [], - cost: { initial: 4, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 4, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Proben auf Handwerkstalente, die der Elf während der Melodie der Kunstfertigkeit nutzt, sind um QS des Rituals erleichtert.', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'singen', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -970,12 +917,13 @@ module.exports = [ name: 'Lied des Zauberschutzes', attributes: ['IN', 'CH', 'CH'], modified_by: [], - cost: { initial: 6, additional: { amount: null, interval: null, unit: null }, type: 'asp' }, + cost: { initial: 6, additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Elf verfügt über einen magischen Schutz, der regeltechnisch wie ein GARDIANUM wirkt. Der Schild ist allerdings nur auf seinen Körper beschränkt und hat eine Schildstärke von QS x 2. Der Schild hält, bis die Schildstärke auf 0 oder darunter gesunken ist, oder 30 Minuten vergangen sind (je nachdem, was zuerst eintritt).', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -985,16 +933,13 @@ module.exports = [ name: 'Lied des Windgeflüsters', attributes: ['IN', 'IN', 'CH'], modified_by: [], - cost: { - initial: '4 AsP', - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: '4 AsP', additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Elf kann sich vom Wind Bilder, Töne und Stimmungen schicken lassen. Sie ergeben kein klares, zusammenhängendes Bild, aber unter den Eindrücken können sich Informationen befinden, die dem Elf bei einer persönlichen Frage weiterhelfen können. Bei der nächsten Probe auf ein Wissenstalent, das der Lösung dieser Frage dient, erhält der Elf bei Teilproben auf KL eine Erleichterung von QS/2.', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1007,13 +952,13 @@ module.exports = [ cost: { initial: '3 AsP pro Zuhörer', additional: { amount: null, interval: null, unit: null }, - type: 'asp', }, effect: { description: 'Der Elf kann durch das Lied QS ausgewählten Zuhörern innerhalb einer Reichweite von 20 Schritt 1 Stufe Furcht nehmen.', duration: { amount: 'bis Sonnenaufgang', modifier: 'bis Sonnenaufgang', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1023,11 +968,7 @@ module.exports = [ name: 'Lied der Abwehr dämonischer Mächte', attributes: ['IN', 'CH', 'CH'], modified_by: [], - cost: { - initial: '6 AsP', - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: '6 AsP', additional: { amount: null, interval: null, unit: null } }, effect: { description: 'In einem Radius von 50 Schritt um den Elfen herum ist das Wirken von Zaubern oder magischen Handlungen mit dem Merkmal Dämonisch um QS erschwert. Die Wirkung dauert auch 10 Minuten nach dem Ende des Liedes noch an.', @@ -1036,7 +977,8 @@ module.exports = [ modifier: '10 Minuten nach Liedende.', unit: null, }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1049,13 +991,13 @@ module.exports = [ cost: { initial: '3 AsP pro Zuhörer', additional: { amount: null, interval: null, unit: null }, - type: 'asp', }, effect: { description: 'Der Elf kann durch das Lied QS ausgewählten Zuhörern innerhalb einer Reichweite von 20 Schritt 1 Stufe Betäubung nehmen.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1068,13 +1010,13 @@ module.exports = [ cost: { initial: '3 AsP pro Zuhörer', additional: { amount: null, interval: null, unit: null }, - type: 'asp', }, effect: { description: 'Der Elf kann durch das Lied QS ausgewählten Zuhörern innerhalb einer Reichweite von 20 Schritt 1 Stufe Verwirrung nehmen.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1084,16 +1026,13 @@ module.exports = [ name: 'Lied der Lieder', attributes: ['MU', 'IN', 'CH'], modified_by: [], - cost: { - initial: '12 AsP', - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: '12 AsP', additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Nachdem der Elf 20 Minuten lang musiziert oder gesungen hat, sind alle Zuhörer mit einer Seelenkraft von 2 oder weniger im Bann des Liedes, welche sich in einem Radius von maximal 20 Schritt um den Elfen herum aufhalten. Die Zuhörer glauben, das Lied dauere noch QS Stunden an, auch wenn der Elf gar nicht mehr da ist. Während des Banns erhalten sie den Status Bewegungsunfähig. Sollte ein gebannter Zuhörer 1 SP oder mehr Schaden erleiden, fällt der Bann von ihm ab.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 20, unit: 'Aktionen' }, type: null, property: null }, @@ -1103,16 +1042,13 @@ module.exports = [ name: 'Lied der Pflanzen', attributes: ['IN', 'CH', 'CH'], modified_by: [], - cost: { - initial: '2 AsP', - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: '2 AsP', additional: { amount: null, interval: null, unit: null } }, effect: { description: 'Der Elf spielt das Lied für eine Pflanze. Pro QS erhöht sich die Haltbarkeit dieser Pflanze um 50 %.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 20, unit: 'Aktionen' }, type: null, property: null }, @@ -1125,13 +1061,13 @@ module.exports = [ cost: { initial: '8 AsP pro 5 KR', additional: { amount: null, interval: null, unit: null }, - type: 'asp', }, effect: { description: 'Um den Elfen herum entsteht eine Zone von QS x 2 Schritt, die während der Wirkungsdauer Dämonen 1W6 SP pro KR zufügt. Dämonische Essenzen, etwa jene, die durch INVOCATIO MINOR gerufen wurden, werden augenblicklich in die Niederhöllen verbannt. Verseuchter und toter Boden, gleich durch welchem Umstand (Dämonen, Naturkatastrophe), wird nach dem Ende des Lieds in der Zone wieder fruchtbar.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1144,13 +1080,13 @@ module.exports = [ cost: { initial: '4 AsP pro Minute', additional: { amount: null, interval: null, unit: null }, - type: 'asp', }, effect: { description: 'In einem Radius von QS Meilen kann der Elf die Sinne von Tieren der Größenkategorie winzig nutzen, um die Gegend wahrzunehmen. Er kann dadurch z. B. sich nähernde Feinde wahrnehmen oder den Ort, an dem sich die Tiere befinden, einsehen. Im Zweifelsfall muss der Elf eine Probe auf Sinnesschärfe ablegen.', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'musizieren', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1160,16 +1096,13 @@ module.exports = [ name: 'Lied der Tierwahrnehmung', attributes: ['IN', 'IN', 'CH'], modified_by: [], - cost: { - initial: '8 AsP', - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: '8 AsP', additional: { amount: null, interval: null, unit: null } }, effect: { description: 'QS Zuhörer in einem Radius von 20 Schritt erhalten bei ihrer nächsten Regenerationsphase +1 LeP und +1 AsP (letzteres nur, wenn sie Zauberer sind).', duration: { amount: '', modifier: '', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: 'singen', spell: { duration: { amount: 5, unit: 'Aktionen' }, type: null, property: null }, @@ -1179,132 +1112,90 @@ module.exports = [ name: 'Arcanovi', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { - initial: 16, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 16, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Aktionen' }, - type: 'Ritual', - property: 'Objekt', - }, + spell: { duration: { amount: 8, unit: 'Aktionen' }, type: 'Ritual', property: 'Objekt' }, }, { id: 'dschinnenruf', name: 'Dschinnruf', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { - initial: 32, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 32, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Stunden' }, - type: 'Ritual', - property: 'Sphaeren', - }, + spell: { duration: { amount: 8, unit: 'Stunden' }, type: 'Ritual', property: 'Sphaeren' }, }, { id: 'elementarerdiener', name: 'Elementarer Diener', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { - initial: 16, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 16, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 30, unit: 'Minuten' }, - type: 'Ritual', - property: 'Sphaeren', - }, + spell: { duration: { amount: 30, unit: 'Minuten' }, type: 'Ritual', property: 'Sphaeren' }, }, { id: 'invocatiomanor', name: 'Invocatio Manor', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { - initial: 32, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 32, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Stunden' }, - type: 'Ritual', - property: 'Sphaeren', - }, + spell: { duration: { amount: 8, unit: 'Stunden' }, type: 'Ritual', property: 'Sphaeren' }, }, { id: 'invocatiominor', name: 'Invocatio Minor', attributes: ['MU', 'CH', 'KO'], modified_by: [], - cost: { - initial: 16, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: 16, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 'sofort', modifier: 'sofort', unit: null }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 30, unit: 'Minuten' }, - type: 'Ritual', - property: 'Sphaeren', - }, + spell: { duration: { amount: 30, unit: 'Minuten' }, type: 'Ritual', property: 'Sphaeren' }, }, { id: 'zauberklingegeisterspeer', name: 'Zauberklinge Geisterspeer', attributes: ['KL', 'IN', 'FF'], modified_by: [], - cost: { - initial: null, - additional: { amount: null, interval: null, unit: null }, - type: 'asp', - }, + cost: { initial: null, additional: { amount: null, interval: null, unit: null } }, effect: { description: '', duration: { amount: 1, modifier: 'FP', unit: 'Tage' }, - unit: null, + pulse: false, + instant: false, }, talent: null, - spell: { - duration: { amount: 8, unit: 'Stunden' }, - type: 'Ritual', - property: 'Objekt', - }, + spell: { duration: { amount: 8, unit: 'Stunden' }, type: 'Ritual', property: 'Objekt' }, }, ]; //module.exports = { Spells }; diff --git a/functions/CompareResults.js b/functions/CompareResults.js index d728f98..80ead78 100644 --- a/functions/CompareResults.js +++ b/functions/CompareResults.js @@ -1,44 +1,51 @@ /** - * Compares each item inside an array Throws + * Compares each item inside an array Throws * with corresponding AttributeLevels (With added bonus) - * + * * @param {Array} Throws=[] * @param {Array} AttributeLevels=[8,8,8] * @param {BigInt} Bonus=0 * @param {BigInt} PointsRemaining=0 */ -const CompareResults = (Throws = [], AttributeLevels = [8, 8, 8], Bonus = 0, PointsRemaining = 0) => { +const CompareResults = ( + Throws = [], + AttributeLevels = [8, 8, 8], + Bonus = 0, + PointsRemaining = 0 +) => { + let Passed = 0; + let Fumbles = 0; + let CriticalHit = 0; + let AllPointsUsed = []; - let Passed = 0; - let Fumbles = 0; - let CriticalHit = 0; - let AllPointsUsed = []; - - for (let i = 0; i < Throws.length; i++) { - let PointsUsed = 0; - if (Math.floor(AttributeLevels[i] + Bonus) >= Throws[i]) { - Passed++; - } else if (Math.floor(AttributeLevels[i] + PointsRemaining + Bonus) >= Throws[i]) { - Passed++; - PointsUsed = (Throws[i] - Bonus - AttributeLevels[i]); - PointsRemaining -= PointsUsed; - } - else { - // We need to use all our points, so that next die/dice - // would not return a 'Passed'. - PointsUsed = PointsRemaining; - PointsRemaining -= PointsUsed; - } - if (Throws[i] == 1) { CriticalHit++; } - if (Throws[i] == 20) { Fumbles++; } - AllPointsUsed.push(PointsUsed); - } - return { - Passed: Passed, - CriticalHit: CriticalHit, - Fumbles: Fumbles, - PointsUsed: AllPointsUsed, - PointsRemaining: PointsRemaining - }; + for (let i = 0; i < Throws.length; i++) { + let PointsUsed = 0; + if (Math.floor(AttributeLevels[i] + Bonus) >= Throws[i]) { + Passed++; + } else if (Math.floor(AttributeLevels[i] + PointsRemaining + Bonus) >= Throws[i]) { + Passed++; + PointsUsed = Throws[i] - Bonus - AttributeLevels[i]; + PointsRemaining -= PointsUsed; + } else { + // We need to use all our points, so that next die/dice + // would not return a 'Passed'. + PointsUsed = PointsRemaining; + PointsRemaining -= PointsUsed; + } + if (Throws[i] == 1) { + CriticalHit++; + } + if (Throws[i] == 20) { + Fumbles++; + } + AllPointsUsed.push(PointsUsed); + } + return { + Passed: Passed, + CriticalHit: CriticalHit, + Fumbles: Fumbles, + PointsUsed: AllPointsUsed, + PointsRemaining: PointsRemaining, + }; }; module.exports = { CompareResults }; diff --git a/functions/CreateResultTable.js b/functions/CreateResultTable.js new file mode 100644 index 0000000..0bc9507 --- /dev/null +++ b/functions/CreateResultTable.js @@ -0,0 +1,21 @@ +const CreateResultTable = ({ Attributes: Attributes, Throws: Throws, PointsUsed: PointsUsed, Bonus: Bonus = 0 }) => { + return ` + \`\`\` + ${''.padEnd(15)} ${Attributes.map(attr => `${attr.Name}`.padStart(6)).join('\t|\t')}\t| + ${'Dein Wert'.padEnd(15)} ${Attributes.map(attr => `${attr.Level}${Bonus ? `(${f(Bonus)})` : ``}`.padStart(6)).join( + '\t|\t' + )}\t| + ${'Dein Wurf'.padEnd(15)} ${Throws.map(Throw => `${Throw}`.padStart(6)).join('\t|\t')}\t| + ${'Abzüge'.padEnd(15)} ${PointsUsed.map(Points => `${Points}`.replace(0, '--').padStart(6)).join('\t|\t')}\t| + ${'Gesamt'.padEnd(15)} ${PointsUsed.reduce((acc, cur) => acc + cur) + .toString() + .padStart(6)} + \`\`\` + `; +}; + +const f = n => { + return (n > 0 ? '+' : '') + n; +}; + +module.exports = { CreateResultTable }; diff --git a/functions/getChant.js b/functions/getChant.js index 5d77172..48f7a63 100644 --- a/functions/getChant.js +++ b/functions/getChant.js @@ -1,50 +1,28 @@ const { getAttributeLevels } = require('@dsabot/getAttributeLevels'); -//JSON.parse(require('fs').readFileSync('../data/Spells.json')) const Chants = require('../data/Chants'); - -/* definition of attributes in chant database - - { - id: 'adlerauge', // the id of the chant inside characters database. - name: 'Adlerauge', // the well-known name of the chant. - attributes: [ 'KL', 'IN', 'FF' ], // needed attribute checks when casting the chant - chantduration: 2, // the player needs this many actions to cast the chant. - modified_by: [], // the chant is modified by this character's attribute - cost: null, // how many units does the chant cost? (when activated) - cost_type: 'asp', // what kind of points does the character need? - // AsP = Astral Points, KaP = Karmal Points - effect: '', // What is the desired effect of this chant? - effectduration: '' // How long does the effect last? - talent: null // - }, - -*/ - const getChant = ({ Character: Character = [], chant_name: chant_name = '' } = {}) => { let chant_entry = Chants.find(chant => chant.id.toLowerCase() === chant_name.toLowerCase()) || Chants.find(chant => chant.name.toLowerCase() === chant_name.toLowerCase()); if (!chant_entry) { - console.log(`getchant did not find entry for ${chant_name}`); + console.log(`getChant() Did not find entry for ${chant_name}`); return; } let Level = 0; // This is the minimum attributes value. let Chant = Character.chants.find(chant => chant.id === chant_entry.id) || {}; - if (Chant) { + if (Chant && Chant.hasOwnProperty('level')) { Level = Chant.level || 0; } - let Name = Chant.name; - //let ModifiedBy = Chant.modified_by; + let Attributes = getAttributeLevels(chant_entry.attributes, Character); return { - Name: Name, + Name: chant_entry.name, Level: Level, Attributes: Attributes, - //ModifiedBy: ModifiedBy, }; }; module.exports = { getChant }; diff --git a/functions/getSpell.js b/functions/getSpell.js index 0edaf3c..4d6d77a 100644 --- a/functions/getSpell.js +++ b/functions/getSpell.js @@ -30,15 +30,14 @@ const getSpell = ({ Character: Character = [], spell_name: spell_name = '' } = { let Level = 0; // This is the minimum attributes value. let Spell = Character.spells.find(spell => spell.id === spell_entry.id) || {}; //?+ - if (Spell) { + if (Spell && Spell.hasOwnProperty('level')) { Level = Spell.level || 0; } - let Name = spell_entry.name; let ModifiedBy = spell_entry.modified_by; let Attributes = getAttributeLevels(spell_entry.attributes, Character); return { - Name: Name, + Name: spell_entry.name, Level: Level, Attributes: Attributes, ModifiedBy: ModifiedBy, diff --git a/globals.js b/globals.js index e0fed8f..1ac149f 100644 --- a/globals.js +++ b/globals.js @@ -140,7 +140,8 @@ const Replies = [ { id: 'PARRY_CRIT_SUCCESS', string: 'Kritischer Erfolg! Du darfst einen Passierschlag ausführen!'}, { id: 'ROLL', string: 'Du würfelst:'}, { id: 'HEADS_OR_TAILS', string: 'Die Münze landet auf ' }, - { id: 'SPELL_UNKNOWN', string: 'Diesen Zauber kenne ich nicht.'} + { id: 'SPELL_UNKNOWN', string: 'Diesen Zauber kenne ich nicht.' }, + { id: 'NO_SPELLS', string: 'Du kennst keine Zaubersprüche.'} ]; const Declination = ['dem', 'der', 'dem', '']; // Maskulinum, Feminimum, Neutrum, None const Articles = ['Der','Die','Das',''];