TaNaRiS
Аватар
Игрок
14  
02.12.2025 12:09:03

Игровая площадь

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

02.12.2025 12:14:49

Re: Игровая площадь

Сообщение удалено модератором Vera 02.12.2025 12:18:17

02.12.2025 12:16:37

Re: Игровая площадь

Сообщение удалено модератором Vera 02.12.2025 12:18:08

Vera
Аватар
☀ ☁ ☔
5   
02.12.2025 12:18:31

Re: Игровая площадь

Не путайте ветку с веткой флуда.


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

Vulture
Аватар
🦅💖💃
10   
02.12.2025 12:50:51

Re: Игровая площадь

TaNaRiS

но приплести сюда сумрак ошибка

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


Да мне всё можно, я же суперзвезда!

Vera
Аватар
☀ ☁ ☔
5   
02.12.2025 13:08:26

Re: Игровая площадь

TaNaRiS

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

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


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

02.12.2025 17:02:29

Re: Игровая площадь

Сообщение удалено модератором Vera 02.12.2025 22:28:26

03.12.2025 00:55:18

Re: Игровая площадь

Сообщение удалено модератором Vera 03.12.2025 06:17:17

Владыка
Аватар
Игрок
14  
Вчера 23:21:58

Re: Игровая площадь

Неужели нельзя на 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
  };
}


"גם זו יעבור" - И это тоже пройдёт.

Владыка
Аватар
Игрок
14  
Вчера 23:23:49

Re: Игровая площадь

Это взято из приблизительно аналогичной игры про аэропорт с 1000+ зарегистрированных игроков.


"גם זו יעבור" - И это тоже пройдёт.

Vera
Аватар
☀ ☁ ☔
5   
Сегодня 06:08:07

Re: Игровая площадь

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


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

Владыка
Аватар
Игрок
14  
Сегодня 06:36:05

Re: Игровая площадь

Vera

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

Я хочу после сумеречной партии последней сыгранной выходить туда, где секонд-хенд.

В чем проблема? Ведь из випа выходят не на крестовую локацию с магазином и ДК, а на локацию випа и ожиданки.

Почему то же самое не сделать для сумрака и ожиданки?


"גם זו יעבור" - И это тоже пройдёт.

Vera
Аватар
☀ ☁ ☔
5   
Сегодня 06:43:18

Re: Игровая площадь

Описывай проблему правильно: я хочу выходить на нужный перекрёсток с площади. А не: я хочу выходить в нужную локацию после партии.

Вообще это точечная проблема, решается за всего один лишний клик. Точно ли в этом есть прямо необходимость?

Интерфейс входа в любом случае планируется менять. Перекрёстки тоже немного другую роль будут играть.


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