gameLogic.ts


Обзор

Файл gameLogic.ts содержит основную бизнес-логику игры, связанную с элементалями — персонажами различных стихий и редкостей, которым свойственны уровни развития, эволюция и защита. В этом модуле реализованы константы, описывающие стихии, локации, типы элементалей и их эволюционные стадии, а также функции для управления коллекцией элементалей, прокачкой, боями и системой охлаждения (кулдаунов).

Основные задачи файла:

Файл является ключевым слоем бизнес-логики и тесно взаимодействует с UI-компонентами и другими частями игры, предоставляя им готовые функции и константы для игрового процесса.


Основные сущности и константы

Элементы (стихии)

export const ELEMENTS: Record<Element, ElementData>

Локации

export const LOCATIONS: Record<Location, LocationData>

Типы элементалей и эволюции

export const ELEMENTAL_TYPES: Record<Element, Record<ElementalRarity, ElementalData>>
export const EVOLUTION_STAGES: Record<Element, Record<ElementalRarity, EvolutionData[]>>

Функции управления коллекцией элементалей

generateElementalId(element: Element, rarity: ElementalRarity): string

Генерирует уникальный идентификатор для элементаля на основе его стихии, редкости и текущего времени.

Параметры:

Возвращаемое значение:

Пример использования:

const id = generateElementalId('fire', 'rare');

createInitialCollection(): ElementalCollection

Создаёт стартовую коллекцию элементалей для игрока, включая по одному элементалю каждого типа редкости "common".

Возвращаемое значение:


addElementalToCollection(collection: ElementalCollection, element: Element, rarity: ElementalRarity): ElementalCollection

Добавляет новый элементаль в коллекцию, генерируя для него уникальный ID и обновляя счётчики владения.

Параметры:

Возвращаемое значение:


Функции прокачки и развития элементалей

getElementalProtection(elemental: CollectedElemental): number

Возвращает процент защиты элементаля, зависящий от стихии и редкости.


addExperienceToElemental(elemental: CollectedElemental, exp: number): CollectedElemental

Добавляет опыт к элементалю, повышая уровень при достижении порога (100 * уровень).

Параметры:

Возвращаемое значение:


getLevelUpCost(elemental: CollectedElemental): number

Вычисляет стоимость повышения уровня элементаля в мане, с учётом редкости.


getRarityUpgradeCost(currentRarity: ElementalRarity): number

Возвращает стоимость повышения редкости элементаля на следующую ступень.


canLevelUpElemental(elemental: CollectedElemental, playerMana: number): boolean

Проверяет, доступна ли прокачка элементаля с учётом текущего уровня, редкости и доступной маны игрока.


levelUpElemental(elemental: CollectedElemental): CollectedElemental

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


getNextRarity(currentRarity: ElementalRarity): ElementalRarity

Возвращает следующую редкость для элементаля или оставляет "immortal" без изменений.


getMaxLevelForRarity(rarity: ElementalRarity): number

Определяет максимальный уровень для каждой редкости (обычно 4 для common, rare, epic; 1 для immortal).


Система кулдауна (Cooldown)

getElementalCooldownHours(rarity: ElementalRarity): number

Возвращает длительность кулдауна в часах для элементаля заданной редкости.


setElementalCooldown(elemental: CollectedElemental): CollectedElemental

Устанавливает время окончания кулдауна для элементаля на основе текущего времени и длительности.


isElementalOnCooldown(elemental: CollectedElemental): boolean

Проверяет активен ли кулдаун у элементаля.


getElementalCooldownRemaining(elemental: CollectedElemental): number

Возвращает остаток времени кулдауна в миллисекундах.


formatCooldownTime(milliseconds: number): string

Форматирует время кулдауна для отображения (например, "2h 30m" или "Ready").


getElementalCooldownProgress(elemental: CollectedElemental): number

Возвращает прогресс кулдауна в процентах для визуального отображения.


Механика боя и соперники

getWinner(element1: Element, element2: Element): BattleResult

Определяет победителя по стихиям согласно правилу: земля > вода > огонь > земля. Возвращает "player", "opponent" или "draw".


generateOpponent(location: Location): Opponent

Генерирует случайного соперника с именем, аватаром, уровнем, редкостью, ставкой (маной) и элементом, используя данные локации.


getRandomElement(): Element

Возвращает случайный элемент из доступных стихий.


getRandomElementalReward(): { element: Element; rarity: ElementalRarity }

Генерирует случайную награду в виде элементаля с вероятностями для разных редкостей.


calculateBattleResult(...)

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

Параметры:

Возвращаемое значение:

Объект с изменениями маны (playerManaChange, opponentManaChange), победителем (winner) и сохранённой защитой (protectionSaved).


Система рангов и титулов

getRank(level: number): string

Возвращает ранг игрока по уровню: Novice, Adept, Expert, Master.


getTitle(wins: number, winStreak: number): string

Возвращает титул игрока в зависимости от количества побед и серии побед.


Достижения

getAchievementDefinitions(): Achievement[]

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


Вспомогательные функции


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


Визуальная структура — диаграмма классов и функций

classDiagram
    class gameLogic {
        <<module>>
        +ELEMENTS: Record<Element, ElementData>
        +LOCATIONS: Record<Location, LocationData>
        +ELEMENTAL_TYPES: Record<Element, Record<ElementalRarity, ElementalData>>
        +EVOLUTION_STAGES: Record<Element, Record<ElementalRarity, EvolutionData[]>>
        +generateElementalId(element: Element, rarity: ElementalRarity): string
        +createInitialCollection(): ElementalCollection
        +addElementalToCollection(collection: ElementalCollection, element: Element, rarity: ElementalRarity): ElementalCollection
        +getElementalProtection(elemental: CollectedElemental): number
        +addExperienceToElemental(elemental: CollectedElemental, exp: number): CollectedElemental
        +getLevelUpCost(elemental: CollectedElemental): number
        +getRarityUpgradeCost(currentRarity: ElementalRarity): number
        +canLevelUpElemental(elemental: CollectedElemental, playerMana: number): boolean
        +levelUpElemental(elemental: CollectedElemental): CollectedElemental
        +getNextRarity(currentRarity: ElementalRarity): ElementalRarity
        +getMaxLevelForRarity(rarity: ElementalRarity): number
        +getElementalCooldownHours(rarity: ElementalRarity): number
        +setElementalCooldown(elemental: CollectedElemental): CollectedElemental
        +isElementalOnCooldown(elemental: CollectedElemental): boolean
        +getElementalCooldownRemaining(elemental: CollectedElemental): number
        +formatCooldownTime(milliseconds: number): string
        +getElementalCooldownProgress(elemental: CollectedElemental): number
        +getRandomElementalReward(): {element: Element, rarity: ElementalRarity}
        +getWinner(element1: Element, element2: Element): BattleResult
        +generateOpponent(location: Location): Opponent
        +getRandomElement(): Element
        +getRank(level: number): string
        +getTitle(wins: number, winStreak: number): string
        +getAchievementDefinitions(): Achievement[]
        +getAvailableElementals(element: Element): ElementalRarity[]
        +getElementalData(element: Element, rarity: ElementalRarity): ElementalData
        +calculateProtectedMana(wager: number, element: Element | null, elementalRarity: ElementalRarity | null): number
        +getElementalProtectionFromCollection(collection: ElementalCollection, element: Element, rarity: ElementalRarity): number
        +calculateBattleResult(baseWager: number, playerElement: Element, playerElemental: ElementalRarity | null,
                              opponentElement: Element, opponentElemental: ElementalRarity | null, playerCollection?: ElementalCollection):
                              {playerManaChange: number, opponentManaChange: number, winner: BattleResult, protectionSaved: number}
        +canAffordLocation(playerMana: number, location: Location): boolean
        +getAvailableMana(playerMana: number, selectedLocation: Location | null): number
    }

Примеры использования

Проверка возможности прокачки элементаля

const canLevelUp = canLevelUpElemental(myElemental, player.mana);
if (canLevelUp) {
  // Можно открыть модальное окно прокачки
}

Повышение уровня или редкости элементаля

const leveledUpElemental = levelUpElemental(myElemental);
// Обновить коллекцию элементалей с новым элементалем

Расчёт результата боя

const battleResult = calculateBattleResult(
  wager,
  playerElement,
  playerElementalRarity,
  opponentElement,
  opponentElementalRarity,
  playerCollection
);

if (battleResult.winner === 'player') {
  console.log('Победа!');
}

Итог

gameLogic.ts — это ядро бизнес-логики игры, обеспечивающее полный набор функций для управления коллекцией элементалей, их прокачкой, проведением боёв и системой достижений. Благодаря строгой типизации и детальному учёту игровых правил, модуль служит надёжной основой для UI и серверной части игры, обеспечивая масштабируемость и простоту поддержки.


Конец документации файла gameLogic.ts