# Наёмники (Mercenary Soldier) — что добавлено и что проверять Порт системы наёмных солдат из eAthena (свиток призыва → временный боевой союзник). **Это НЕ гомункул** (гомункул — это `mercenary.c`/`merc_hom_*`; наёмник — новые файлы `mercenary_soldier.c`/`int_mercenary.c`). Дизайн — `doc/mercenary_soldier_design.md`. ## Что сделано (MSP1 ядро + MSP2 призыв) - **Движок** `src/map/mercenary_soldier.c` — призыв, контракт-таймер, faith/calls, смерть, сохранение. - **Новый тип юнита `BL_MER`** проведён через боевые файлы (status/battle/unit/mob/skill/pc/script), зеркально гомункулу. `block_list.type` расширен `unsigned char`→`unsigned short` (BL_MER=0x100 не влезал в байт). Существующие типы (PC/MOB/HOM/PET) не затронуты. - **Хранение** (char-сервер) `src/char_sql/int_mercenary.c` — 2 таблицы `mercenary` (инстанс) + `mercenary_owner` (faith/calls на персонажа). **Миграция 9**. intif 0x3070-3 ↔ 0x3870-2. - **Кастомный ИИ наёмника** (в eAthena ИИ нет — наёмник управлялся окном клиента): наёмник следует за хозяином, авто-агрит ближних врагов в радиусе обзора и бьёт в ближнем/дальнем бою, возвращается к хозяину. - **Данные 40 скиллов** (8201-8240) в skill_db/cast/require/unit/castnodex (skill-id remap 1000-1040). - **Призыв** — 7 buildin'ов `mercenary_*` + 30 свитков (12153-12182) теперь призывают наёмника (`{ mercenary_create ,1800000; }`, контракт 30 мин). Маппинг: 12153-62 Лучник→6017-26, 12163-72 Меч→6037-46, 12173-82 Копьё→6027-36. ## Деплой 1. Применить **миграцию 9** (`dumps/migrations/9-add-mercenary-tables.sql`) — создаёт `mercenary` + `mercenary_owner`. Через `dumps.sh update` или `mysql ragnarok < dumps/migrations/9-add-mercenary-tables.sql`. 2. Пересобрать (`make sql`) и перезапустить оба сервера. ## Что проверять (кластер + клиент) 1. Миграция применена (таблицы `mercenary`, `mercenary_owner` есть). 2. `@item 12153` → использовать свиток → **появляется наёмник-лучник** (Mina, класс 6017), идёт за хозяином. 3. **Бой:** подойти к мобам → наёмник сам атакует ближних врагов; уводит хозяина → наёмник догоняет. 4. **Типы:** свитки 12163 (меч), 12173 (копьё) → соответствующие наёмники. 5. **Контракт:** через 30 минут наёмник уходит сам (таймер контракта). HP/SP наёмника тратятся в бою. 6. **Релог:** выйти/войти в пределах действия контракта → наёмник возвращается (персист в `mercenary`). 7. **Смерть:** наёмник умирает → исчезает, `mer_id` сбрасывается, loyalty −1. 8. **faith/calls:** растут с призывами/убийствами (каждые 50 киллов наёмника — +1 loyalty и баф). Сохраняются в `mercenary_owner` между сессиями. 9. **Нет регрессий:** гомункулы/пэты/обычный бой работают как прежде (BL_MER аддитивен). 10. **`@merc`** (или `@mercenary`) → показывает статус наёмника в чат (имя/уровень, HP/SP, контракт, киллы, loyalty/calls, скиллы). Без наёмника — «You have no mercenary». ## Известные ограничения (важно для тестировщиков) - **Скиллы наёмника НЕ кастуются под PV7.** В eAthena наёмник кастует скиллы только через клиентское окно скиллов наёмника (пакет `PACKETVER>=20080102`), которого нет в клиенте 2007. Авто-каст-ИИ для скиллов пока не сделан (отложено, см. ниже). Сейчас наёмник дерётся **в ближнем/дальнем авто-бою без скиллов**. Данные скиллов добавлены (на будущее/для окна). - **Окно статуса наёмника** (пакеты 0x29b/0x29d/0x2a2) под PV7 спит. Статус наёмника — **через `@merc`** (готово): имя/уровень, HP/SP, остаток контракта, киллы, loyalty/calls, известные скиллы. - ИИ наёмника — кастомный (не eAthena). Поведение (радиус агра 13, дистанция следования) калибруется. ## Дальше (по плану) - **M7d:** поведение merc-скиллов (`skill_castend` + `battle_calc` группировка с player-скиллами + `StatusSkillChangeTable`) + авто-каст в ИИ + авто-активация пассивов (autoguard/defender). Большой объём в горячих путях — делается ПОСЛЕ подтверждения тестировщиками базового наёмника. - ~~**MSP3:** `@merc`~~ — ГОТОВО. - Скрипты гильдий наёмников (NPC, продажа свитков, faith-награды) — опционально.