Система уровней Discord.js - PullRequest
0 голосов
/ 27 мая 2019

Моя «проблема» - это скорее функция, которую я хочу добавить, я использовал это руководство: https://anidiots.guide/coding-guides/sqlite-based-points-system Я немного изменил код, чтобы в основном дать вам случайное количество XP, я хочу отредактировать, сколько XP требуется для повышения уровня.

Прямо сейчас это статическая сумма, составляющая 5000, необходимая для повышения уровня. Я пытаюсь заставить его увеличивать количество, необходимое для повышения на дополнительные 5000 каждый раз, когда вы повышаете уровень.

В настоящее время это работает так:

Уровень от 1 до 2 = 5000 всего необходимого опыта

Уровень от 2 до 3 = 10000 всего необходимого опыта

В настоящее время количество, необходимое для повышения уровня, всегда составляет 5000 между каждым уровнем.

Вот как я хочу, чтобы это работало:

Уровень от 1 до 2 = 5000 всего необходимого опыта

Уровень от 2 до 3 = 15000 всего необходимого опыта

То есть от 5000 до уровня 2, затем от 10000 до уровня 3 и т. Д. (Увеличивая необходимое количество на 5000 при каждом повышении уровня)

Я потратил большую часть двух часов, пробуя разные вещи, и в основном смотрел на то, что код полностью ушел в мою глубину. Я верил, что что-то подобное будет работать, но я понятия не имею, правильно ли это

if (score.level == '1') {
    nextLevel = 5000
}
if (score.level == '2' {
    nextLevel = 10000
}

Я очень сомневаюсь, что это правильно, иначе мое сообщение будет очень длинным, так как я планирую иметь 100 уровней

Код полностью:

    let score;
    if (message.guild) {
        score = bot.getScore.get(message.author.id, message.guild.id);
        if (!score) {
            score = {
                id: `${message.guild.id}-${message.author.id}`,
                user: message.author.id,
                guild: message.guild.id,
                points: 0,
                level: 1,
            };
        }
        const xpAdd = Math.floor(Math.random() * 10) + 50;
        const curxp = score.points;
        const curlvl = score.level;
        const nxtLvl = score.level * 5000;
        score.points = curxp + xpAdd;
        if (nxtLvl <= score.points) {
            score.level = curlvl + 1;
            const lvlup = new MessageEmbed()
                .setAuthor(
                    `Congrats ${message.author.username}`,
                    message.author.displayAvatarURL()
                )
                .setTitle('You have leveled up!')
                .setThumbnail('https://i.imgur.com/lXeBiMs.png')
                .setColor(color)
                .addField('New Level', curlvl + 1);
            message.channel.send(lvlup).then(msg => {
                msg.delete({
                    timeout: 10000,
                });
            });
        }
        bot.setScore.run(score);
    }

Код «как есть» работает нормально и, как и ожидалось, но «как есть» не очень хорош, поскольку награда за переход с уровня 30-31 отсутствует, так как это то же количество опыта, которое необходимо для получения уровня 1-2

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Вот небольшая формула, которая должна помочь (если я правильно понимаю вашу проблему):

const nxtLvl = 5000 * (Math.pow(2, score.level) - 1);

Это дает следующие требования xp для повышения уровня:

1->2:  5000
2->3:  15000
3->4:  35000
4->5:  75000
5->6: 155000
0 голосов
/ 27 мая 2019

Попробуйте что-то вроде этого:

const levels = [0, 5000, 15000, 30000, 50000, 75000];
....
nextLevel = levels[score.level];

Редактировать

@ Дан, ты имеешь в виду, как это:

nextLevel = 5000 * Math.round( score.level * (score.level + 1) / 2 );
...