generateRoles(users) {
const roles = {
mafia: Math.ceil(users.length / 3.6) - 2, // Мафия - по формуле M = N / k
don: 1, // Дон мафии
commissioner: users.length >= 6 ? 1 : 0, // Комиссар (при 6 и больше игроков)
sergeant: users.length >= 8 ? 1 : 0, // Сержант (при 8 и больше игроков)
mistress: users.length >= 8 ? 1 : 0, // Любовница (при 8 и больше игроков)
maniac: users.length >= 7 ? 1 : 0, // Маньяк (при 7 и больше игроков)
lawyer: users.length >= 10 ? 1 : 0, // Адвокат (при 10 и больше игроков)
doctor: 1, // Доктор
civilian: 0 // Мирные жители
}
roles.civilian = roles.length - roles.mafia + roles.don + roles.commissioner + // Setting civilian count
roles.sergeant + roles.mistress + roles.maniac +
roles.doctor const usersArr = []
function randomInteger(min, max) {
return Math.floor(min + Math.random() * (max + 1 - min))
}
(function generateRandomRoles(users, arr, index) {
if (index) {
const randNum = randomInteger(0, 8)
return roles[Object.keys(roles)[randNum]] !== 0
? (usersArr.push({ id: users[index], role: Object.keys(roles)[randNum] }), roles[Object.keys(roles)[randNum]] -= 1)
: generateRandomRoles(users, arr, index)
}
users.map((user, index) => {
const randNum = randomInteger(0, 8)
const rolesProp = roles[Object.keys(roles)[randNum]]
return rolesProp !== 0
? (usersArr.push({ id: user, role: Object.keys(roles)[randNum] }), roles[Object.keys(roles)[randNum]] -= 1)
: generateRandomRoles(users, arr, index)
})
})(users, usersArr)
return usersArr
}