249 lines
12 KiB
JavaScript
249 lines
12 KiB
JavaScript
const {
|
||
Telegraf,
|
||
Scenes,
|
||
Markup
|
||
} = require('telegraf')
|
||
const bot = new Telegraf(process.env.BOT_TOKEN)
|
||
const {
|
||
slots,
|
||
phones,
|
||
UserModel,
|
||
WorldModel,
|
||
SkillsModel,
|
||
PropertyModel
|
||
} = global.config
|
||
const {
|
||
spaces,
|
||
getSlot,
|
||
giveExp,
|
||
rand,
|
||
random,
|
||
setCooldown,
|
||
drop
|
||
} = global.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 |