# Достижения и титулы — что добавлено и что проверять Новая фича «с нуля» (в eAthena пре-реневала её нет). Дизайн/спека — `doc/achievements_design.md`. Архитектура зеркалит движок quest-log (SP2). Клиент 2007 не имеет окна достижений/титулов → вывод через чат. ## Что добавлено - **Движок** `src/map/achievement.{c,h}` — загрузка `db/achievement_db.txt`, прогресс, разблокировка, награды. - **Хранение** (char-сервер) `src/char_sql/int_achievement.c` + таблица `achievement` (**миграция 8**); per-character прогресс, off-tick сохранение (как quest). intif 0x3062/0x3063 ↔ 0x3862/0x3863. Грузится на логине (`pc_authok`). - **Трекинг** (хуки): убийство моба → AG_KILL; база-уровень → AG_BASELEVEL; джоб-уровень → AG_JOBLEVEL; смена джоба → AG_JOBCHANGE; завершение квеста → AG_QUEST; зени проверяется на логине и при `@achievements`. На логине догоняются уровневые/зени-достижения (существующие персонажи получат их при следующем входе). - **Награды** — за достижение: предмет/зени/опыт (идемпотентно, флаг `rewarded` — нет повторной выдачи при релоге). - **Чат-UI:** - `@achievements` / `@ach` — список всех достижений (завершённые сверху) с прогрессом `count/target`. - `@title` — список разблокированных титулов; `@title ` — выбрать активный; `@title off` — снять. - Уровень — игрокам (`conf/atcommand_athena.conf`: `achievements/ach/title: 0`). Метки ASCII English. ## db/achievement_db.txt (18 стартовых) `ID,Group,TargetID,TargetCount,RewardItem,RewardAmount,RewardZeny,RewardExp,"Name","Title"` Group: 1=KILL(моб TargetID;0=любой) 2=BASELEVEL 3=JOBLEVEL 4=JOBCHANGE(джоб TargetID;0=любой) 5=QUEST(кол-во;TargetID!=0=конкретный) 6=ZENY. Стартовый набор: киллы (Poring/Fabre/любой ×1000/×10000), база-уровни (10/30/50/70/99), джоб-уровни (10/50), смена джоба, квесты (1/10/50), зени (1M/10M/100M). Часть даёт титулы. Значения наград — скромные, **калибруются тестировщиками**. ## Деплой Применить **миграцию 8** (`dumps/migrations/8-add-achievement-table.sql`) — создаёт таблицу `achievement`. Через `dumps.sh update` или вручную: `mysql ragnarok < dumps/migrations/8-add-achievement-table.sql`. ## Известные ограничения (MVP) - **Активный титул — в памяти** (сбрасывается при релоге; переустановить через `@title`). Сам ПРОГРЕСС достижений и награды сохраняются. Персист титула — отдельная доработка (нужна колонка в char). - Зени-достижения обновляются на логине и при `@achievements` (нет live-хука на каждое изменение зени). - Имя-префикс титула над головой персонажа НЕ делается (PV7 не имеет поля титула). ## Что проверять (кластер + клиент) 1. Применена миграция 8 (таблица `achievement` есть). 2. Убить мобов (Poring/Fabre) → `@achievements` показывает рост `count/target`; при достижении цели — «Achievement unlocked», выдаётся награда (предмет/зени/опыт), для титульных — «New title available». 3. Достичь база-уровня 10/30/50 → разблокировка + награда (даже для уже прокачанного перса — при следующем логине). 4. Сменить джоб → AG_JOBCHANGE; завершить квест → счётчик AG_QUEST растёт. 5. `@title` — список разблокированных; `@title ` ставит активный; `@title off` снимает. 6. **Релог** → прогресс и выданные награды сохранены, повторно НЕ выдаются (идемпотентность). 7. Награды/пороги адекватны балансу (откалибровать значения в `achievement_db.txt`). ## Дальше (по желанию) Персист активного титула; больше достижений/титулов; награды-предметы (заголовки); интеграция с @quests-нотификацией.