This commit is contained in:
Degradin 2025-01-22 00:09:56 +03:00
commit ecaad92ef0

70
rpg.js
View File

@ -1873,7 +1873,7 @@ async function Exp(ctx, character, experience) {
// Периодическое выполнение задач // Периодическое выполнение задач
function startRecoveryIntervals() { function startRecoveryIntervals() {
const interval = 1000; // 1 мин Интервал в миллисекундах (например, 1 минута) const interval = 60000; // 1 мин Интервал в миллисекундах (например, 1 минута)
setInterval(recoverHealth, interval); setInterval(recoverHealth, interval);
setInterval(recoverStamina, interval); setInterval(recoverStamina, interval);
} }
@ -2223,7 +2223,7 @@ const enemyTurn = async (ctx, character, battle) => {
await character.save(); await character.save();
await battle.save({ fields: ["logs", "status"] }); await battle.save({ fields: ["logs", "status"] });
logs(ctx, "Поражение персонажа", { enemy, battle }); logs(ctx, "Поражение персонажа", { enemy, battle });
return; return await ctx.editMessageText( `⚔️ Вы проиграли!\n\n` + `💔 Противник нанес ${character.name} ${damage} урона!\n\n` + `📜 Логи битвы:\n${logMessage || "Пока ничего не произошло."}`);
} }
await character.save(); await character.save();
@ -2322,6 +2322,7 @@ rpg.action(/hit_\d+/, async (ctx) => {
if (battle.enemy_hp <= 0) { if (battle.enemy_hp <= 0) {
battle.status = "completed"; battle.status = "completed";
await battle.save(); await battle.save();
let items = "";
logs(ctx, "Победа персонажа", { enemy, battle }); logs(ctx, "Победа персонажа", { enemy, battle });
Exp(ctx, character, enemy.level * 5) Exp(ctx, character, enemy.level * 5)
character.enemiesKilled += 1; character.enemiesKilled += 1;
@ -2345,8 +2346,11 @@ rpg.action(/hit_\d+/, async (ctx) => {
img: item.img 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(); await battle.save();
@ -2371,35 +2375,33 @@ rpg.action(/hit_\d+/, async (ctx) => {
function generateBattleButtons(character, battle) { function generateBattleButtons(character, battle) {
let ctx = { from: { id: character.telegram_id } }; let ctx = { from: { id: character.telegram_id } };
const totalButtons = 10; 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 = []; const buttons = [];
// Генерация кнопок с уроном от атаки // Обязательно добавляем одну кнопку с критическим ударом
for (let i = 0; i < intelligenceFactor; i++) {
buttons.push({
text: `🎯`,
callback_data: `hit_${battle.id}`,
});
}
// Генерация кнопки с критическим уроном
buttons.push({ buttons.push({
text: `🎯`, text: `🔥`, // Символ для критического удара
callback_data: `critical_${battle.id}`, callback_data: `critical_${battle.id}`,
}); });
// Гарантированная кнопка промаха // Генерация оставшихся кнопок для битвы
buttons.push({
text: "🎯",
callback_data: `miss_${battle.id}`,
});
// Заполнение оставшихся кнопок (если не хватает до totalButtons)
while (buttons.length < totalButtons) { while (buttons.length < totalButtons) {
buttons.push({ if (Math.random() < attackChance) {
text: "🎯", // Кнопка атаки (с шансом, определяемым интеллектом)
callback_data: `miss_${battle.id}`, 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) { for (let i = 0; i < shuffledButtons.length; i += 5) {
rows.push(shuffledButtons.slice(i, i + 5)); rows.push(shuffledButtons.slice(i, i + 5));
} }
logs(ctx, "Генерация кнопок для битвы", { battle, keyboard: rows }); logs(ctx, "Генерация кнопок для битвы", { battle, keyboard: rows });
return rows; return rows;
} }
// Функция выпадения предмета с врага или локации с учетом аксессуаров и управляемого шанса // Функция выпадения предмета с врага или локации с учетом аксессуаров и управляемого шанса
async function dropItem(character, enemyId, locationId) { async function dropItem(character, enemyId, locationId) {
let items = []; 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 // Если предметы выпали, возвращаем их, иначе null
if (droppedItems.length > 0) { if (droppedItems.length > 0) {
// Отправляем сообщение игроку о найденных предметах
return droppedItems; // Вернем массив выпавших предметов return droppedItems; // Вернем массив выпавших предметов
} else { } else {
return null; // Если ничего не выпало return null; // Если ничего не выпало
@ -2583,12 +2593,13 @@ rpg.action(/critical_\d+/, async (ctx) => {
if (battle.enemy_hp <= 0) { if (battle.enemy_hp <= 0) {
battle.status = "completed"; battle.status = "completed";
await battle.save(); await battle.save();
let items = '';
Exp(ctx, character, enemy.level * 6) Exp(ctx, character, enemy.level * 6)
character.enemiesKilled += 1; character.enemiesKilled += 1;
await character.save(); await character.save();
let droppedItems = await dropItem(character, enemy.id); let droppedItems = await dropItem(character, enemy.id);
logs(ctx, "Предметы с врага", { droppedItems }); logs(ctx, "Предметы с врага", { droppedItems });
if (droppedItems) { if (droppedItems.length > 0) {
for (const item of droppedItems) { for (const item of droppedItems) {
await InventoryModel.create({ await InventoryModel.create({
telegram_id: character.telegram_id, telegram_id: character.telegram_id,
@ -2605,9 +2616,11 @@ rpg.action(/critical_\d+/, async (ctx) => {
img: item.img img: item.img
}); });
} }
items = droppedItems.map((item) => item.name).join(", ");
} }
return ctx.editMessageText( 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 = battle.logs || [];
battle.logs.push(`${character.name} промахнулся.`); battle.logs.push(`${character.name} промахнулся.`);
await enemyTurn(ctx, character, battle);
await battle.save({ fields: ["enemy_hp", "logs"] }); await battle.save({ fields: ["enemy_hp", "logs"] });
await enemyTurn(ctx, character, battle);
// Генерация новых кнопок // Генерация новых кнопок
const buttons = generateBattleButtons(character, battle); const buttons = generateBattleButtons(character, battle);