CampFirePlay/scenes/newpve.js
2024-12-21 20:01:15 +03:00

249 lines
12 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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