Merge branch 'main' of https://git.campfiregg.ru/degradin/CampFirePlay
This commit is contained in:
commit
ecaad92ef0
70
rpg.js
70
rpg.js
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user