CampFirePlay/scenes/shop.js
2025-01-08 20:01:54 +03:00

263 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,
CharacterModel,
WorldModel,
SkillsModel,
PropertyModel
} = global.config
const {
spaces,
getSlot,
giveExp,
rand,
random,
setCooldown
} = global.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()
return ctx.editMessageText('Стадии:', Markup.inlineKeyboard([
[{text: 'Взлом кассы', callback_data: `SHOP_CASH_BREAK`}],
[{text: 'Разбить кассу', callback_data: `SHOP_CASH_SMASH`}]
]))
});
shop.action(`SHOP_ENTER`, async (ctx) => {
let character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
if(chance < randomRoll) {
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) => {
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 character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
if(chance < randomRoll) { //Скрытно не удалось, столкновение
}
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 character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
if(chance > 10) {
ctx.session.stage = 'SHOP_GUARD_KILL'
ctx.session.enemy = {
name: 'Охранник',
hp: 1000,
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 character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
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 character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
let cashIn = rand(1000, 10000)
let timer = 1000
if(chance < randomRoll) {
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(() => {
character.dirtymoney += cashIn
character.save()
return ctx.editMessageText(`Вы достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});
shop.action(`SHOP_CASH_SMASH`, async (ctx) => {
let character = await CharacterModel.findByPk(ctx.from.id);
let baseChance = 20; // Базовый шанс
let chance = baseChance + character.intelligence * 2; // Увеличиваем шанс на 2% за каждый пункт "Разума".
let randomRoll = rand(0, 100); // Случайное число от 0 до 100
let cashIn = rand(1000, 10000)
let timer = 1000
if(chance < randomRoll) {
return ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация. Вы сбежали.')
}
ctx.editMessageText('Вы разбили кассовый аппарат, и сработала сигнализация.')
for(i=0; i<rand(3,10);i++){
setTimeout(() => {
cashIn += rand(500, 5000)
ctx.editMessageText(`⏏️ Вы в спешке достали из кассы: Ð${cashIn}`)
}, timer)
timer += 500
}
setTimeout(() => {
character.dirtymoney += cashIn
character.save()
return ctx.editMessageText(`Вы в спешке достали из кассы Ð${cashIn}, пора валить.`, Markup.inlineKeyboard([
[{text: 'Завершить ограбление', callback_data: `SHOP_END`}]
]))
}, timer+300)
});
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(3000, 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) => {
return ctx.editMessageText('Ограбление завершено!')
});
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