Элементальная коллекция

Общее описание

Модуль "Элементальная коллекция" отвечает за управление коллекцией элементалей игрока — персонажей различных стихий и редкостей. Он обеспечивает функциональность фильтрации, отображения, прокачки и повышения уровня элементалей. Основная задача — предоставить игроку удобный интерфейс для обзора своих персонажей, выбора подходящих для прокачки и контроля ресурсов (маны), необходимых для улучшений.

Этот модуль решает несколько ключевых проблем:

Как работает модуль

Фильтрация и отображение коллекции

Основной компонент интерфейса — CollectionTab.tsx. Он управляет состоянием выбранных фильтров по стихиям (selectedElement) и редкости (selectedRarity), а также текущим выбранным элементалем для прокачки.

const filteredElementals = ownedElementals
  .filter(elemental => {
    if (selectedElement !== 'all' && elemental.element !== selectedElement)
      return false;
    if (selectedRarity !== 'all' && elemental.rarity !== selectedRarity)
      return false;
    return true;
  })
  .sort(sortByRarity);

Если после фильтрации нет элементалей, показывается специальное сообщение с предложением сбросить фильтры или получить новых персонажей.

Прокачка и подтверждение улучшений

При нажатии на кнопку прокачки в карточке элементаля вызывается функция handleLevelUpClick, которая открывает модальное окно подтверждения прокачки (showConfirmModal).

const handleConfirmLevelUp = () => {
  if (selectedElemental && selectedDisplayData) {
    onLevelUpElemental(selectedElemental.id);
    setShowConfirmModal(false);
    // Вибрация карточки после прокачки
  }
};

Карточка элементаля (CollectibleCard.tsx)

Компонент карточки отображает:

Карточка также содержит логику вибрации для подтверждения прокачки, которая использует либо Telegram WebApp API (при запуске внутри Telegram), либо Web Vibration API в браузере.

Логика прокачки и ресурсов (gameLogic.ts)

В модуле бизнес-логики реализованы функции для:

export const canLevelUpElemental = (
  elemental: CollectedElemental,
  playerMana: number
): boolean => {
  if (elemental.rarity === 'immortal') {
    return false;
  }

  const maxLevel = getMaxLevelForRarity(elemental.rarity);
  const canUpgradeRarity = elemental.level >= maxLevel;

  if (canUpgradeRarity) {
    const upgradeCost = getRarityUpgradeCost(elemental.rarity);
    return playerMana >= upgradeCost;
  }

  const levelUpCost = getLevelUpCost(elemental);
  return elemental.level < maxLevel && playerMana >= levelUpCost;
};

Таким образом, бизнес-логика обеспечивает правильное ограничение прокачки и экономическую балансировку.

Взаимодействие с другими частями системы

Ключевые концепции и особенности

Визуализация процесса прокачки элементаля

sequenceDiagram
    participant User as Игрок
    participant UI as CollectionTab
    participant Card as CollectibleCard
    participant Logic as gameLogic.ts
    participant Parent as Родительский компонент

    User->>UI: Выбирает фильтры коллекции
    UI->>UI: Фильтрует и отображает элементалей
    User->>Card: Нажимает "Level Up" на карточке
    Card->>UI: Вызывает handleLevelUpClick
    UI->>UI: Открывает модальное окно подтверждения
    User->>UI: Подтверждает прокачку
    UI->>Parent: Вызывает onLevelUpElemental(elementalId)
    Parent->>Logic: levelUpElemental(elemental)
    Logic-->>Parent: Обновлённый элементаль или новый с повышенной редкостью
    Parent->>UI: Обновляет состояние игрока и коллекции
    UI->>Card: Триггерит вибрацию на карточке
    Card-->>User: Визуальная и тактильная обратная связь

Данная документация описывает модуль "Элементальная коллекция" с акцентом на функциональность фильтрации, прокачки и взаимодействия с ресурсами, а также интеграцию с общей логикой игры и UI.