Update rpg.js

This commit is contained in:
Degradin 2025-01-21 19:43:42 +03:00
parent d78a11bce2
commit 74012d2fbc

64
rpg.js
View File

@ -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,36 +2375,34 @@ 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) {
if (Math.random() < attackChance) {
// Кнопка атаки (с шансом, определяемым интеллектом)
buttons.push({
text: "🎯",
text: `🎯`, // Символ для атаки
callback_data: `hit_${battle.id}`,
});
} else if (Math.random() < missChance) {
// Кнопка промаха (с шансом появления промаха)
buttons.push({
text: "❌", // Символ для промаха
callback_data: `miss_${battle.id}`,
});
}
}
// Перетасовывание кнопок
const shuffledButtons = buttons.sort(() => Math.random() - 0.5);
@ -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);