

Игровая площадь затея конечно в целом интересная, но приплести сюда сумрак ошибка.
Отделить сумрак, как обычную локацию - пусть отдельная каста тусится в своём кругу
В идеале добавить к ней Правосудие!




но приплести сюда сумрак ошибка
нет.
активно ведутся игры на сумраке и ты сам это видишь, и новопришедший новичок видит активность в игре и захочет остаться) а если глянет хотя бы одним глазом что такое сумрак и заинтересуется, то тем более останется)
Да мне всё можно, я же суперзвезда!


приплести сюда сумрак ошибка.
Отделить сумрак, как обычную локацию - пусть отдельная каста тусится в своём кругу
И да, и нет.
Изначально конечно был смысл объединять Кресты и Ожу. Но на практике мало бы на что повлияло. Поэтому пока принято то решение, что сейчас.
Сейчас добавился элемент движухи, осталось поработать над активацией игр.

Не в пирожках мясо


Неужели нельзя на Javascript добавить функционал простой, типа предложенного ниже, чтобы игроки выходили на локацию своей последней партии?
const STREET_CONFIG = {
'улица крещения': {
exitLocation: 'Площадь Крещения',
gameType: 'стандарт'
},
'улица ожидания': {
exitLocation: 'Зал Ожидания',
gameType: 'стандарт'
},
'сумеречный переулок': {
exitLocation: 'Темный Выход',
gameType: 'стандарт'
},
'улица правосудия': {
exitLocation: 'Зал Суда',
gameType: 'вип'
},
'конструктор': {
exitLocation: 'Мастерская',
gameType: 'вип'
}
};
const GAME_VENUES = {
'Игровая площадь': ['улица крещения', 'улица ожидания', 'сумеречный переулок'],
'Вип-клуб': ['улица крещения', 'улица ожидания', 'сумеречный переулок', 'улица правосудия', 'конструктор']
};
const COMMON_EXITS = {
'улица ожидания': 'Зал Ожидания', // улица ожидания всегда ведет в Зал Ожидания
'вип-клуб': 'Зал Ожидания' // выход из вип-клуба тоже в Зал Ожидания
};
class PlayerManager {
constructor() {
this.players = new Map();
}
addPlayer(player) {
this.players.set(player.id, player);
}
getPlayerExitLocation(playerId) {
const player = this.players.get(playerId);
if (!player) {
throw new Error(`Игрок с ID ${playerId} не найден`);
}
const lastGame = player.getLastGame();
if (!lastGame) {
throw new Error(`У игрока ${playerId} нет сыгранных партий`);
}
return this.calculateExitLocation(lastGame);
}
// Расчет локации выхода на основе последней игры
calculateExitLocation(game) {
const { street, venue } = game;
if (COMMON_EXITS[street]) {
return COMMON_EXITS[street];
}
if (COMMON_EXITS[venue]) {
return COMMON_EXITS[venue];
}
// Получаем локацию из конфигурации улицы
const streetConfig = STREET_CONFIG[street];
if (!streetConfig) {
throw new Error(`Неизвестная улица: ${street}`);
}
// Проверяем, доступна ли улица на данной площадке
const venueStreets = GAME_VENUES[venue];
if (!venueStreets || !venueStreets.includes(street)) {
throw new Error(`Улица ${street} не доступна на площадке ${venue}`);
}
return streetConfig.exitLocation;
}
// Массовая обработка игроков (для масштабирования)
batchProcessPlayers(playerIds) {
const results = new Map();
for (const playerId of playerIds) {
try {
const location = this.getPlayerExitLocation(playerId);
results.set(playerId, { success: true, location });
} catch (error) {
results.set(playerId, {
success: false,
error: error.message
});
}
}
return results;
}
}
class Player {
constructor(id, name) {
this.id = id;
this.name = name;
this.games = [];
}
// Добавление сыгранной игры
addGame(game) {
this.games.push({
...game,
timestamp: new Date().toISOString()
});
}
// Получение последней игры
getLastGame() {
if (this.games.length === 0) return null;
// Сортируем игры по времени (последняя - самая свежая)
return this.games
.slice()
.sort((a, b) => new Date(b.timestamp) - new Date(a.timestamp))[0];
}
}
class Game {
constructor(street, venue) {
this.street = street;
this.venue = venue;
}
}
function exampleUsage() {
const manager = new PlayerManager();
const player1 = new Player(1, 'Игрок 1');
player1.addGame(new Game('улица крещения', 'Игровая площадь'));
player1.addGame(new Game('улица ожидания', 'Игровая площадь'));
player1.addGame(new Game('улица правосудия', 'Вип-клуб')); // Последняя игра
manager.addPlayer(player1);
// Получаем локацию выхода для игрока
try {
const exitLocation = manager.getPlayerExitLocation(1);
console.log(`Игрок ${player1.name} перемещен в: ${exitLocation}`);
// Вывод: Игрок Игрок 1 перемещен в: Зал Ожидания
} catch (error) {
console.error(`Ошибка: ${error.message}`);
}
// Пример массовой обработки
const player2 = new Player(2, 'Игрок 2');
player2.addGame(new Game('конструктор', 'Вип-клуб'));
manager.addPlayer(player2);
const results = manager.batchProcessPlayers([1, 2]);
console.log(results);
}
// Оптимизированная версия для 1000+ игроков
class OptimizedPlayerManager extends PlayerManager {
constructor() {
super();
this.playerCache = new Map();
}
getPlayerExitLocation(playerId) {
// Проверяем кэш
if (this.playerCache.has(playerId)) {
return this.playerCache.get(playerId);
}
const location = super.getPlayerExitLocation(playerId);
// Сохраняем в кэш
this.playerCache.set(playerId, location);
return location;
}
// Очистка кэша при изменении игр
clearCache(playerId) {
this.playerCache.delete(playerId);
}
}
exampleUsage();
// Функция для обработки массива игроков
function processPlayersArray(playersArray) {
const manager = new OptimizedPlayerManager();
playersArray.forEach(playerData => {
const player = new Player(playerData.id, playerData.name);
playerData.games.forEach(gameData => {
player.addGame(new Game(gameData.street, gameData.venue));
});
manager.addPlayer(player);
});
// Обрабатываем всех игроков
const playerIds = playersArray.map(p => p.id);
return manager.batchProcessPlayers(playerIds);
}
// Экспорт для использования в других модулях
if (typeof module !== 'undefined' && module.exports) {
module.exports = {
PlayerManager,
OptimizedPlayerManager,
Player,
Game,
STREET_CONFIG,
GAME_VENUES,
COMMON_EXITS,
processPlayersArray
};
}
"גם זו יעבור" - И это тоже пройдёт.


Это взято из приблизительно аналогичной игры про аэропорт с 1000+ зарегистрированных игроков.
"גם זו יעבור" - И это тоже пройдёт.


Ещё раз: сейчас существует одна локация. Куда ты хочешь выходить в разные места, если место одно?)
И зачем этот код, если при существовании разных локаций, игроки прекрасно выходили каждый в свою?

Не в пирожках мясо


Ещё раз: сейчас существует одна локация. Куда ты хочешь выходить в разные места, если место одно?)
И зачем этот код, если при существовании разных локаций, игроки прекрасно выходили каждый в свою?
Я хочу после сумеречной партии последней сыгранной выходить туда, где секонд-хенд.
В чем проблема? Ведь из випа выходят не на крестовую локацию с магазином и ДК, а на локацию випа и ожиданки.
Почему то же самое не сделать для сумрака и ожиданки?
"גם זו יעבור" - И это тоже пройдёт.


Описывай проблему правильно: я хочу выходить на нужный перекрёсток с площади. А не: я хочу выходить в нужную локацию после партии.
Вообще это точечная проблема, решается за всего один лишний клик. Точно ли в этом есть прямо необходимость?
Интерфейс входа в любом случае планируется менять. Перекрёстки тоже немного другую роль будут играть.

Не в пирожках мясо