From 74012d2fbc13d579514772bf422de759a7799957 Mon Sep 17 00:00:00 2001 From: Degradin <42292046+Degradin@users.noreply.github.com> Date: Tue, 21 Jan 2025 19:43:42 +0300 Subject: [PATCH] Update rpg.js --- rpg.js | 70 +++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/rpg.js b/rpg.js index 5dd5da3..39406a4 100644 --- a/rpg.js +++ b/rpg.js @@ -1873,7 +1873,7 @@ async function Exp(ctx, character, experience) { // Периодическое выполнение задач function startRecoveryIntervals() { - const interval = 1000; // 1 мин Интервал в миллисекундах (например, 1 минута) + const interval = 60000; // 1 мин Интервал в миллисекундах (например, 1 минута) setInterval(recoverHealth, interval); setInterval(recoverStamina, interval); } @@ -2223,7 +2223,7 @@ const enemyTurn = async (ctx, character, battle) => { await character.save(); await battle.save({ fields: ["logs", "status"] }); logs(ctx, "Поражение персонажа", { enemy, battle }); - return; + return await ctx.editMessageText( `⚔️ Вы проиграли!\n\n` + `💔 Противник нанес ${character.name} ${damage} урона!\n\n` + `📜 Логи битвы:\n${logMessage || "Пока ничего не произошло."}`); } await character.save(); @@ -2322,6 +2322,7 @@ rpg.action(/hit_\d+/, async (ctx) => { if (battle.enemy_hp <= 0) { battle.status = "completed"; await battle.save(); + let items = ""; logs(ctx, "Победа персонажа", { enemy, battle }); Exp(ctx, character, enemy.level * 5) character.enemiesKilled += 1; @@ -2345,8 +2346,11 @@ rpg.action(/hit_\d+/, async (ctx) => { img: item.img }); } + items = droppedItems.map((item) => item.name).join(", "); } - return ctx.editMessageText(`🎉 ${character.name} победил ${enemy.name}!`); + return ctx.editMessageText( + `🎉 ${character.name} победил ${enemy.name}!\n\n📜 Логи битвы:\n${battle.logs.slice(-5).map((log) => `• ${log}`).join("\n")}\n🧩 Выпавшие предметы: ${items}` + ); } await battle.save(); @@ -2371,35 +2375,33 @@ rpg.action(/hit_\d+/, async (ctx) => { function generateBattleButtons(character, battle) { let ctx = { from: { id: character.telegram_id } }; const totalButtons = 10; - const intelligenceFactor = Math.min(character.intelligence || 1, totalButtons - 2); // Уменьшаем на 2 для кнопки критического удара и гарантированного промаха + const intelligenceFactor = Math.min(character.intelligence || 1, 100); // Ограничиваем интеллект значением 100 (или любым другим максимальным значением) + const attackChance = (intelligenceFactor / 100); // Вероятность появления кнопки атаки + const missChance = 1 - attackChance; // Вероятность промаха + const buttons = []; - // Генерация кнопок с уроном от атаки - for (let i = 0; i < intelligenceFactor; i++) { - buttons.push({ - text: `🎯`, - callback_data: `hit_${battle.id}`, - }); - } - - // Генерация кнопки с критическим уроном + // Обязательно добавляем одну кнопку с критическим ударом buttons.push({ - text: `🎯`, + text: `🔥`, // Символ для критического удара callback_data: `critical_${battle.id}`, }); - // Гарантированная кнопка промаха - buttons.push({ - text: "🎯", - callback_data: `miss_${battle.id}`, - }); - - // Заполнение оставшихся кнопок (если не хватает до totalButtons) + // Генерация оставшихся кнопок для битвы while (buttons.length < totalButtons) { - buttons.push({ - text: "🎯", - callback_data: `miss_${battle.id}`, - }); + if (Math.random() < attackChance) { + // Кнопка атаки (с шансом, определяемым интеллектом) + buttons.push({ + text: `🎯`, // Символ для атаки + callback_data: `hit_${battle.id}`, + }); + } else if (Math.random() < missChance) { + // Кнопка промаха (с шансом появления промаха) + buttons.push({ + text: "❌", // Символ для промаха + callback_data: `miss_${battle.id}`, + }); + } } // Перетасовывание кнопок @@ -2410,10 +2412,12 @@ function generateBattleButtons(character, battle) { for (let i = 0; i < shuffledButtons.length; i += 5) { rows.push(shuffledButtons.slice(i, i + 5)); } + logs(ctx, "Генерация кнопок для битвы", { battle, keyboard: rows }); return rows; } + // Функция выпадения предмета с врага или локации с учетом аксессуаров и управляемого шанса async function dropItem(character, enemyId, locationId) { let items = []; @@ -2473,8 +2477,14 @@ async function dropItem(character, enemyId, locationId) { } } + // Теперь среди выпавших рандомом выбираем треть предметов (минимум 1) + const itemsToDrop = Math.max(1, Math.floor(droppedItems.length / 3)); + droppedItems = droppedItems.sort(() => Math.random() - 0.5).slice(0, itemsToDrop); + console.log(`${droppedItems.length} предметов выпало`); + // Если предметы выпали, возвращаем их, иначе null if (droppedItems.length > 0) { + // Отправляем сообщение игроку о найденных предметах return droppedItems; // Вернем массив выпавших предметов } else { return null; // Если ничего не выпало @@ -2583,12 +2593,13 @@ rpg.action(/critical_\d+/, async (ctx) => { if (battle.enemy_hp <= 0) { battle.status = "completed"; await battle.save(); + let items = ''; Exp(ctx, character, enemy.level * 6) character.enemiesKilled += 1; await character.save(); let droppedItems = await dropItem(character, enemy.id); logs(ctx, "Предметы с врага", { droppedItems }); - if (droppedItems) { + if (droppedItems.length > 0) { for (const item of droppedItems) { await InventoryModel.create({ telegram_id: character.telegram_id, @@ -2605,9 +2616,11 @@ rpg.action(/critical_\d+/, async (ctx) => { img: item.img }); } + items = droppedItems.map((item) => item.name).join(", "); } + return ctx.editMessageText( - `🎉 ${character.name} победил ${enemy.name}!\n\n📜 Логи битвы:\n${battle.logs.slice(-5).map((log) => `• ${log}`).join("\n")}` + `🎉 ${character.name} победил ${enemy.name}!\n\n📜 Логи битвы:\n${battle.logs.slice(-5).map((log) => `• ${log}`).join("\n")}\n🧩 Выпавшие предметы: ${items}` ); } @@ -2652,8 +2665,9 @@ rpg.action(/miss_\d+/, async (ctx) => { // Логи battle.logs = battle.logs || []; battle.logs.push(`${character.name} промахнулся.`); - await enemyTurn(ctx, character, battle); await battle.save({ fields: ["enemy_hp", "logs"] }); + await enemyTurn(ctx, character, battle); + // Генерация новых кнопок const buttons = generateBattleButtons(character, battle);