Skip to main content

Tier System

1. Summary

Goal: Единая система визуального различения предметов по редкости. Один источник истины для цветов, градиентов и glow эффектов.

User Value: Мгновенное понимание ценности предмета по цвету. Редкие предметы выделяются — создаёт желание их получить.


2. Business Logic

Tier Levels

TierНазваниеHEXTailwind
TIER_0Обычный#9CA3AFgray-400
TIER_1Необычный#22C55Egreen-500
TIER_2Редкий#3B82F6blue-500
TIER_3Эпический#A855F7purple-500
TIER_4Мифический#EF4444red-500
TIER_5Легендарный#EAB308yellow-500
Визуальные стили

Все tier получают визуальное оформление: цветная рамка + градиент снизу. Цвет определяется по таблице выше.

Resolution Logic

Источник tier: Собственный item.tier из БД

Пример: Dragon Rocket Launcher → TIER_4 (Мифический, красный)

Dark Colors (для рулетки)

Затемнённые версии для тёмных фонов (секторы колеса):

TierHEXTailwind
TIER_0#3d4654
TIER_1#166534green-800
TIER_2#1e40afblue-800
TIER_3#581c87purple-800
TIER_4#991b1bred-800
TIER_5#854d0eyellow-800

3. ADR (Architectural Decisions)

Почему SCRAP/XP не имеют собственного tier?

Проблема: Предлагалось создать TIER_SCRAP, TIER_XP, TIER_SP для унификации.

Решение: Отклонено. Валюты получают tier = nullTIER_0.

Альтернативы (отклонены):

  • TIER_SCRAP/TIER_XP — смешивает концепции (редкость ≠ валюта)
  • Отдельные HEX для каждой валюты в tier системе — усложняет shouldGlow(), getTierColor()
Разные системы для разных целей

Tier = редкость ПРЕДМЕТА (рамки, glow) Currency Display = узнаваемость валют в тексте (green/yellow/orange)

Не смешивать!

Последствия: Чистая архитектура, но нужно понимать разницу между системами.

Почему единый источник истины?

Проблема: Было 3 файла с константами tier (shared, frontend, admin). HEX цвета расходились.

Решение: Всё в shared/item-display-system/core/tier.system.ts, остальные реэкспортируют.

Что было удалено
ФайлУдалённый код
shared/tier.system.tsCURRENCY_COLORS, getCurrencyColor()
frontend/tiers.tsRESOURCE_TEXT_COLORS, getResourceColor(), getTierFromMultiplier()

Последствия: Любое изменение цвета — в одном месте. Гарантированная консистентность.


4. Architecture

Resolution Flow

Key Components

КомпонентПутьОписание
tier.system.tsshared/src/item-display-system/core/tier.system.tsЕдиный источник констант и функций
item.resolver.tsshared/src/item-display-system/core/item.resolver.tsresolveItemProps() для UI
tiers.tsfrontend/src/constants/tiers.tsFrontend-специфичные стили (реэкспорт + Tailwind)
Currencyfrontend/src/components/ui/Currency/Display цвета для валют

5. API

Core Functions

// Получить tier с учётом наследования
resolveTier(item: UnifiedItem): ItemTier | null

// HEX цвет (null → TIER_0)
getTierColor(tier: ItemTier | null): string

// Затемнённый цвет для рулетки
getDarkTierColor(tier: ItemTier | null): string

// Tailwind класс градиента
getTierGradient(tier: ItemTier | null): string

// Название на русском
getTierName(tier: ItemTier | null): string

// Нужен ли glow (TIER_2+)
shouldGlow(item: UnifiedItem): boolean

Usage

import {
resolveTier,
getTierColor,
getDarkTierColor,
shouldGlow,
} from '@goloot/shared/item-display-system';

// Для карточки предмета
const tier = resolveTier(item);
const color = getTierColor(tier);
const hasGlow = shouldGlow(item);

// Для рулетки (тёмный фон)
const sectorColor = getDarkTierColor(tier);

6. Contexts

Где что используется

КонтекстСистемаРезультат для SCRAP/XP
🎰 Рулетка (сектор)TierСерый #3d4654
📦 Кейс (рамка/glow)TierСерый, без glow
📋 ИсторияTierСерый текст
📰 LiveFeedCurrency DisplayЗелёный/Жёлтый текст
🎁 TopFloatingCurrency DisplayЗелёный/Жёлтый текст
STREAK_POINTS

Отдельная валюта лояльности. Цвет: orange-400. Не часть tier системы.


  • Buffs — баффы используют tier из БД
  • Cases — награды кейсов с tier
  • Daily Spins — секторы рулетки с tier цветами
  • Inventory — отображение предметов с tier стилями