|
|
# 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 с отдельным экраном «персонаж»
|
|
|
|
|
|
---
|
|
|
|
|
|
**Конец спецификации**
|