From e65715cce636199945c33c2840141c3bd1a7ed5e Mon Sep 17 00:00:00 2001 From: TobenderZephyr Date: Sat, 24 Apr 2021 09:53:05 +0200 Subject: [PATCH] added return list of spells. Moved them into seperate json --- .gitignore | 2 +- .jshintrc | 3 + .prettierrc | 19 ++ commands/Cast.js | 101 +++++++ commands/Spells.js | 80 ++++++ data/Spells.json | 521 ++++++++++++++++++++++++++++++++++++ functions/CompareResults.js | 9 + functions/getSkill.js | 35 +-- functions/getSpell.js | 30 +++ globals.js | 53 +--- 10 files changed, 787 insertions(+), 66 deletions(-) create mode 100644 .jshintrc create mode 100644 .prettierrc create mode 100644 commands/Cast.js create mode 100644 commands/Spells.js create mode 100644 data/Spells.json create mode 100644 functions/getSpell.js diff --git a/.gitignore b/.gitignore index 81c5986..6816291 100644 --- a/.gitignore +++ b/.gitignore @@ -6,5 +6,5 @@ node_modules .github data/dsabot.db data/dsabot.db~ -data +private diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..ebc4f87 --- /dev/null +++ b/.jshintrc @@ -0,0 +1,3 @@ +{ + "esversion": 9 + } \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..47bec69 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,19 @@ +{ + "arrowParens": "avoid", + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "htmlWhitespaceSensitivity": "css", + "insertPragma": false, + "jsxBracketSameLine": true, + "jsxSingleQuote": true, + "printWidth": 100, + "proseWrap": "preserve", + "quoteProps": "as-needed", + "requirePragma": false, + "semi": true, + "singleQuote": true, + "tabWidth": 4, + "trailingComma": "es5", + "useTabs": false, + "vueIndentScriptAndStyle": false + } \ No newline at end of file diff --git a/commands/Cast.js b/commands/Cast.js new file mode 100644 index 0000000..e85de8d --- /dev/null +++ b/commands/Cast.js @@ -0,0 +1,101 @@ +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 { CalculateQuality } = require('@dsabot/CalculateQuality'); +const { CompareResults } = require('@dsabot/CompareResults'); +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; + } + }, +}; + +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/Spells.js b/commands/Spells.js new file mode 100644 index 0000000..f2da411 --- /dev/null +++ b/commands/Spells.js @@ -0,0 +1,80 @@ +const globals = require('../globals'); +const db = globals.db; +const { findMessage } = require('@dsabot/findMessage'); +const { getSpell } = require('@dsabot/getSpell'); +module.exports = { + name: 'spells', + description: 'Zeigt dir deinen Fertigkeitswert im jeweiligen Magietalent.', + aliases: ['spell', 'zauber'], + usage: '', + 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( + `Du hast folgenden Wert in **${Spell.Name}**: ${Spell.Level}` + ); + } + } + } + ); + } catch (e) { + throw e; + } + }, +}; +const ReplySpellList = (SpellList = []) => { + if (!SpellList) return; + + return `${SpellList.map(s => `${s.Name} (${s.Level})`).join('\n')}`; +}; + +const ReplySpell = (Spell = {}) => { + if (!Spell) return; + return ` + ${Spell.Name} + `; +}; + +const createSpellList = (Character = {}) => { + if (!Character || !Character.hasOwnProperty('spells')) return; + let SpellList = []; + Character.spells.forEach(spell => + SpellList.push(getSpell({ Character: Character, spell_name: spell.id })) + ); + return SpellList.filter(value => value !== undefined); +}; + +const s = require('./Spells'); +const user = 'hmpf1992#1074'; +const message = { + author: { + tag: user, + }, + reply: function (e) { + console.log(e); + }, +}; +const args = []; +s.exec(message, args); diff --git a/data/Spells.json b/data/Spells.json new file mode 100644 index 0000000..22fc078 --- /dev/null +++ b/data/Spells.json @@ -0,0 +1,521 @@ +[ + { + "id": "adlerauge", + "name": "Adlerauge", + "attributes": [ + "KL", + "IN", + "FF" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "analysarkanstruktur", + "name": "Analys Arkanstruktur", + "attributes": [ + "KL", + "KL", + "IN" + ], + "spellduration": 32, + "modified_by": [] + }, + { + "id": "armatrutz", + "name": "Armatrutz", + "attributes": [ + "KL", + "IN", + "FF" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "axxeleratus", + "name": "Axxeleratus", + "attributes": [ + "KL", + "IN", + "FF" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "balsamsalabunde", + "name": "Balsam Salabunde", + "attributes": [ + "KL", + "IN", + "FF" + ], + "spellduration": 16, + "modified_by": [] + }, + { + "id": "bannbaladin", + "name": "Bannbaladin", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 4, + "modified_by": [ + "ZK" + ] + }, + { + "id": "blickindiegedanken", + "name": "Blick in die Gedanken", + "attributes": [ + "MU", + "KL", + "IN" + ], + "spellduration": 4, + "modified_by": [ + "ZK" + ] + }, + { + "id": "blitzdichfind", + "name": "Blitz dich find", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 1, + "modified_by": [ + "ZK" + ] + }, + { + "id": "corpofesso", + "name": "Corpofesso", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 2, + "modified_by": [ + "ZK" + ] + }, + { + "id": "disruptivo", + "name": "Disruptivo", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 8, + "modified_by": [] + }, + { + "id": "duplicatus", + "name": "Duplicatus", + "attributes": [ + "KL", + "IN", + "CH" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "falkenauge", + "name": "Falkenauge", + "attributes": [ + "MU", + "KL", + "IN" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "flimflam", + "name": "Flim Flam", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "fulminictus", + "name": "Fulminictus", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 1, + "modified_by": [ + "ZK" + ] + }, + { + "id": "gardianum", + "name": "Gardianum", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "grossegier", + "name": "Große Gier", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 2, + "modified_by": [ + "SK" + ] + }, + { + "id": "harmlosegestalt", + "name": "Harmlose Gestalt", + "attributes": [ + "KL", + "IN", + "CH" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "hexengalle", + "name": "Hexengalle", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "hexenkrallen", + "name": "Hexenkrallen", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 1, + "modified_by": [] + }, + { + "id": "horriphobos", + "name": "Horriphobos", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 2, + "modified_by": [ + "SK" + ] + }, + { + "id": "ignifaxius", + "name": "Ignifaxius", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "invocatiominima", + "name": "Invocatio Minima", + "attributes": [ + "MU", + "CH", + "KO" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "katzenaugen", + "name": "Katzenaugen", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "kroetensprung", + "name": "Krötensprung", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "manifesto", + "name": "Manifesto", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "manusmiracula", + "name": "Manus Miracula", + "attributes": [ + "KL", + "FF", + "KK" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "motoricus", + "name": "Motoricus", + "attributes": [ + "KL", + "FF", + "KK" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "nebelwand", + "name": "Nebelwand", + "attributes": [ + "MU", + "KL", + "CH" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "oculusillusionis", + "name": "Oculus Illusionis", + "attributes": [ + "KL", + "IN", + "CH" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "odemarcanum", + "name": "Odem Arcanum", + "attributes": [ + "MU", + "KL", + "IN" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "paralys", + "name": "Paralys", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 2, + "modified_by": [ + "ZK" + ] + }, + { + "id": "penetrizzel", + "name": "Penetrizzel", + "attributes": [ + "MU", + "KL", + "IN" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "psychostabilis", + "name": "Psychostabilis", + "attributes": [ + "KL", + "IN", + "FF" + ], + "spellduration": 8, + "modified_by": [] + }, + { + "id": "radau", + "name": "Radau", + "attributes": [ + "KL", + "FF", + "KK" + ], + "spellduration": 2, + "modified_by": [] + }, + { + "id": "respondami", + "name": "Respondami", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 2, + "modified_by": [ + "SK" + ] + }, + { + "id": "salander", + "name": "Salander", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 8, + "modified_by": [ + "ZK" + ] + }, + { + "id": "sanftmut", + "name": "Sanftmut", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 2, + "modified_by": [ + "SK" + ] + }, + { + "id": "satuariasherrlichkeit", + "name": "Satuarias Herrlichkeit", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "silentium", + "name": "Silentium", + "attributes": [ + "KL", + "FF", + "KK" + ], + "spellduration": 8, + "modified_by": [] + }, + { + "id": "somnigravis", + "name": "Somnigravis", + "attributes": [ + "MU", + "IN", + "CH" + ], + "spellduration": 8, + "modified_by": [ + "SK" + ] + }, + { + "id": "spinnenlauf", + "name": "Spinnenlauf", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "spurlos", + "name": "Spurlos", + "attributes": [ + "KL", + "FF", + "KK" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "transversalis", + "name": "Transversalis", + "attributes": [ + "MU", + "CH", + "KO" + ], + "spellduration": 8, + "modified_by": [] + }, + { + "id": "visibili", + "name": "Visibili", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 4, + "modified_by": [] + }, + { + "id": "wasseratem", + "name": "Wasseratem", + "attributes": [ + "KL", + "IN", + "KO" + ], + "spellduration": 8, + "modified_by": [] + } +] \ No newline at end of file diff --git a/functions/CompareResults.js b/functions/CompareResults.js index 578d546..d728f98 100644 --- a/functions/CompareResults.js +++ b/functions/CompareResults.js @@ -1,3 +1,12 @@ +/** + * 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) => { let Passed = 0; diff --git a/functions/getSkill.js b/functions/getSkill.js index eac6170..20b2ff6 100644 --- a/functions/getSkill.js +++ b/functions/getSkill.js @@ -1,24 +1,27 @@ const globals = require('../globals'); -const { getAttributeLevels } = require("@dsabot/getAttributeLevels"); +const { getAttributeLevels } = require('@dsabot/getAttributeLevels'); const getSkill = ({ Character: Character = [], args: args = [] } = {}) => { - let skill_entry = globals.Talente.find(skill => skill.id.toLowerCase() === args[0].toLowerCase()) || - globals.Talente.find(skill => skill.name.toLowerCase() === args[0].toLowerCase()); + let skill_entry = + globals.Talente.find(skill => skill.id.toLowerCase() === args[0].toLowerCase()) || + globals.Talente.find(skill => skill.name.toLowerCase() === args[0].toLowerCase()); - if (!skill_entry) { return; } + if (!skill_entry) { + return; + } - let Level = 0; // This is the minimum attributes value. - let cSkill = Character.skills.find(skill => skill.id === skill_entry.id) || {}; - if (cSkill) { - Level = cSkill.level || 0; - } - let Name = globals.Talente.find(skill => skill.id === skill_entry.id).name; - let Attributes = getAttributeLevels(skill_entry.values, Character); + let Level = 0; // This is the minimum attributes value. + let cSkill = Character.skills.find(skill => skill.id === skill_entry.id) || {}; + if (cSkill) { + Level = cSkill.level || 0; + } + let Name = globals.Talente.find(skill => skill.id === skill_entry.id).name; + let Attributes = getAttributeLevels(skill_entry.values, Character); - return { - Name: Name, - Level: Level, - Attributes: Attributes - }; + return { + Name: Name, + Level: Level, + Attributes: Attributes, + }; }; module.exports = { getSkill }; diff --git a/functions/getSpell.js b/functions/getSpell.js new file mode 100644 index 0000000..1b76536 --- /dev/null +++ b/functions/getSpell.js @@ -0,0 +1,30 @@ +const globals = require('../globals'); +const { getAttributeLevels } = require('@dsabot/getAttributeLevels'); + +const getSpell = ({ Character: Character = [], spell_name: spell_name = '' } = {}) => { + let spell_entry = + globals.Spells.find(spell => spell.id.toLowerCase() === spell_name.toLowerCase()) || + globals.Spells.find(spell => spell.name.toLowerCase() === spell_name.toLowerCase()); + + if (!spell_entry) { + console.log(`getSpell did not find entry for ${spell_name}`); + return; + } + + let Level = 0; // This is the minimum attributes value. + let Spell = Character.spells.find(spell => spell.id === spell_entry.id) || {}; + if (Spell) { + Level = Spell.level || 0; + } + let Name = globals.Spells.find(spell => spell.id === spell_entry.id).name; + let ModifiedBy = globals.Spells.find(spell => spell.id === spell_entry.id).modified_by; + let Attributes = getAttributeLevels(spell_entry.attributes, Character); + + return { + Name: Name, + Level: Level, + Attributes: Attributes, + ModifiedBy: ModifiedBy, + }; +}; +module.exports = { getSpell }; diff --git a/globals.js b/globals.js index 630ae8a..88fd999 100644 --- a/globals.js +++ b/globals.js @@ -139,7 +139,8 @@ const Replies = [ { id: 'PARRY_SUCCESS', string: 'Parade erfolgreich.'}, { 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: 'HEADS_OR_TAILS', string: 'Die Münze landet auf ' }, + { id: 'SPELL_UNKNOWN', string: 'Diesen Zauber kenne ich nicht.'} ]; const Declination = ['dem', 'der', 'dem', '']; // Maskulinum, Feminimum, Neutrum, None const Articles = ['Der','Die','Das','']; @@ -232,53 +233,7 @@ const Disadvantages = [ {} ]; -const Spells = [ - {id: 'adlerauge', name: 'Adlerauge', attributes: ['KL','IN','FF'], spellduration: 2, modified_by: []}, - {id: 'analysarkanstruktur', name: 'Analys Arkanstruktur', attributes: ['KL','KL','IN'], spellduration: 32, modified_by: []}, - {id: 'armatrutz', name: 'Armatrutz', attributes: ['KL','IN','FF'], spellduration: 1, modified_by: []}, - {id: 'axxeleratus', name: 'Axxeleratus', attributes: ['KL','IN','FF'], spellduration: 1, modified_by: []}, - {id: 'balsamsalabunde', name: 'Balsam Salabunde', attributes: ['KL','IN','FF'], spellduration: 16, modified_by: []}, - {id: 'bannbaladin', name: 'Bannbaladin', attributes: ['MU','IN','CH'], spellduration: 4, modified_by: ['ZK']}, - {id: 'blickindiegedanken', name: 'Blick in die Gedanken', attributes: ['MU','KL','IN'], spellduration: 4, modified_by: ['ZK']}, - {id: 'blitzdichfind', name: 'blitz dich find', attributes: ['MU','IN','CH'], spellduration: 1, modified_by: ['ZK']}, - {id: 'corpofesso', name: 'Corpofesso', attributes: ['KL','IN','KO'], spellduration: 2, modified_by: ['ZK']}, - {id: 'disruptivo', name: 'Disruptivo', attributes: ['MU','KL','CH'], spellduration: 8, modified_by: []}, - {id: 'duplicatus', name: 'Duplicatus', attributes: ['KL','IN','CH'], spellduration: 2, modified_by: []}, - {id: 'falkenauge', name: 'Falkenauge', attributes: ['MU','KL','IN'], spellduration: 2, modified_by: []}, - {id: 'flimflam', name: 'Flim Flam', attributes: ['MU','KL','CH'], spellduration: 1, modified_by: []}, - {id: 'fulminictus', name: 'Fulminictus', attributes: ['KL','IN','KO'], spellduration: 1, modified_by: ['ZK']}, - {id: 'gardianum', name: 'Gardianum', attributes: ['MU','KL','CH'], spellduration: 1, modified_by: []}, - {id: 'grossegier', name: 'Große Gier', attributes: ['MU','IN','CH'], spellduration: 2, modified_by: ['SK']}, - {id: 'harmlosegestalt', name: 'Harmlose Gestalt', attributes: ['KL','IN','CH'], spellduration: 4, modified_by: []}, - {id: 'hexengalle', name: 'Hexengalle', attributes: ['KL','IN','KO'], spellduration: 1, modified_by: []}, - {id: 'hexenkrallen', name: 'Hexenkrallen', attributes: ['KL','IN','KO'], spellduration: 1, modified_by: []}, - {id: 'horriphobos', name: 'Horriphobos', attributes: ['MU','IN','CH'], spellduration: 2, modified_by: ['SK']}, - {id: 'ignifaxius', name: 'Ignifaxius', attributes: ['MU','KL','CH'], spellduration: 2, modified_by: []}, - {id: 'invocatiominima', name: 'Invocatio Minima', attributes: ['MU','CH','KO'], spellduration: 4, modified_by: []}, - {id: 'katzenaugen', name: 'Katzenaugen', attributes: ['KL','IN','KO'], spellduration: 4, modified_by: []}, - {id: 'kroetensprung', name: 'Krötensprung', attributes: ['KL','IN','KO'], spellduration: 2, modified_by: []}, - {id: 'manifesto', name: 'Manifesto', attributes: ['MU','KL','CH'], spellduration: 4, modified_by: []}, - {id: 'manusmiracula', name: 'Manus Miracula', attributes: ['KL','FF','KK'], spellduration: 2, modified_by: []}, - {id: 'motoricus', name: 'Motoricus', attributes: ['KL','FF','KK'], spellduration: 2, modified_by: []}, - {id: 'nebelwand', name: 'Nebelwand', attributes: ['MU','KL','CH'], spellduration: 2, modified_by: []}, - {id: 'oculusillusionis', name: 'Oculus Illusionis', attributes: ['KL','IN','CH'], spellduration: 4, modified_by: []}, - {id: 'odemarcanum', name: 'Odem Arcanum', attributes: ['MU','KL','IN'], spellduration: 2, modified_by: []}, - {id: 'paralys', name: 'Paralys', attributes: ['KL','IN','KO'], spellduration: 2, modified_by: ['ZK']}, - {id: 'penetrizzel', name: 'Penetrizzel', attributes: ['MU','KL','IN'], spellduration: 2, modified_by: []}, - {id: 'psychostabilis', name: 'Psychostabilis', attributes: ['KL','IN','FF'], spellduration: 8, modified_by: []}, - {id: 'radau', name: 'Radau', attributes: ['KL','FF','KK'], spellduration: 2, modified_by: []}, - {id: 'respondami', name: 'Respondami', attributes: ['MU','IN','CH'], spellduration: 2, modified_by: ['SK']}, - {id: 'salander', name: 'Salander', attributes: ['KL','IN','KO'], spellduration: 8, modified_by: ['ZK']}, - {id: 'sanftmut', name: 'Sanftmut', attributes: ['MU','IN','CH'], spellduration: 2, modified_by: ['SK']}, - {id: 'satuariasherrlichkeit', name: 'Satuarias Herrlichkeit', attributes: ['KL','IN','KO'], spellduration: 4, modified_by: []}, - {id: 'silentium', name: 'Silentium', attributes: ['KL','FF','KK'], spellduration: 8, modified_by: []}, - {id: 'somnigravis', name: 'Somnigravis', attributes: ['MU','IN','CH'], spellduration: 8, modified_by: ['SK']}, - {id: 'spinnenlauf', name: 'Spinnenlauf', attributes: ['KL','IN','KO'], spellduration: 4, modified_by: []}, - {id: 'spurlos', name: 'Spurlos', attributes: ['KL','FF','KK'], spellduration: 4, modified_by: []}, - {id: 'transversalis', name: 'Transversalis', attributes: ['MU','CH','KO'], spellduration: 8, modified_by: []}, - {id: 'visibili', name: 'Visibili', attributes: ['KL','IN','KO'], spellduration: 4, modified_by: []}, - {id: 'wasseratem', name: 'Wasseratem', attributes: ['KL','IN','KO'], spellduration: 8, modified_by: []}, -]; +const Spells = require('data/Spells.json'); -module.exports = { Werte, Talente, Coin, TalentKategorien, DiceRegex, Discord, MessageEmbed, db, Replies, MeleeWeapons, Weapons, RangedWeapons, CombatTechniques, Articles, Declination }; +module.exports = { Spells, Werte, Talente, Coin, TalentKategorien, DiceRegex, Discord, MessageEmbed, db, Replies, MeleeWeapons, Weapons, RangedWeapons, CombatTechniques, Articles, Declination };