types.ts

Обзор файла

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

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


Описание типов и интерфейсов

Основные типы


Интерфейсы данных

ElementData

interface ElementData {
  name: string;
  emoji: string;
  color?: string;
}

LocationData

interface LocationData {
  name: string;
  emoji: string;
  mana: number;
}

ElementalData

interface ElementalData {
  name: string;
  emoji: string;
  rarity: string;
  protection: number;
  evolutionCost?: number;
  legendary?: boolean;
}

Система коллекций

CollectedElemental

interface CollectedElemental {
  id: string;
  element: Element;
  rarity: ElementalRarity;
  level: number;
  experience: number;
  isOwned: boolean;
  lastUsed?: number;
  timesUsed: number;
  cooldownEndTime?: number;
}

ElementalCollection

interface ElementalCollection {
  elementals: Record<string, CollectedElemental>;
  totalOwned: number;
  totalImmortal: number;
  totalEpic: number;
  collectionProgress: Record<Element, number>;
}

EvolutionData

interface EvolutionData {
  stage: number;
  name: string;
  emoji: string;
  protection: number;
  cost: number;
  requiredLevel: number;
}

Статистика и игрок

PlayerStats

interface PlayerStats {
  name: string;
  avatar?: string;
  mana: number;
  wins: number;
  losses: number;
  selectedElement: Element | null;
  selectedLocation: Location | null;
  selectedElemental: ElementalRarity | null;
  winStreak: number;
  bestStreak: number;
  maxLossStreak: number;
  currentLossStreak: number;
  totalBattles: number;
  experience: number;
  level: number;
  favoriteElement: string | null;
  elementStats: Record<Element, number>;
  achievements: string[];
  lastManaChange: number;
  totalManaWon: number;
  totalManaLost: number;
  elementalCollection: ElementalCollection;
  totalElementalsCollected: number;
  immortalElementalsOwned: number;
  epicElementalsOwned: number;
}

Противник

interface Opponent {
  name: string;
  avatar: string;
  level: number;
  rarity: string;
  wager: number;
  element?: Element;
  elemental?: ElementalRarity;
}

Отображение элементаля

interface ElementalDisplayData {
  currentName: string;
  currentEmoji: string;
  currentProtection: number;
  canLevelUp: boolean;
  levelUpCost: number;
  maxLevel: number;
  canUpgradeRarity: boolean;
  isImmortal: boolean;
}

Достижения

interface Achievement {
  id: string;
  icon: string;
  name: string;
  desc: string;
  condition: (player: PlayerStats) => boolean;
}

Лог боя

interface BattleLog {
  playerElement: Element;
  opponentElement: Element;
  playerElemental: ElementalRarity | null;
  opponentElemental: ElementalRarity | null;
  baseWager: number;
  protectionSaved: number;
  finalChange: number;
  winner: BattleResult;
}

Состояние игры

interface GameState {
  player: PlayerStats;
  currentOpponent: Opponent | null;
  opponentElement: Element | null;
  gamePhase: GamePhase;
  battleLog: BattleLog | null;
  initialBattleMana?: number;
  battleResult?: BattleResult;
}

Перечисления

type GamePhase =
  | 'menu'
  | 'locationSelection'
  | 'elementSelection'
  | 'elementalSelection'
  | 'battleAnimation'
  | 'result'
  | 'collection';
type BattleResult = 'player' | 'opponent' | 'draw';

Важные детали реализации


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


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

const player: PlayerStats = {
  name: "Игрок1",
  mana: 100,
  wins: 5,
  losses: 2,
  selectedElement: "fire",
  selectedLocation: "castle",
  selectedElemental: "epic",
  winStreak: 3,
  bestStreak: 4,
  maxLossStreak: 2,
  currentLossStreak: 0,
  totalBattles: 7,
  experience: 1500,
  level: 10,
  favoriteElement: "fire",
  elementStats: { earth: 3, water: 2, fire: 5 },
  achievements: [],
  lastManaChange: Date.now(),
  totalManaWon: 300,
  totalManaLost: 100,
  elementalCollection: {
    elementals: {},
    totalOwned: 0,
    totalImmortal: 0,
    totalEpic: 0,
    collectionProgress: { earth: 0, water: 0, fire: 0 }
  },
  totalElementalsCollected: 0,
  immortalElementalsOwned: 0,
  epicElementalsOwned: 0
};

Диаграмма структуры файла

classDiagram
    class ElementData {
        +name: string
        +emoji: string
        +color?: string
    }
    class LocationData {
        +name: string
        +emoji: string
        +mana: number
    }
    class ElementalData {
        +name: string
        +emoji: string
        +rarity: string
        +protection: number
        +evolutionCost?: number
        +legendary?: boolean
    }
    class CollectedElemental {
        +id: string
        +element: Element
        +rarity: ElementalRarity
        +level: number
        +experience: number
        +isOwned: boolean
        +lastUsed?: number
        +timesUsed: number
        +cooldownEndTime?: number
    }
    class ElementalCollection {
        +elementals: Record<string, CollectedElemental>
        +totalOwned: number
        +totalImmortal: number
        +totalEpic: number
        +collectionProgress: Record<Element, number>
    }
    class EvolutionData {
        +stage: number
        +name: string
        +emoji: string
        +protection: number
        +cost: number
        +requiredLevel: number
    }
    class PlayerStats {
        +name: string
        +avatar?: string
        +mana: number
        +wins: number
        +losses: number
        +selectedElement: Element | null
        +selectedLocation: Location | null
        +selectedElemental: ElementalRarity | null
        +winStreak: number
        +bestStreak: number
        +maxLossStreak: number
        +currentLossStreak: number
        +totalBattles: number
        +experience: number
        +level: number
        +favoriteElement: string | null
        +elementStats: Record<Element, number>
        +achievements: string[]
        +lastManaChange: number
        +totalManaWon: number
        +totalManaLost: number
        +elementalCollection: ElementalCollection
        +totalElementalsCollected: number
        +immortalElementalsOwned: number
        +epicElementalsOwned: number
    }
    class Opponent {
        +name: string
        +avatar: string
        +level: number
        +rarity: string
        +wager: number
        +element?: Element
        +elemental?: ElementalRarity
    }
    class ElementalDisplayData {
        +currentName: string
        +currentEmoji: string
        +currentProtection: number
        +canLevelUp: boolean
        +levelUpCost: number
        +maxLevel: number
        +canUpgradeRarity: boolean
        +isImmortal: boolean
    }
    class Achievement {
        +id: string
        +icon: string
        +name: string
        +desc: string
        +condition(player: PlayerStats): boolean
    }
    class BattleLog {
        +playerElement: Element
        +opponentElement: Element
        +playerElemental: ElementalRarity | null
        +opponentElemental: ElementalRarity | null
        +baseWager: number
        +protectionSaved: number
        +finalChange: number
        +winner: BattleResult
    }
    class GameState {
        +player: PlayerStats
        +currentOpponent: Opponent | null
        +opponentElement: Element | null
        +gamePhase: GamePhase
        +battleLog: BattleLog | null
        +initialBattleMana?: number
        +battleResult?: BattleResult
    }

    PlayerStats --> ElementalCollection
    GameState --> PlayerStats
    GameState --> Opponent
    GameState --> BattleLog
    Achievement ..> PlayerStats : condition

Заключение

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