CampFirePlay/scenes/shop.js
2023-10-11 11:35:25 +03:00

295 lines
10 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
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/config')
const {
spaces,
getSlot,
giveExp,
rand,
random,
setCooldown
} = require('/workspace/degradin/Dev/Telegram/CampFire Play/utils');
const shop = new Scenes.BaseScene('SHOP_ROBBERY');
bot.on('callback_query', (ctx) => {
const buttonId = ctx.update.callback_query;
console.log(buttonId)
});
shop.enter(async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let property = await PropertyModel.findByPk(ctx.from.id);
if(user.level < 8) return ctx.editMessageText('Доступно с 8 уровня!')
if(property.weapon == 0) return ctx.editMessageText('Для данного задания нужен ствол.')
let shoprobcd = user.shoprobcd
let cooldown = setCooldown(user, 3600, shoprobcd)
if (user.shoprobcd > cooldown.currentTime) return ctx.editMessageText(`📛 Данное действие будет доступно через ${cooldown.timeLeftInMinutes} мин.`);
user.shoprobcd = cooldown.endTime
user.save()
ctx.editMessageText('Выберите режим', Markup.inlineKeyboard([
[
{text: 'SOLO', callback_data: `SHOP_SOLO`},
{text: 'DUO', callback_data: `SHOP_DUO`},
{text: 'GROUP', callback_data: `SHOP_GROUP`}
]
]))
});
shop.action(`SHOP_DUO`, async (ctx) => {
ctx.reply(`Еще не доступно.`)
});
shop.action(`SHOP_GROUP`, async (ctx) => {
ctx.reply(`Еще не доступно.`)
});
shop.action(`SHOP_SOLO`, async (ctx) => {
let property = await PropertyModel.findByPk(ctx.from.id);
if(property.equipment != 0){
ctx.session.user = {
hp: 100,
armor: property.equipment.armor
}
}else{
ctx.session.user = {
hp: 100,
armor: 0
}
}
ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
[
{text: 'Вход', callback_data: `SHOP_ENTER`},
//{text: 'Охранник [DEV]', callback_data: `SHOP_ENTER`},
//{text: 'Отчет', callback_data: `SHOP_CASH_BREAK_SUCCESS`}
]
]))
});
shop.action(`SHOP_ENTER`, async (ctx) => {
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.stealing.level
if(chance < 70) {
return ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...', Markup.inlineKeyboard([
[{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}],
[{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
]))
}
return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
[{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}],
//[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}],
//[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});
shop.action(`SHOP_GUARD`, async (ctx) => {
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.stealing.level
return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
[{text: 'Избавиться от охранника [Скрытность]', callback_data: `SHOP_GUARD_STEALTH`}],
[{text: 'Убить охранника [Владение оружием]', callback_data: `SHOP_GUARD_KILL`}]
]))
});
shop.action(`SHOP_GUARD_STEALTH`, async (ctx) => {
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.stealing.level
if(chance < 40) {
ctx.session.stage = 'SHOP_GUARD_STEALTH'
ctx.reply(`Нападение!`)
ctx.session.enemy = {
name: 'Охранник',
hp: 100,
armor: 20
}
return ctx.scene.enter('PVE')
}
return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
[{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}],
//[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}],
//[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});
shop.action(`SHOP_GUARD_KILL`, async (ctx) => {
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.stealing.level
if(chance > 10) {
ctx.session.stage = 'SHOP_GUARD_KILL'
ctx.session.enemy = {
name: 'Охранник',
hp: 100,
armor: 20
}
return ctx.scene.enter('PVE')
}
return ctx.editMessageText('Охранник обезврежен, вы подходите к кассиру:', Markup.inlineKeyboard([
[{text: 'Убить кассира и забрать все из кассы', callback_data: `SHOP_KILL_CASHIER`}],
//[{text: 'Приказать кассиру сдать кассу [Угроза]', callback_data: `SHOP_THREAT`}],
//[{text: 'Приказать кассиру сдать кассу [Убеждение]', callback_data: `SHOP_CONVICTION`}]
]))
});
shop.action(`SHOP_KILL_CASHIER`, async (ctx) => {
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.stealing.level
if(chance < 60 && !ctx.session.enemy) {
ctx.session.stage = 'SHOP_KILL_CASHIER'
ctx.editMessageText('Вы заметили охранника, с ним нужно что-то сделать...');
ctx.session.enemy = {
name: 'Охранник',
hp: 100,
armor: 20
}
return ctx.scene.enter('PVE')
}
return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
[{text: 'Взлом кассы', callback_data: `SHOP_CASH_BREAK`}],
[{text: 'Разбить кассу', callback_data: `SHOP_CASH_SMASH`}]
]))
});
shop.action(`SHOP_CASH_BREAK`, async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
chance += skill.lockpick.level
let cashIn = rand(1000, 10000)
let timer = 1000
if(chance < 99) {
const keyboard = generateKeyboard();
ctx.deleteMessage()
return ctx.reply('Взлом замка:', keyboard);
//ctx.editMessageText('Вы начали взлом кассы.');
//return ctx.scene.enter('LOCKPICK')
}
for(i=0; i<rand(6,15);i++){
setTimeout(() => {
cashIn += rand(1000, 10000)
ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
}, timer)
timer += 500
}
setTimeout(() => {
user.dirtymoney += cashIn
user.save()
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});
shop.action(`SHOP_CASH_SMASH`, async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let skill = await SkillsModel.findByPk(ctx.from.id)
let chance = rand(0, 100)
if(chance < 50) {
ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация.')
ctx.session.stage = 'SHOP_CASH_SMASH'
ctx.session.enemy = {
name: 'Полицейский',
hp: 100,
armor: 100
}
return ctx.scene.enter('PVE')
}
return ctx.editMessageText('Вы разбили кассовый аппарат и достали кэш, пора валить.', Markup.inlineKeyboard([
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
});
shop.action(`SHOP_CASH_BREAK_SUCCESS`, async (ctx) => {
let user = await UserModel.findByPk(ctx.from.id)
let cashIn = rand(1000, 10000)
let timer = 100
for(i=0; i<rand(6,15);i++){
setTimeout(() => {
cashIn += rand(1000, 10000)
ctx.editMessageText(`⏏️ Вы достали из кассы: Ð${cashIn}`)
}, timer)
timer += 500
}
setTimeout(() => {
user.dirtymoney += cashIn
user.save()
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});
shop.action(`SHOP_END`, async (ctx) => {
ctx.editMessageText('Ограбление завершено!')
return ctx.scene.leave();
});
shop.action(/lock_*/, (ctx) => {
const buttonId = ctx.update.callback_query.data;
ctx.answerCbQuery(`Штифт не сдвинулся.`);
removeButton(ctx, buttonId);
});
function generateKeyboard() {
const buttonsCount = 10;
const buttons = [];
const winButton = rand(1, 10)
for (let i = 1; i <= buttonsCount; i++) {
if(i == winButton){
buttons.push({ text: `🔒`, callback_data: `SHOP_CASH_BREAK_SUCCESS` })
}else{
buttons.push({ text: `🔒`, callback_data: `lock_${i}` })
}
}
let rows = []
while (buttons.length > 0) {
rows.push(buttons.splice(0, 5)) // разбиваем на подмассивы по 5 кнопок
}
return {
reply_markup: {
inline_keyboard: rows,
},
};
}
shop.leave((ctx) => {
console.log('Завершено');
});
function removeButton(ctx, buttonId) {
const keyboard = ctx.update.callback_query.message.reply_markup.inline_keyboard;
for (let row of keyboard) {
for (let i = 0; i < row.length; i++) {
if (row[i].callback_data === buttonId) {
row[i].text = `🔓`
break;
}
}
}
if (keyboard.flat().length === 0) {
console.log(`Lockpick completed`)
} else {
console.log(keyboard)
ctx.editMessageText('Взлом замка:', Markup.inlineKeyboard(keyboard));
}
}
module.exports = shop