added return list of spells. Moved them into seperate json

This commit is contained in:
2021-04-24 09:53:05 +02:00
parent 8e4f4eedb8
commit e65715cce6
10 changed files with 787 additions and 66 deletions

2
.gitignore vendored
View File

@ -6,5 +6,5 @@ node_modules
.github
data/dsabot.db
data/dsabot.db~
data
private

3
.jshintrc Normal file
View File

@ -0,0 +1,3 @@
{
"esversion": 9
}

19
.prettierrc Normal file
View File

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

101
commands/Cast.js Normal file
View File

@ -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: '<Zaubern> [<-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)}
\`\`\`
`;
};

80
commands/Spells.js Normal file
View File

@ -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: '<Zauber>',
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);

521
data/Spells.json Normal file
View File

@ -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": []
}
]

View File

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

View File

@ -1,11 +1,14 @@
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()) ||
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) || {};
@ -18,7 +21,7 @@ const getSkill = ({ Character: Character = [], args: args = [] } = {}) => {
return {
Name: Name,
Level: Level,
Attributes: Attributes
Attributes: Attributes,
};
};
module.exports = { getSkill };

30
functions/getSpell.js Normal file
View File

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

View File

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