You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

778 lines
48 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# AutoHero — Полная спецификация игры
---
## 1. 🎮 Обзор игры
### 1.1 Концепция
AutoHero — это idle/incremental RPG с изометрическим видом и таймер-базированной боевой системой.
### 1.2 Первый вход: имя героя
При **первом** входе в игру (создание профиля героя) игрок обязан **ввести имя героя** — это отдельный шаг до полноценного геймплея на карте.
**Назначение имени:**
- Отображается **над моделью героя** (nameplate / табличка), читаемая на мобильном экране.
- Используется в **социальных взаимодействиях**: встречи с другими игроками (§2.3), приглашения на дуэль, отображение в UI рядом с портретом/иконкой, будущие списки друзей/гильдий — везде, где нужен человекочитаемый идентификатор вместо Telegram ID.
**Правила имени:**
- **Уникальность глобальная:** в рамках игры не может существовать двух героев с одинаковым именем (регистронезависимое сравнение: `Ser` и `ser` — конфликт; точная политика нормализации — на стороне сервера).
- Если выбранное имя **уже занято**, клиент получает **ошибку** (например, код `HERO_NAME_TAKEN` / сообщение для пользователя «Имя занято») и **не создаёт** героя до смены имени.
- Длина и допустимые символы (ориентир): **216** символов; буквы (латиница и/или кириллица по политике продукта), цифры; без пробелов в начале/конце; запрещены оскорбительные шаблоны (модерация — отдельная политика, в 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): **~5575%** от срабатываний «встречи».
- `p_duel_prompt` — показать предложение дуэли: **~1025%** (остальное до 100% — тихий проход без UI, если не хотим спамить).
- Из тех, кому показали дуэль, оба должны согласиться; иначе — отмена без последствий.
- **Дуэль не обязательна для прогрессии:** награды за дуэль — отдельный небольшой пул (честь/косметика/чуть золота), без блокировки основного PvE-loop.
**Ограничения UX (mobile-first):**
- Один экран, минимум текста: иконки «меч», «ладонь (отказ)», таймер **35 сек**.
- Нет обязательного чата; опционально пресеты фраз.
### 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), форпост | Укреплённый донжон + 23 дома + палисад | Восточная граница карты — КПП |
Города **не должны** перекрывать друг друга; между ними — дикие зоны (лес, дорога, поля). Размер влияет на число 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.18.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 с отдельным экраном «персонаж»
---
**Конец спецификации**