const { Telegraf, Scenes, Markup } = require('telegraf') const bot = new Telegraf(process.env.BOT_TOKEN) const { slots, phones, UserModel, WorldModel, SkillsModel, PropertyModel } = require('/workspace/degradin/Dev/Telegram/CampFire Play/config') const { spaces, getSlot, giveExp, rand, random, setCooldown, drop } = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils'); const newpve = new Scenes.BaseScene('NEWPVE'); const resultTier = [ {hit: 'Head', droprate: 10}, {hit: 'Chest', droprate: 14}, {hit: 'Stom', droprate: 16}, {hit: 'Arms', droprate: 18}, {hit: 'Legs', droprate: 20}, {hit: 'Miss', droprate: 22} ] newpve.enter(async (ctx) => { let property = await PropertyModel.findByPk(ctx.from.id) let mainMessage = await ctx.reply(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([ [{text: '👮', callback_data: `HIT_HEAD`}], [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}], [{text: '👖', callback_data: `HIT_STOM`}], [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}], ])); ctx.session.mainMessage = mainMessage ctx.session.battlelog = `\nBattle Log:\n` }); newpve.on('callback_query', async (ctx, next) => { ctx.session.stage = `SHOP_KILL_CASHIER` setTimeout(() => { if(ctx.session.enemy.hp <= 0){ switch(ctx.session.stage){ case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH': ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} } return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([ [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}] ])) case 'SHOP_CASH_SMASH': ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} } return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([ [{text: 'Завершить ограбление', callback_data: `SHOP_END`}] ])) default: return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([ [{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}] ])) } } }, 500); return next().then(() => { }) }) newpve.action('HIT_HEAD', async (ctx) => { let result = drop(resultTier) let msg = ctx.session.mainMessage if(rand(1,100) >= 25){ ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.` }else{ let enemyHP = ctx.session.enemy.hp let property = await PropertyModel.findByPk(ctx.from.id) enemyHP = enemyHP - (property.weapon.damage*1000)*10 ctx.session.enemy.hp = enemyHP ctx.session.battlelog += `\nВы попадаете в голову: ${(property.weapon.damage*1000)*10} урона.` } await bot.telegram.editMessageText( msg.chat.id, // ID чата msg.message_id, // ID сообщения, которое вы хотите изменить undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([ [{text: '👮', callback_data: `HIT_HEAD`}], [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}], [{text: '👖', callback_data: `HIT_STOM`}], [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}], ]) ) }) newpve.action('HIT_CHEST', async (ctx) => { let result = drop(resultTier) let msg = ctx.session.mainMessage if(rand(1,100) >= 50){ ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.` }else{ let enemyHP = ctx.session.enemy.hp let enemyArmor = ctx.session.enemy.armor let property = await PropertyModel.findByPk(ctx.from.id) if(enemyArmor > 0){ enemyArmor = enemyArmor - (property.weapon.damage*1000)*5 if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor ctx.session.battlelog += `\nВы попадаете в бронежилет: ${(property.weapon.damage*1000)*5} урона.` }else{ enemyHP = enemyHP - (property.weapon.damage*1000)*5 ctx.session.battlelog += `\nВы попадаете в грудь: ${(property.weapon.damage*1000)*5} урона.` } ctx.session.enemy.armor = enemyArmor ctx.session.enemy.hp = enemyHP } await bot.telegram.editMessageText( msg.chat.id, // ID чата msg.message_id, // ID сообщения, которое вы хотите изменить undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([ [{text: '👮', callback_data: `HIT_HEAD`}], [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}], [{text: '👖', callback_data: `HIT_STOM`}], [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}], ]) ) }) newpve.action('HIT_LEG', async (ctx) => { let result = drop(resultTier) let msg = ctx.session.mainMessage if(rand(1,100) >= 70){ ctx.session.battlelog += `\nВы промахиваетесь!\n${ctx.session.enemy.name} наносит вам 10 урона.` }else{ let enemyHP = ctx.session.enemy.hp let property = await PropertyModel.findByPk(ctx.from.id) enemyHP = enemyHP - (property.weapon.damage*1000)/1.5 ctx.session.enemy.hp = enemyHP ctx.session.battlelog += `\nВы попадаете в ногу: ${(property.weapon.damage*1000)/1.5} урона.` } await bot.telegram.editMessageText( msg.chat.id, // ID чата msg.message_id, // ID сообщения, которое вы хотите изменить undefined, // Inline-клавиатуру оставьте неопределенной, чтобы она не изменилась `Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}` + ctx.session.battlelog, Markup.inlineKeyboard([ [{text: '👮', callback_data: `HIT_HEAD`}], [{text: '💪', callback_data: `HIT_ARM`},{text: '👕', callback_data: `HIT_CHEST`},{text: '💪', callback_data: `HIT_ARM`}], [{text: '👖', callback_data: `HIT_STOM`}], [{text: '🦵', callback_data: `HIT_LEG`},{text: '🦵', callback_data: `HIT_LEG`}], ]) ) }) newpve.action('attack', async (ctx) => { let enemyHP = ctx.session.enemy.hp let enemyArmor = ctx.session.enemy.armor let property = await PropertyModel.findByPk(ctx.from.id) let result = drop(resultTier) console.log(result) switch(result.hit){ case 'Head': enemyHP = enemyHP - (property.weapon.damage*1000)*10 ctx.reply(`Enemy Head: HP:${enemyHP} Armor: ${enemyArmor}`) break; case 'Chest': if(enemyArmor > 0){ enemyArmor = enemyArmor - (property.weapon.damage*1000)*5 if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`) }else{ enemyHP = enemyHP - (property.weapon.damage*1000)*5 ctx.reply(`Enemy Chest: HP:${enemyHP} Armor: ${enemyArmor}`) } break; case 'Stom': if(enemyArmor > 0){ enemyArmor = enemyArmor - (property.weapon.damage*1000)*3 if(enemyArmor < 0) enemyHP = enemyHP + enemyArmor ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`) }else{ enemyHP = enemyHP - (property.weapon.damage*1000)*3 ctx.reply(`Enemy Stom: HP:${enemyHP} Armor: ${enemyArmor}`) } break; case 'Arms': enemyHP = enemyHP - (property.weapon.damage*1000)/2 ctx.reply(`Enemy Arms: HP:${enemyHP} Armor: ${enemyArmor}`) break; case 'Legs': enemyHP = enemyHP - (property.weapon.damage*1000)/1.5 ctx.reply(`Enemy Legs: HP:${enemyHP} Armor: ${enemyArmor}`) break; case 'Miss': ctx.reply(`Промах, лох`) break; } ctx.session.enemy.hp = enemyHP ctx.session.enemy.armor = enemyArmor if (enemyHP <= 0) { console.log(ctx.session) switch(ctx.session.stage){ case 'SHOP_KILL_CASHIER': case 'SHOP_GUARD_KILL': case 'SHOP_GUARD_STEALTH': ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} } return ctx.sendMessage('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([ [{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}], //[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}], //[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}] ])) case 'SHOP_CASH_SMASH': ctx.session.__scenes = { current: 'SHOP_ROBBERY', state: {} } return ctx.sendMessage('Вы завершили перестрелку с полицией, пора валить.', Markup.inlineKeyboard([ [{text: 'Завершить ограбление', callback_data: `SHOP_END`}] ])) default: return ctx.sendMessage('Ошибка выхода из сцены => DEBUG', Markup.inlineKeyboard([ [{text: 'Завершить ограбление [Магазин]', callback_data: `SHOP_END`}] ])) } } else { // Противник еще жив, отправляем сообщение с обновленным HP и кнопкой для атаки let enemyDmg = rand(0, 10) ctx.session.user.hp -= enemyDmg if(ctx.session.user.hp <= 0) { ctx.editMessageText(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}\nВы критически ранены!`, Markup.inlineKeyboard([ [ {text: 'Завершить ограбление', callback_data: `SHOP_END`} ] ])) } ctx.sendMessage(`${ctx.session.enemy.name} наносит вам ${enemyDmg} урона.\n Осталось HP: ${ctx.session.user.hp}`) ctx.editMessageText(`Ваш противник:\n${ctx.session.enemy.name}\nЗдоровье: ${ctx.session.enemy.hp}\nБроня: ${ctx.session.enemy.armor}`, Markup.inlineKeyboard([ [ {text: `${property.weapon.name}`, callback_data: `attack`} ] ])); } }); newpve.leave((ctx) => { console.log('Завершено'); }); module.exports = newpve