FIRE System distribute points mechanic
This commit is contained in:
Degradin 2025-01-11 02:15:19 +03:00
parent 7e6980207f
commit 471fe54715
3 changed files with 114 additions and 13 deletions

View File

@ -21,8 +21,6 @@ module.exports = async (ctx) => {
💰 Баланс 💰 Баланс
${spacesWithMarkdown(user.money)} ${spacesWithMarkdown(user.money)}
Ð${spacesWithMarkdown(user.dirtymoney)}
💳: ${user.stealedcards}
🔵 Имущество 🔵 Имущество
🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name} 🏠 Жилье: ${property.house == 0 ? "Бездомный" : property.house.name}

View File

@ -21,6 +21,10 @@ const Character = sequelize.define('character', {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
defaultValue: 0 defaultValue: 0
}, },
firePoints: {
type: DataTypes.INTEGER,
defaultValue: 0
},
hp: { hp: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
defaultValue: 100 defaultValue: 100

121
rpg.js
View File

@ -78,27 +78,125 @@ rpg.action('rpg_profile', async (ctx) => {
// Формируем профиль // Формируем профиль
const profile = ` const profile = `
🎭 Профиль персонажа: 🎭 Профиль персонажа
👤 Имя: ${character.name || 'Не указано'} 👤 Имя: ${character.name || 'Не указано'}
🏆 Уровень: ${character.level} (${character.exp}/${utils.spaces(expToUp[character.level])}) 🏆 Уровень: ${character.level} (${character.exp}/${utils.spaces(expToUp[character.level])})
Здоровье: ${character.hp}/${character.max_hp} Здоровье: ${character.hp}/${character.max_hp}
🔥 Стамина: ${character.stamina}/${character.max_stamina}
💪 Сила (F): ${character.force} 💪 Сила (F): ${character.force}
🧠 Интеллект (I): ${character.intelligence} 🧠 Интеллект (I): ${character.intelligence}
🛡 Устойчивость (R): ${character.resilience} 🛡 Устойчивость (R): ${character.resilience}
🔋 Выносливость (E): ${character.endurance} 🔋 Выносливость (E): ${character.endurance}
🔥 Стамина: ${character.stamina}/${character.max_stamina} Свободные очки F.I.R.E: ${character.firePoints}
💰 Грязные деньги: ${utils.spaces(character.dirtymoney)}
🃏 Карты: ${stolenCards.length}
`;
💰 Баланс: ${utils.spaces(character.dirtymoney)}Ð
🃏 Украденные карты: ${stolenCards.length}
`;
const buttons = [
[Markup.button.callback('💳 Карточки', 'view_cards')],
[Markup.button.callback('🎒 Инвентарь', 'inventory')],
];
if (character.firePoints > 1) {
buttons.push([Markup.button.callback(' Распределить очки', 'fire_distribute')]);
}
buttons.push([Markup.button.callback('🔙 В меню', 'crime_menu')]);
// Отправляем сообщение // Отправляем сообщение
ctx.editMessageText(profile.trim(), Markup.inlineKeyboard([ ctx.editMessageText(profile.trim(), Markup.inlineKeyboard(buttons));
[Markup.button.callback('💳 Карточки', 'view_cards')],
[Markup.button.callback('🎒 Инвентарь', 'inventory')],
[Markup.button.callback('🔙 В меню', 'crime_menu')],
]));
}); });
// Основная команда для вывода кнопок распределения F.I.R.E.
rpg.action('fire_distribute', async (ctx) => {
// Получаем данные пользователя
const character = await CharacterModel.findOne({ where: { telegram_id: ctx.from.id } });
if (!character) {
return ctx.reply('Вы ещё не создали персонажа!');
}
// Проверяем, есть ли свободные очки
if (character.firePoints <= 0) {
return ctx.reply('У вас нет свободных очков для распределения.');
}
// Формируем текст сообщения
const message = `
🔥 Распределение очков F.I.R.E 🔥
У вас есть ${character.firePoints} свободных очков.
Выберите характеристику, чтобы увеличить её уровень:
💪 Сила (F): ${character.force}
🧠 Интеллект (I): ${character.intelligence}
🛡 Устойчивость (R): ${character.resilience}
🔋 Выносливость (E): ${character.endurance}
`;
// Создаём кнопки для каждой характеристики
const keyboard = Markup.inlineKeyboard([
Markup.button.callback('💪', 'increase_force'),
Markup.button.callback('🧠', 'increase_intelligence'),
Markup.button.callback('🎯', 'increase_resilience'),
Markup.button.callback('💖', 'increase_endurance'),
], { columns: 2 });
// Отправляем сообщение с кнопками
await ctx.reply(message, keyboard);
});
// Обработчики для нажатий на кнопки
rpg.action(/^increase_(force|intelligence|resilience|endurance)$/, async (ctx) => {
const attribute = ctx.match[1]; // Получаем характеристику из callback_data
const character = await CharacterModel.findOne({ where: { telegram_id: ctx.from.id } });
if (!character) {
return ctx.answerCbQuery('Персонаж не найден.');
}
// Проверяем наличие свободных очков
if (character.firePoints <= 0) {
return ctx.answerCbQuery('У вас недостаточно очков!');
}
// Прокачиваем выбранную характеристику
switch (attribute) {
case 'force':
character.force++;
break;
case 'intelligence':
character.intelligence++;
break;
case 'resilience':
character.resilience++;
break;
case 'endurance':
character.endurance++;
break;
}
// Уменьшаем количество очков и сохраняем изменения
character.firePoints--;
await character.save();
// Отправляем обновлённое сообщение
const updatedMessage = `
🔥 Распределение очков F.I.R.E 🔥
У вас есть ${character.firePoints} свободных очков.
Выберите характеристику, чтобы увеличить её уровень:
💪 Сила (F): ${character.force}
🧠 Интеллект (I): ${character.intelligence}
🛡 Устойчивость (R): ${character.resilience}
🔋 Выносливость (E): ${character.endurance}
`;
await ctx.editMessageText(updatedMessage, { reply_markup: ctx.update.callback_query.message.reply_markup });
ctx.answerCbQuery(`Вы увеличили ${attribute.toUpperCase()}!`);
});
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
// Хранилище для отслеживания пользователей, которые уже прошли ввод // Хранилище для отслеживания пользователей, которые уже прошли ввод
@ -1371,6 +1469,7 @@ async function Exp(ctx, character, experience) {
if (character.exp >= expToUp[character.level]) { if (character.exp >= expToUp[character.level]) {
character.exp -= expToUp[character.level] character.exp -= expToUp[character.level]
character.level += 1 character.level += 1
character.firePoints += 1
await character.save() await character.save()
await ctx.sendMessage(`⤴️ Уровень вашего персонажа повысился до ${character.level}!`)} await ctx.sendMessage(`⤴️ Уровень вашего персонажа повысился до ${character.level}!`)}
} }
@ -1378,7 +1477,7 @@ async function Exp(ctx, character, experience) {
// Периодическое выполнение задач // Периодическое выполнение задач
function startRecoveryIntervals() { function startRecoveryIntervals() {
const interval = 5 * 1000; // Интервал в миллисекундах (например, 1 минута) const interval = 60000; // 1 мин Интервал в миллисекундах (например, 1 минута)
setInterval(recoverHealth, interval); setInterval(recoverHealth, interval);
setInterval(recoverStamina, interval); setInterval(recoverStamina, interval);
} }