# AutoHero — Полная спецификация игры

---

## 1. 🎮 Обзор игры

### 1.1 Концепция

AutoHero — это idle/incremental RPG с изометрическим видом и таймер-базированной боевой системой.

### 1.2 Первый вход: имя героя

При **первом** входе в игру (создание профиля героя) игрок обязан **ввести имя героя** — это отдельный шаг до полноценного геймплея на карте.

**Назначение имени:**

- Отображается **над моделью героя** (nameplate / табличка), читаемая на мобильном экране.
- Используется в **социальных взаимодействиях**: встречи с другими игроками (§2.3), приглашения на дуэль, отображение в UI рядом с портретом/иконкой, будущие списки друзей/гильдий — везде, где нужен человекочитаемый идентификатор вместо Telegram ID.

**Правила имени:**

- **Уникальность глобальная:** в рамках игры не может существовать двух героев с одинаковым именем (регистронезависимое сравнение: `Ser` и `ser` — конфликт; точная политика нормализации — на стороне сервера).
- Если выбранное имя **уже занято**, клиент получает **ошибку** (например, код `HERO_NAME_TAKEN` / сообщение для пользователя «Имя занято») и **не создаёт** героя до смены имени.
- Длина и допустимые символы (ориентир): **2–16** символов; буквы (латиница и/или кириллица по политике продукта), цифры; без пробелов в начале/конце; запрещены оскорбительные шаблоны (модерация — отдельная политика, в MVP достаточно длины + уникальности).
- После успешной регистрации имя **меняется только** через отдельную платную/редкую механику или саппорт — не часть базового MVP, если не указано иначе.

**UX:**

- Один экран: поле ввода, кнопка «Продолжить», подсказка про уникальность.
- При ошибке занятости — поле подсвечивается, текст ошибки краткий.

---

## 2. 🌍 Мир игры

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

Игрок автоматически движется, встречает врагов, собирает лут и развивает персонажа.

### 2.2 Поведение перемещения героя

Герой не должен бесконечно идти по одной диагонали. В MVP используется **wander-поведение** с мягкими сменами направления и короткими паузами:

- Длина одного отрезка движения: `2.5-5.5 сек`
- В начале нового отрезка герой меняет курс относительно текущего направления на `-35° ... +35°`
- Во время движения каждые `0.7-1.2 сек` добавляется мягкая корректировка курса на `-10° ... +10°`
- Скорость поворота ограничена `90°/сек`, чтобы движение выглядело как плавная дуга, а не как резкий рывок
- Множитель скорости ходьбы на отрезок: `0.90x-1.10x` от базовой
- После каждого отрезка есть `18%` шанс остановиться и "отдохнуть" на `1-3 сек`
- Если герой двигался без паузы более `25 сек`, следующая пауза становится обязательной
- Во время паузы герой не запрашивает новые энкаунтеры, но сохраняет текущее состояние/ориентацию

**Коллизии и непроходимость:** герой **не может** перемещаться **сквозь** препятствия. К непроходимым относятся как минимум:

- **деревья** и **кусты** (объекты природы на тайле);
- **камни** (включая крупные валуны);
- **постройки** (стены, дома, руины и прочие здания — см. §2.6);
- при необходимости — **вода** / обрывы по дизайну карты (если на карте есть непроходимые биомы).

Поведение: траектория wander и любое автоматическое движение **обходит** препятствия (коррекция курса, локальный обход, упрощённый pathfinding — деталь реализации). Визуально герой не «режет» силуэты объектов и не проходит по их клеткам/полигонам коллизии.

### 2.3 Карта и встречи с другими игроками (shared world)

На общей карте герои разных игроков могут оказываться рядом (один шард/чанк/инстанс — деталь реализации). Это **не обязательно** приводит к бою.

**Принципы:**

- **По умолчанию — мирный контакт:** чаще всего герои **просто проходят мимо**, обмениваются коротким **эмоутом/репликой** (иконка + 1 строка текста по желанию) и продолжают wander.
- **Дуэль — опционально и по шансу:** при сближении двух чужих героев система может предложить **всплывающий выбор** «Дуэль?» с таймаутом. Игрок может **отказаться без штрафа**; при отказе или таймауте оба продолжают путь как в пункте выше.
- **Вероятности (ориентиры для баланса, не жёсткий MVP):**
  - `p_social_only` — «поздороваться и разойтись» (talk / walk): **~55–75%** от срабатываний «встречи».
  - `p_duel_prompt` — показать предложение дуэли: **~10–25%** (остальное до 100% — тихий проход без UI, если не хотим спамить).
  - Из тех, кому показали дуэль, оба должны согласиться; иначе — отмена без последствий.
- **Дуэль не обязательна для прогрессии:** награды за дуэль — отдельный небольшой пул (честь/косметика/чуть золота), без блокировки основного PvE-loop.

**Ограничения UX (mobile-first):**

- Один экран, минимум текста: иконки «меч», «ладонь (отказ)», таймер **3–5 сек**.
- Нет обязательного чата; опционально пресеты фраз.

### 2.4 Несраженческие события (дружелюбные NPC)

Помимо врагов на карте могут встречаться **нейтральные NPC** (не враждебные).

**Пример мини-квеста «alms» (подай монет):**

- NPC появляется как отдельная сущность карты (см. каталог `npc.*`).
- Условие: отдать **N** золота (`N` масштабируется от уровня/биома или фиксировано для MVP).
- Награда: **случайный предмет экипировки** в одном из **гармент-слотов** (см. §6.3), редкость по общим правилам лута или смещённая таблица «quest reward».
- Ограничения: кулдаун между такими событиями на героя / глобальный лимит в день — чтобы не было эксплойта.

Другие варианты non-combat (на будущее): короткий диалог-ветка, обмен ресурса, временный бафф от «благословения» NPC — в MVP достаточно одного шаблона выше.

### 2.5 Города и населённые пункты на карте

Мир содержит **несколько городов** разного **размера** и **планировки**. Они зафиксированы в данных карты (координаты, границы, входы). Город — это зона с **плотной застройкой**, **без спавна враждебных энкаунтеров** внутри (или с сильно сниженным шансом — по балансу), плюс визуальные маркеры на миникарте/краю экрана по желанию.

**Распределение по карте (логические регионы):**

| Ключ (для контента) | Название | Размер | Конфигурация / силуэт | Регион на карте |
|---------------------|----------|--------|------------------------|-----------------|
| `city.silver_rampart` | **Серебряный Вал** | Крупный (XL) | Кольцо стен + внутренний рынок и кварталы; 4 ворот | Центр — столица региона |
| `city.ashen_march` | **Пепельный Марш** | Средний (M) | Две параллельные улицы вдоль дороги; узкий «город-лента» | Восток — тракт у скал |
| `city.oak_haven` | **Ясеневая Гавань** | Средний (M) | Радиальная площадь + 3 «луча» улиц к причалам/полям | Север — лесная окраина |
| `city.stone_morrow` | **Каменное Утро** | Средний (M) | Сетка кварталов 3×4 с узкими переулками | Юго-запад — подножие холмов |
| `city.three_lanterns` | **Три Фонаря** | Малый (S) | Один двор + кольцо домов вокруг колодца | Запад — перекрёсток троп |
| `city.dry_ford` | **Сухой Брод** | Малый (S) | Дома вдоль брода; вытянутый вдоль реки | Юг — речная низина |
| `city.greymoor` | **Серомур** | Малый (S) | Полукруг домов у старой башни | Северо-восток — туманные низины |
| `city.watch_rest` | **Сторожевой Привал** | Крошечный (XS), форпост | Укреплённый донжон + 2–3 дома + палисад | Восточная граница карты — КПП |

Города **не должны** перекрывать друг друга; между ними — дикие зоны (лес, дорога, поля). Размер влияет на число NPC, точек квестов и длину «городского» пути при проходе wander.

### 2.6 Постройки и объекты окружения

На карте (в городах и вне них) встречаются **различные постройки** и декоративно-геймплейные объекты:

- **Жилые:** дом, хижина, длинный дом общины.
- **Хозяйственные:** мельница, амбар, кузница, стойка торговца.
- **Оборонительные:** стена, башня, ворота, баррикада, руины укрепления.
- **Религиозные / культурные:** часовня, святилище, памятник.
- **Инфраструктура:** мост, причал, колодец, дорожный указатель.
- **Временные / сюжетные:** лагерь, повозка, костёр (как точка интереса, не обязательно интерактив в MVP).

У всех построек с **объёмом** на карте задаётся **коллизия** (см. непроходимость в §2.2): герой обходит контур. Мелкие декоративные объекты без коллизии — только по явному флагу в данных карты.

### 2.7 Типы квестов

Квесты группируются по **источнику** и **цели**. Ниже — каноническая типология для дизайна контента и API.

**По источнику:**

| Тип | Описание | Примеры |
|-----|----------|---------|
| **Сюжетный** | Привязан к фазе мира / одной цепочке; прогресс хранится сервером | Введение, открытие города |
| **Побочный** | Опционален, не блокирует основной прогресс | «Принеси 10 когтей» |
| **Ежедневный / еженедельный** | Обновляется по таймеру, награды в таблице ретенции (см. §10) | Убить N врагов |
| **Микро-квест NPC** | Короткое взаимодействие на карте (§2.4) | Alms: монеты → предмет |
| **Исследование** | Награда за посещение точки / города / первое открытие зоны | Первый визит в «Серебряный Вал» |
| **Социальный** | Связан с другими игроками | Условный «свидетель дуэли», обмен эмоутом (расширение) |

**По цели (механика):**

| Тип цели | Условие выполнения |
|----------|-------------------|
| **Убить** | Победить N врагов заданного типа / класса |
| **Собрать** | Накопить золото / дроп / валюту квеста |
| **Доставить** | Принести предмет или золото NPC |
| **Посетить** | Дойти до маркера / города / здания |
| **Выжить / удержать** | Пробежать маршрут без смерти / удержать HP выше порога до конца таймера |
| **Поговорить / взаимодействовать** | Завершить диалог или взаимодействие с объектом/NPC |

**Правила наград:**

- Квест не должен нарушать глобальное правило: **золото с убийств врагов** остаётся по §8; награда квеста — **дополнительный** слой (XP, предмет, косметика).
- Повторяемые квесты (ежедневные) имеют **сброс** и **лимит** попыток в день.

---

## 3. ⚔️ Combat Balance

### 3.1 Модель боя

Система основана на временных интервалах (next_attack_at).

### 3.2 Баланс коэффициентов

- agility_coef = 0.03
- MIN_ATTACK_INTERVAL = 250 ms
- целевой максимум: 4 атаки/сек

### 3.3 Уточнения боевой модели

- Бой остаётся **timer-based** через `next_attack_at`, а не через кадры или частоту рендера.
- HP героя **сохраняется между боями** и не восстанавливается автоматически после каждой победы.
- Допустимые источники восстановления HP:
  - бафф **Исцеление**
  - бафф **Воскрешение**
  - механика revive
  - явно описанная регенерация/лечение по механике врага, баффа или режима
- **Level Up не восстанавливает HP полностью автоматически**, если это не описано отдельной механикой.
- Смерть должна ощущаться как пауза/потеря темпа, но не как бесплатный сброс всех последствий боя.

### 3.4 Рост героя по уровням

После плейтестов выяснилось, что даже замедленная MVP-кривая (v2) всё ещё слишком быстро усиливает героя. **Версия v3** снова ужимает прогрессию примерно в **10 раз** относительно v2: пороги XP к следующему уровню умножены на `10`, награды за убийство — поделены на `10` (с минимумом `1`), а шаги роста статов при `LevelUp` сделаны в **10 раз реже** (кратности `30 / 40 / 50 / 60 / 100` вместо `3 / 4 / 5 / 6 / 10`, MaxHP — каждые `10` уровней вместо каждого уровня).

| Параметр | v2 | v3 |
|------|------|------|
| MaxHP | `+1 + floor(Constitution / 6)` каждый уровень | то же правило, но только на уровнях, кратных `10` |
| Attack / Defense | `+1` на уровнях, кратных `3` | `+1` каждый на уровнях, кратных `30` |
| Base Speed за уровень | `+0.0` | `+0.0` |

Новые derived-формулы героя:

- `EffectiveAttack = Attack + Strength * 2 + floor(Agility / 4)`
- `EffectiveDefense = Defense + Constitution + floor(Agility / 4)`
- `EffectiveSpeed = Speed + Agility * 0.03`

Правила роста вторичных статов при `LevelUp` (v3):

- `Strength +1` только на уровнях, кратных `40`
- `Constitution +1` только на уровнях, кратных `50`
- `Agility +1` только на уровнях, кратных `60`
- `Luck +1` только на уровнях, кратных `100`
- `HP` при повышении уровня **не восстанавливается автоматически**; увеличивается только `MaxHP`
- Стартовые статы героя **не меняются**: `HP=100`, `MaxHP=100`, `Attack=10`, `Defense=5`, `Speed=1.0`, `Strength=1`, `Constitution=1`, `Agility=1`, `Luck=1`

Причина: рост силы теперь идёт не через частые level-up бонусы, а через более редкие вторичные статы, экипировку и длинную кривую прогрессии. Это убирает резкий разгон героя без искусственного ослабления стартового опыта.

Контрольная таблица роста героя **без экипировки и без временных баффов** (v3, канон — `hero.go` и тест `TestProgressionV3CanonicalSnapshots`):

| Уровень | MaxHP | Attack | Defense | Strength | Constitution | Agility | Luck | AttackPower | DefensePower | AttackSpeed |
|------|------|------|------|------|------|------|------|------|------|------|
| 1 | `100` | `10` | `5` | `1` | `1` | `1` | `1` | `12` | `6` | `1.03` |
| 5 | `100` | `10` | `5` | `1` | `1` | `1` | `1` | `12` | `6` | `1.03` |
| 10 | `101` | `10` | `5` | `1` | `1` | `1` | `1` | `12` | `6` | `1.03` |
| 20 | `102` | `10` | `5` | `1` | `1` | `1` | `1` | `12` | `6` | `1.03` |
| 30 | `103` | `11` | `6` | `1` | `1` | `1` | `1` | `13` | `7` | `1.03` |
| 45 | `104` | `11` | `6` | `2` | `1` | `1` | `1` | `15` | `7` | `1.03` |

### 3.5 Целевые боевые показатели героя

Ориентиры для инженеров и QA при проверке новой кривой силы героя **без временных баффов**:

| Уровень | MaxHP | AttackPower | DefensePower | AttackSpeed |
|------|------|------|------|------|
| 10 | `100-105` | `12-16` | `6-9` | `1.03-1.10 APS` |
| 25 | `101-108` | `12-18` | `6-12` | `1.03-1.15 APS` |
| 45 | `103-120` | `14-28` | `7-18` | `1.03-1.30 APS` |

Герой `L45` без временных баффов и без сильной экипировки остаётся относительно плоским по числам; основной рост mid/late-game должен ощущаться через экипировку, баффы и редкие уровни.

---

## 4. 🧟 Враги (Enemy Design)

### 4.1 Базовые враги (7 типов)

#### 🐺 Лесной волк (Уровни 1-5)
- Быстрый, низкий HP, часто атакует
- Крит шанс: 5%

#### 🐗 Дикий кабан (Уровни 2-6)
- Средний HP, высокий урон, редкие атаки
- Крит шанс: 8%

#### 🧟 Гниющий зомби (Уровни 3-8)
- Медленный, много HP, слабый урон
- Способность: 10% шанс apply Poison

#### 🕷 Пещерный паук (Уровни 4-9)
- Очень быстрый, может критовать
- Крит шанс: 15%

#### 👹 Орк-воин (Уровни 5-12)
- Сбалансированный враг мид-гейма
- Способность: раз в 3 атаки = 1.5x урона

#### 💀 Скелетный лучник (Уровни 6-14)
- Средние статы
- Способность: 20% dodge входящего урона

#### 🐢 Боевая ящерица (Уровни 7-15)
- Много HP, высокая защита
- Способность: восстанавливает 2% от полученного урона

### 4.2 Элитные враги (6 типов)

#### 🔥 Огненный демон (Уровни 10-20)
- Высокий урон
- Способность: 30% шанс apply Burn

#### ❄️ Ледяной страж (Уровни 12-22)
- Высокая защита
- Способность: -20% скорость атаки игрока

#### 💀 Король Скелетов (Уровни 15-25)
- Восстанавливает 10% HP
- Создаёт скелетных слуг раз в 15 сек

#### 🌊 Водяной элемент (Уровни 18-28)
- Много HP
- Способность: apply Slow (-40% Movement)

#### 🌳 Лесной страж (Уровни 20-30)
- ОЧЕНЬ МНОГО HP, ОЧЕНЬ ВЫСОКАЯ защита
- Регенерирует 5% HP/сек

#### ⚡ Молниевой титан (Уровни 25-35)
- ОЧЕНЬ ВЫСОКИЙ урон, ОЧЕНЬ быстрый
- Способность: 25% шанс Stun
- Цепная молния: после 5 атак = 3x урон

### 4.3 Масштабирование врагов

Старый множитель `1 + (heroLevel - 1) * 0.08` растит врагов слишком резко на длинной дистанции и конфликтует с ростом героя. В новой версии враги масштабируются **от своей level band**, а не от глобального уровня героя:

- `bandLevel = clamp(heroLevel, enemy.minLevel, enemy.maxLevel)`
- `bandDelta = bandLevel - enemy.minLevel`
- `overcapDelta = max(0, heroLevel - enemy.maxLevel)`
- `hpMultiplier = 1 + bandDelta * 0.05 + overcapDelta * 0.025`
- `attackMultiplier = 1 + bandDelta * 0.035 + overcapDelta * 0.018`
- `defenseMultiplier = 1 + bandDelta * 0.035 + overcapDelta * 0.018`
- `speedMultiplier = 1.0` (скорость атаки задаётся архетипом, а не разгоняется по уровню)

Это даёт:

- Более мягкий рост внутри зоны врага
- Сильную разницу между архетипами за счёт базовых шаблонов
- Контролируемый бесконечный рост после выхода героя за верхний `levelBand`

Примеры:

| Враг | Уровень героя | HP Mult | ATK/DEF Mult |
|------|------|------|------|
| Forest Wolf | `1` | `1.00` | `1.00` |
| Forest Wolf | `5` | `1.20` | `1.14` |
| Lightning Titan | `35` | `1.50` | `1.35` |
| Lightning Titan | `45` | `1.75` | `1.53` |

### 4.4 Базовые награды врагов

**v3:** к шаблонам v2 применено ещё одно десятикратное сжатие базовых наград (целочисленно, с минимумом `1` для золота и XP). Реализация — `EnemyTemplates` в `enemy.go`.

| Enemy ID | Базовый XP | Базовое золото |
|------|------|------|
| `enemy.wolf_forest` | `1` | `1` |
| `enemy.boar_wild` | `1` | `1` |
| `enemy.zombie_rotting` | `1` | `1` |
| `enemy.spider_cave` | `1` | `1` |
| `enemy.orc_warrior` | `1` | `1` |
| `enemy.skeleton_archer` | `1` | `1` |
| `enemy.lizard_battle` | `1` | `1` |
| `enemy.demon_fire` | `1` | `1` |
| `enemy.guard_ice` | `1` | `1` |
| `enemy.skeleton_king` | `1` | `1` |
| `enemy.element_water` | `2` | `1` |
| `enemy.guard_forest` | `2` | `1` |
| `enemy.titan_lightning` | `3` | `2` |

Формулы наград при спавне:

- `xpReward = round(baseXP * (1 + bandDelta * 0.05 + overcapDelta * 0.03))`
- `goldReward = round(baseGold * (1 + bandDelta * 0.05 + overcapDelta * 0.025))`

Золото масштабируется мягче, чем XP, потому что при замедлении левелинга игрок должен продолжать ощущать прогресс через экипировку и экономику.

---

## 5. 🗡 Оружие

### 5.1 Типы оружия

#### Кинжалы
- Скорость: 1.3x базовая
- Урон: 0.7x базовый

#### Мечи
- Скорость: 1.0x (базовая)
- Урон: 1.0x (базовый)

#### Топоры
- Скорость: 0.7x
- Урон: 1.5x (ВЫСОКИЙ)

#### Луки (дальний бой, требуют слот `quiver`, см. §5.3)
- Скорость: 0.85x базовой частоты атак (чуть быстрее топора, медленнее меча)
- Урон: 1.0x базового **до** бонуса боеприпасов; итоговый урон складывается из оружия и аммуниции

#### Арбалеты (дальний бой, требуют слот `quiver`)
- Скорость: 0.55x
- Урон: 1.35x (сильнее лука за счёт темпа)

### 5.2 Примеры оружия (15 штук)

#### Кинжалы:
- Rusty Dagger (Common)
- Iron Dagger (Uncommon)
- Assassin's Blade (Rare)
- Phantom Edge (Epic)
- Fang of the Void (Legendary)

#### Мечи:
- Iron Sword (Common)
- Steel Sword (Uncommon)
- Longsword (Rare)
- Excalibur (Epic)
- Soul Reaver (Legendary)

#### Топоры:
- Rusty Axe (Common)
- Battle Axe (Uncommon)
- War Axe (Rare)
- Infernal Axe (Epic)
- Godslayer's Edge (Legendary)

### 5.3 Боеприпасы (аммуниция) и слот колчана

**Слот:** `quiver` (см. §6.3 и каталог `gear.slot.quiver`, `gear.ammo.*`).  
**Условие:** бонусы из колчана применяются **только** если в `main_hand` экипирован лук или арбалет (`gear.form.main_hand.bow` / `gear.form.main_hand.crossbow`). Иначе слот игнорируется в расчёте боя (предмет может храниться, но не даёт статов).

**Роль в бою:** каждый тип боеприпасов задаёт **базовые коэффициенты** в каталоге; у конкретного экземпляра числа получаются по **§6.4** (уровень предмета `ilvl` и редкость).  
**Вклад в героя:** рассчитанный `bonusAttack` аммуниции суммируется с **Attack** (как плоский бонус к цепочке `EffectiveAttack` после базы героя и остальной экипировки — порядок суммирования на стороне сервера фиксируется в коде, но обязан быть детерминированным).

**Вторичные поля** (крит, пробитие, штраф к скорости): для боеприпасов используется **упрощённое** масштабирование только по редкости — **§6.4.4**; иначе высокий `ilvl` раздувал бы утилити без контроля.

**Баланс:** сильные семейства боеприпасов имеют больший `basePrimary`, но могут иметь штрафы (`deltaSpeed`, низкий потолок крита и т.д.) — см. каталог.

---

## 6. 🛡 Броня

### 6.1 Типы брони

- Лёгкая: 0.8x Defense, +Agility/Speed
- Средняя: 1.0x Defense, +Constitution/Luck
- Тяжёлая: 1.5x Defense, +Constitution/Strength, -30% Speed

### 6.2 Комплекты брони (4 комплекта)

- Assassin's Set
- Knight's Set
- Berserker's Set
- Ancient Guardian's Set

### 6.3 Расширенные категории гардероба и экипировки (слоты)

Помимо базовой пары «оружие + броня» (см. §5 и §6.1), целевая модель включает **дополнительные слоты предметов** — для разнообразия билдов и наград (в т.ч. с NPC-квестов и дуэлей).

**Канонические слоты (ключи для каталога `gear.slot.*`):**

| Слот (ключ) | Описание |
|-------------|----------|
| `main_hand` | Основное оружие (как сейчас) |
| `off_hand` | Вторая рука: щит **или** лёгкое off-hand (деталь баланса отдельно) |
| `head` | Шлем / шапка / капюшон |
| `chest` | Нагрудник (тяжёлая «броня» из §6.1 маппится сюда) |
| `legs` | Поножи / штаны |
| `feet` | Сапоги / ботинки |
| `cloak` | Плащ / накидка (часто даёт малый утилити-стат или чисто визуал в косметике) |
| `neck` | Амулет |
| `finger` | Кольцо (возможны **2** слота `finger_1`, `finger_2` в реализации; в каталоге — одно семейство `gear.slot.finger`) |
| `wrist` | Браслеты (опционально) |
| `quiver` | Боеприпасы (стрелы / болты); дают бонус к дальнему бою при луке или арбалете (§5.3) |

**Правила:**

- Каждый предмет принадлежит **ровно одному** слоту; нет «универсальных» без явного правила в каталоге.
- Щит в `off_hand` даёт защиту и может иметь штраф к скорости атаки по архетипу (как в классических RPG); детальные множители — в балансе предметов, не в этом разделе.
- Реализация может вводить слоты поэтапно: сначала `head` / `feet` / `neck`, затем остальные — но **ID слотов в каталоге** фиксируются заранее.

### 6.4 Уровень предмета (`ilvl`) и масштабирование от уровня и редкости

Каждый выпавший предмет (включая боеприпасы) имеет:

- **`ilvl`** — целое **≥ 1** (уровень предмета; не путать с уровнем героя).
- **`rarity`** — одна из глобальных редкостей (`Common` … `Legendary`, как в §8.1–8.2).
- **`familyId`** — ссылка на строку каталога (`gear.ammo.*`, форма `gear.form.*`, в будущем — семейства оружия/брони), откуда берутся **базовые** числа.

#### 6.4.1 Фактор уровня предмета

Коэффициент (плавный рост от `ilvl`, без ступеней):

- `α = 0.03`
- `L(ilvl) = 1 + α × max(0, ilvl − 1)`

Примеры: `L(1) = 1.00`; `L(10) = 1.27`; `L(25) = 1.72`; `L(50) = 2.47`.

#### 6.4.2 Множитель редкости

Одинаков для всех типов предметов, для воспроизводимости:

| Редкость | `M(rarity)` |
|----------|----------------|
| Common | `1.00` |
| Uncommon | `1.12` |
| Rare | `1.30` |
| Epic | `1.52` |
| Legendary | `1.78` |

#### 6.4.3 Первичные статы предмета (урон / защита от предмета)

Для величин, которые напрямую входят в `EffectiveAttack` / `EffectiveDefense` как **плоские бонусы** от экипировки (в т.ч. `bonusAttack` боеприпасов, бонус Defense с нагрудника и т.д.):

```
primaryOut = round( basePrimary × L(ilvl) × M(rarity) )
```

`basePrimary` — целое из каталога для семейства предмета на «эталоне» `ilvl = 1`, `Common`.

**Свойство баланса:** при тех же `basePrimary` возможны ситуации, когда **редкий предмет с меньшим `ilvl` даёт больше или столько же**, чем **обычный с большим `ilvl`**, потому что `M(rarity)` растёт быстрее, чем `L(ilvl)` в типичных диапазонах дропа. Примеры (без привязки к слоту, `basePrimary = 10`):

| Конфигурация | Вычисление | `primaryOut` |
|--------------|------------|----------------|
| Common, ilvl 25 | `round(10 × 1.72 × 1.00)` | `17` |
| Rare, ilvl 13 | `round(10 × 1.36 × 1.30)` | `18` |
| Epic, ilvl 7 | `round(10 × 1.18 × 1.52)` | `18` |

То есть **Rare ниже по ilvl** и **Epic ещё ниже по ilvl** могут превосходить **Common высокого ilvl** — это намеренно.

#### 6.4.4 Вторичные статы (крит, пробитие, малые штрафы скорости у аммуниции)

Чтобы утилити не разгонялась бесконечно с `ilvl`, для **вторичных** величин в MVP используется:

```
secondaryOut = round( baseSecondary × M(rarity) )
```

`baseSecondary` — из каталога (например крит в базисных пунктах: `100 = 1.00%`). Рост только от редкости; при необходимости позже вводится мягкий множитель от `ilvl` отдельным баланс-пасом.

#### 6.4.5 Связь `ilvl` с уровнем источника дропа

Базовое правило для дропа с убитого врага уровня `monsterLevel` (уровень экземпляра в бою):

1. Сэмплируется смещение `δ` ∈ `{ −1, 0, +1 }` с **равными** вероятностями `1/3` каждое.
2. `ilvl = clamp( monsterLevel + δ, 1, ilvlMax )`, где **`ilvlMax = 100`** (резерв под эндгейм).

**Elite-враги** (класс elite в каталоге): вместо шага 1 используется `δ` ∈ `{ 0, +1, +2 }` с весами **`0.4 / 0.4 / 0.2`** — смещение в сторону более высокого уровня предмета.

**Правило согласованности:** типичный дроп с врага уровня `N` имеет `ilvl` около `N`, реже на `1` ниже или выше; сильные враги не обязаны давать предмет выше своего уровня без elite-бонуса, чтобы не ломать ранний прогресс.

#### 6.4.6 Ничьи при сравнении экипировки

Если после §6.4 два предмета в одном слоте дают одинаковый вклад в `combatRating` (§8.5), **предпочтение отдаётся более высокой редкости**; если и редкость совпала — большему `ilvl`.

---

## 7. ✨ Баффы и Дебаффы

### 7.1 Баффы (8 штук)

| Бафф | Эффект |
|------|--------|
| Рывок | +50% движение |
| Ярость | +100% урон |
| Щит | -50% входящий урон |
| Удача | x2.5 лут |
| Воскрешение | Воскрес 50% HP |
| Исцеление | +50% HP |
| Зелье силы | +150% урон |
| Боевой клич | +100% Attack speed |

### 7.2 Дебаффы (6 штук)

| Дебафф | Эффект |
|--------|--------|
| Отравление | -2% HP/сек |
| Заморозка | -50% Attack speed |
| Горение | -3% HP/сек |
| Оглушение | Нет атак (2 сек) |
| Замедление | -40% Movement |
| Ослабление | -30% входящий урон |

---

## 8. 💰 Система лута и золота

### 8.1 Дроп система

- Шанс, что враг вообще дропнет предмет экипировки: `22%`
- Если предмет выпал, его редкость распределяется так:
  - Common: `75%`
  - Uncommon: `20%`
  - Rare: `4%`
  - Epic: `0.9%`
  - Legendary: `0.1%`
- Каждый побеждённый враг **всегда** даёт золото.
- Золото — это **гарантированная базовая награда** за убийство, чтобы каждая победа ощущалась как прогресс.
- Предметы экипировки — это **дополнительный необязательный дроп**, а не замена золоту.
- Отсутствие предмета после убийства — это нормальное поведение; отсутствие золота — нет.

### 8.2 Таблица редкости предмета

| Редкость | Шанс внутри выпавшего предмета | Золото |
|----------|---|---|
| Common | 75% | 5-15 |
| Uncommon | 20% | 20-50 |
| Rare | 4% | 50-150 |
| Epic | 0.9% | 200-500 |
| Legendary | 0.1% | 1000-5000 |

### 8.3 Правила наград

- Награда за бой состоит из:
  - гарантированного золота
  - возможного предмета (оружие, броня нагрудника или — после внедрения §6.3 — предмет в любом доступном слоте)
- Если предмет выпал, он должен использовать ту же систему редкости (`Common` ... `Legendary`).
- Бафф **Удача** усиливает лут, но не отменяет правило гарантированного золота.
- В MVP допустим простой формат награды, но логика должна быть прозрачной: `gold always, item sometimes`.
- Уровень выпавшего предмета (`ilvl`) и масштабирование статов — **§6.4**; связь `ilvl` с уровнем убитого врага — **§6.4.5**.

### 8.4 MVP Inventory / Equipment HUD

Для MVP нет полноценного инвентаря-рюкзака. Игрок хранит только то, что влияет на бой прямо сейчас:

- `equippedWeapon` (слот `main_hand`; при появлении off-hand — `off_hand`)
- `equippedArmor` (слот `chest`, пока не разделён UI)
- `equippedQuiver` или аналог (слот `quiver`) — когда включён дальний бой и колчан в дропе
- `gold`
- По мере внедрения §6.3 — дополнительные `equipped*` по слотам из каталога

Правила:

- На каждый слот из §6.3 — не более **одного** экипированного предмета (кольца: до **двух**, если включены оба слота пальцев).
- Предметы не складываются в bag/stash
- Все выпавшие предметы обрабатываются сразу после боя
- UI обязан постоянно показывать:
  - золото
  - текущее оружие: иконка, имя, редкость
  - текущую броню: иконка, имя, редкость
  - по мере расширения слотов — компактная полоса иконок по активным слотам или свёрнутая панель «gear»
  - краткий toast о последнем дропе/автоэкипировке/автопродаже

### 8.5 Правила автоэкипировки и автопродажи

Чтобы MVP оставался простым, предмет не требует ручного менеджмента:

- Если слот пустой, предмет сразу экипируется
- Если слот занят, игра считает `combatRating`
- `combatRating = EffectiveAttack * EffectiveSpeed + EffectiveDefense * 0.35`
- Для сравнения подставляется герой с новым предметом того же слота и герой с текущим предметом
- Если новый предмет даёт `>= 3%` улучшения `combatRating`, он автоматически экипируется
- Иначе предмет автоматически продаётся

Фиксированные цены автопродажи по редкости:

| Редкость | Auto-sell Gold |
|------|------|
| Common | `3` |
| Uncommon | `8` |
| Rare | `20` |
| Epic | `60` |
| Legendary | `180` |

Эта схема даёт игроку прозрачный MVP loop: золото приходит всегда, хороший предмет сразу усиливает героя, плохой предмет всё равно конвертируется в ощутимую награду.

### 8.6 Кратко: уровень предмета при дропе

Полные формулы — **§6.4** и **§6.4.5**. Для дизайна контента:

- Чем выше **уровень поверженного врага**, тем выше типичный **`ilvl`** выпавшего предмета (с джиттером ±1, у elite — сдвиг вверх).
- Редкость по-прежнему крутится по таблице §8.1 внутри события «предмет выпал»; затем к выбранному семейству применяется §6.4.
- Автоэкипировка (§8.5) сравнивает итогового героя с учётом **всех** активных слотов, включая `quiver`, если лук/арбалет экипирован.

---

## 9. 📈 Система прогрессии

### 9.1 Уровни персонажа

Используется **piecewise XP curve** по фазам игры. **v3** умножает базовые коэффициенты v2 на `10` (темп до следующего уровня в тех же условиях боя — примерно в `10` раз медленнее).

`XPToNextLevel(L)`:

- Для `L = 1-9`: `round(180 * 1.28^(L-1))`
- Для `L = 10-29`: `round(1450 * 1.15^(L-10))`
- Для `L >= 30`: `round(23000 * 1.10^(L-30))`

`TotalXPForLevel(1) = 0`

`TotalXPForLevel(L) = sum(XPToNextLevel(n))`, где `n = 1 .. L-1`

- Формула XP одинакова для online/offline прогрессии.
- Рост статов при повышении уровня должен использовать **один и тот же канонический путь** во всех режимах.
- Offline-прогрессия не должна использовать отдельные "упрощённые" правила роста статов, если они дают другой результат.

Контрольные значения `XPToNextLevel`:

| Текущий уровень | XP до следующего уровня |
|------|------|
| 1 | `180` |
| 5 | `483` |
| 10 | `1450` |
| 20 | `5866` |
| 30 | `23000` |
| 40 | `59656` |
| 45 | `96077` |
| 50 | `154732` |

### 9.2 Игровые фазы

| Фаза | Уровни | Время |
|------|--------|-------|
| Ранняя | 1-10 | 3-5 часов |
| Середина | 11-30 | 25-45 часов |
| Поздняя | 31-50 | 90-150 часов |
| Лейт/предэндгейм | 51-100 | 300+ часов |
| Эндгейм | 100+ | Бесконечная |

### 9.3 Система Аскензии

После L100: AP = (Max_Level - 50) / 10

---

## 10. 🏆 Meta-Game & Retention

### 10.1 Дневные задачи

- Kill 10 enemies
- Defeat an Elite
- Collect 500 Gold
- Use 3 Buffs
- Reach Level X

### 10.2 Еженедельные вызовы

- Reach Level 50
- Defeat 5 Elites
- Collect 5000 Gold
- Die less than 5 times

### 10.3 Достижения

- Первая кровь
- Воин (L50)
- Легенда (L100)
- Охотник
- Богач
- Везунчик
- Неустрашимый

---

## 11. 🎨 Визуальная система

### 11.1 Система цветов

| Редкость | Цвет | Эффект |
|----------|------|--------|
| Common | Серый | Обычный |
| Uncommon | Зелёный | Glow |
| Rare | Синий | Частицы |
| Epic | Фиолетовый | Яркие частицы |
| Legendary | Золотой | Золотой луч |

---

## 12. 📱 UX принципы

1. Один экран = вся игра
2. Минимум текста — максимум визуала
3. Всё через иконки и цвета
4. Игрок всегда в моменте
5. Нет загрузок — всё instant
6. Мобильная оптимизация
7. Кнопка паузы/play
8. UI должен честно показывать состояние героя: нельзя визуально скрывать потерю HP автоматическим лечением, если сервер/механика этого не дали
9. UI должен ясно показывать модель наград: золото за каждую победу, предметы только при фактическом дропе
10. **Имя героя** (§1.2) всегда видно над моделью в мире; в социальных контекстах — то же имя, без расхождения с сервером

---

## 13. 📊 Баланс-принципы

### 13.1 Цели дизайна

- Ранняя (1-10): Щедрая прогрессия
- Середина (11-50): Сбалансированное развитие
- Поздняя (51+): Медленная прогрессия
- Эндгейм (100+): Аскензия, сезоны

---

## 14. 🔮 Будущие расширения

- Рейды
- Гильдии
- Питомцы
- Ремесло
- Полноценный PvP-рейтинг и арена (базовые **опциональные дуэли на карте** описаны в §2.3)
- Сезонные события
- Расширение полного комплекта слотов §6.3 с отдельным экраном «персонаж»

---

**Конец спецификации**
