# Бэкпорт реневал-мобов и карт из rAthena ## Источник - **rAthena master, коммит `7f080871c8b3bbe7a79027194633201c63422ee1`** (`7f08087`) - Дата коммита: **2026-06-18 11:30:09 +0200** — «Fix compiler errors after skill split (#10043)» - Файлы: `db/re/mob_db.yml` (мобы), `db/re/item_db_etc.yml` (карты). rAthena давно перешёл на YAML; дроп в нём задан по AegisName. ## Правила (по «старым правилам» проекта) - **Additive**: добавляем только то, чего нет в uAthena; запись строго в `db2`-файлы (`db/mob_db2.txt`, `db/item_db2.txt`). Существующие данные не трогаем. - **Без новых механик / без правок движка**: ни строки C не изменено. Всё, что требует реневал-движка (скиллы мобов, реневал-бонусы карт, ID мобов >10000), — исключено, а не пропортировано. - **Pre-renewal сервер**: статы реневала приведены к пре-реневал-диапазону делением опыта (см. ниже). - Источник зафиксирован коммитом (требование задачи). ## Почему именно `re`, а не `pre-re` Реневал-контент (новые данжи/мобы/карты) у rAthena живёт **только** в `db/re/`. В `db/pre-re/` мобов, которых нет в uAthena, всего 12 (саммоны/гардианы — не контент). Поэтому источник — `re`, а реневал-инфляция статов компенсируется делителями опыта. ## Мобы → `db/mob_db2.txt` (генератор `dumps/forge/backport-renewal-mobs.py`) - **Кандидатов** (есть в rAthena re, нет в uAthena): **1683**. - **Добавлено: 1224** (ID ≤ 10000). - **Исключено: 459** — ID > 10000 (эпизоды 17+). Движок: `MAX_MOB_DB = 10000` (`src/map/mob.h`), массив `mob_db_data[MAX_MOB_DB+1]`, а диапазон 10001–30000 зарезервирован под хак size-вариантов спрайта → сервер отвергает `ID>10000` («ID must be in range [1000-10000]»). Поднять предел = правка движка → **вне рамок** «без новых механик». Список 459 — в `backport_renewal_mobs_log.txt` (метка `OVER-MAXMOBDB`). - **2 ID-конфликта** (1136 KOBOLD_4, 1137 KOBOLD_5) были закомментированы в `mob_db.txt` — добавлены и помечены `COMMENTED-IN-UATHENA` для ревью тестерами. ### Маппинг статов (eAthena CSV, 58 колонок) - **Опыт делится** (реневал-EXP раздут ~×120/×72 относительно пре-реневал-кривой): `EXP = BaseExp/120`, `JEXP = JobExp/72`, `MEXP = MvpExp/120`. Делители — константы в начале генератора, **тюнятся перегенерацией**. Это не точная балансировка, а приведение к вменяемому диапазону (MVP-опыт 2.6M → ~22k; колонки `mediumint` тоже не переполняются). - **ATK2 синтез**: реневал-модель single-ATK (`Attack2=0` у 320 мобов) → `ATK2 = Attack` (плоский урон). - **Режим** реконструирован и **сверен с эталоном**: Baphomet = `MONSTER_TYPE_21`(0x3695) | `Class:Boss`(0x20) | `Detector`(0x100) = **0x37B5** — точное значение из uAthena `mob_db.txt`. Формула: `mode = MONSTER_TYPE[Ai|06] | (Class==Boss?0x20) | (Modes.Detector?0x100)`. `Ai`→hex берётся из enum `e_aegis_monstertype` (rAthena `mob.hpp`) — он в классической eAthena-раскладке битов. Реневал-`Modes` (IgnoreMelee/Magic/Ranged/Misc, StatusImmune, KnockBackImmune, TeleportBlock, Mvp, FixedItemDrop) у uAthena бита нет → отброшены. - Race/Element/Size/Speed/задержки — напрямую. Element кодируется `EleLvl*20 + EleNum`. - **Скиллы мобов НЕ портируются** (реневал-скиллы отсутствуют в uAthena = были бы новой механикой). Мобы дерутся в ближнем бою без спец-скиллов. ### Важно: мобы НЕ заспавнены Добавлены только определения в `mob_db2.txt`. **Спавн-скриптов нет** — мобы не появятся на картах сами. Они доступны через `@summon`, скрипты, card-дроп. Поэтому баланс-риск (напр., намеренные rAthena спец-мобы вроде KOBOLD_4 = HP 10 / огромный опыт) — **латентный**, пока не добавлены спавны. ### Дроп - AegisName → uAthena item id (`item_db.txt` ∪ `item_db2.txt`, включая добавленные карты). - Карта-дроп → слот карты (Drop10/`DropCardid`); прочее → Drop1..9; MvpDrops → MVP1..3. - **390 не-картовых дроп-предметов** (реневал-снаряга/расходники) отсутствуют в uAthena → обнулены (0) и залогированы (`MISS-DROP`/`MISS-MVPDROP` в логе). Вернутся при будущем бэкпорте предметов. ## Карты → `db/item_db2.txt` (генератор `dumps/forge/backport-renewal-cards.py`) Бэкпортированы недостающие карты, что роняют реневал-мобы (чтобы card-дроп резолвился). - **Цель: 444** недостающие карты; **добавлено: 441** (3 пропущены — ID уже занят в uAthena другим предметом, помечено в card-scripts-ref). - **Скрипт-эффекты — санитайзер**: скрипт карты сохраняется целиком, только если ВСЕ его токены известны uAthena (`db/const.txt` ∪ билдины `script.c` ∪ скиллы `skill_db.txt` ∪ ключевые слова), И нет конструкций, которые старый парсер uAthena не компилирует: - **`.@` (scope-переменные)** — введены позже, парсер uAthena их не знает; - **`bonus bX;` (1-арг flag-бонус)** — `bonus` в uAthena = `"ii"` (2 аргумента). Иначе скрипт → `{}` (карта-коллекционка; предмет существует, дроп резолвится, загрузка чистая). - Итог: **195 карт с рабочим эффектом**, **246 коллекционных**. Все оригинальные скрипты сохранены в `Doc/backport_renewal_card_scripts.txt` (метки KEPT/DROPPED) для ручного портирования позже. - Это строго «без новых механик»: всё, что uAthena не понимает, не применяется (а не ломается). ## SQL-дампы - `dumps/migrations/A-mob_db.sql` перегенерён (`dumps/forge/mob_db-to-sql.sh`): **2225 INSERT** (1001 + 1224). Проверено изолированным импортом в тест-БД — 0 ошибок, без переполнений. - `dumps/migrations/6-widen-mob-db-stats.sql` дополнен: 13 item-id колонок mob_db (`MVP1-3id`, `Drop1-9id`, `DropCardid`) расширены `smallint`→`mediumint(8) unsigned` (реневал item id до 840026 переполняли smallint=65535). Идемпотентно, применяется до `A-mob_db.sql`. - **item-SQL не трогался**: `items_db-to-sql.sh` берёт только `item_db.txt` (не `item_db2`), карты в `item_db2.txt` в `A-item_db.sql` не попадают. К тому же `use_sql_db: no` — рантайм-сервер читает item/mob из TXT, SQL-таблицы вспомогательные. ## Верификация - **Рантайм (TXT, основной путь)**: map-сервер поднят локально — `item_db2 = 1335`, `mob_db2 = 1224` загружены, **0 script-error**, **0 отказов по ID**, сервер дошёл до «Server is 'ready'». Без fatal/segfault/дублей. - **SQL**: изолированный импорт `1-mob_db.sql` + `6-widen` + `A-mob_db.sql` → 2225 строк, без переполнения колонок. - **Дубли ID**: 0 (live `mob_db.txt` + `mob_db2.txt`). - Игровое поведение/баланс (бой, дроп-рейты, спец-мобы) — за тестерами (нужен клиент). ## Файлы - Генераторы (повторно запускаемые, делители тюнятся): `dumps/forge/backport-renewal-cards.py`, `dumps/forge/backport-renewal-mobs.py`. - Логи бэкпорта: `Doc/backport_renewal_mobs_log.txt` (исключённые мобы, отсутствующие дропы, конфликты), `Doc/backport_renewal_card_scripts.txt` (оригинальные скрипты карт). ## Что НЕ сделано (осознанно) - 459 мобов ID>10000 (эпизоды 17+) — нужен подъём `MAX_MOB_DB` + переделка size-варианта (движок). - Скиллы мобов (реневал-скиллы отсутствуют в uAthena). - 390 не-картовых реневал-предметов в дропе (отдельный item-бэкпорт). - Спавн-скрипты реневал-мобов на картах. - Точная балансировка статов/опыта (делители — грубое приведение; тюнинг за тестерами).