# Чеклист тестировщика — бэкпорт item-бонусов Что это: список новых/починенных эффектов гира с шагами проверки и ожидаемым результатом. Статусы: ✅ готово к тесту · ⏳ в очереди · 🚧 в работе. ## Как тестировать (общее) - Получить предмет: `@item ` (карты — вставить в слот брони/оружия и **надеть**). - Базовая проверка любого бонуса: в консоли map-сервера при надевании **НЕ должно быть** строки `pc_bonus: unknown type ...` — если она есть, бонус не реализован. - Сравнивать «с предметом / без предмета» на одном и том же персонаже. ## Статус парсинга (boot-проверка, 2026-06-14) Map-server поднимался для проверки парсинга `const.txt` + `item_db.txt` + `item_db2.txt`: - ✅ **Все Tier-5 бонусы и карты (Vanberk/Isilla) парсятся без ошибок** — ни один предмет с `bIgnoreDefRate`/`bHealPower`/`bMagicHP-SPGainValue`/`bSkillHeal2`/`bHealpower2`/`bAddClassDropItem`/ `bAutoSpellOnSkill`/`bAddEffOnSkill`/`autobonus3` не даёт `script error`. - ✅ **Итог: 0 `script error` при старте** (было ~133). Что было сделано с пред-существующими ошибками (НЕ Tier-5): - **125 out-of-era предметов** (data-backport) звали buildin'ы ep11-13 фич, которых в pre-12 нет (`rentitem`×98, `setfont`×9, `mercenary_create`/`sc_start`×12, `searchstores`/`buyingstore`×4) → скрипт **нейтрализован на `{}`** (предмет остаётся, эффекта нет). По твоему решению. - **8 реальных карт/оружия** с `bonusautoscript`/`bonusautoscript2` (Tegron 1181, Bloody Eater 1182, Nemesis 1541, Ixion's Wings 1737, Hodremlin 4413, Ice Titan 4417, Atroce 4425, Desert Twilight 13034) → **конвертированы в `autobonus` из eAthena master** (теперь реально работают; Nemesis использует наш новый `bAutoSpellOnSkill`). - Найден и починен **баг лексера** `/* */` (`||`→`&&` в `skip_space`). - Перепроверка: `timeout 25 ./map-server_sql >/tmp/b.log 2>&1; grep -c "script error" /tmp/b.log` → `0`. --- ## Tier 1 — чинит уже существующие, но не работавшие итемы ### ✅ Регена HP/SP — `bHPRegenRate` / `bSPRegenRate` (готово к тесту) **Итем:** General Egnigem Cenia Card (**4352**) — `+10% maxHP, +10% maxSP, +50 HP/10с, +10 SP/10с`. - **Надеть:** карту в броню (`@item 4352`), надеть броню. - **Действие:** получить урон и потратить SP, стоять и ждать. - **Ожидается:** - HP растёт на **+50 каждые 10 секунд**, SP — на **+10 каждые 10 секунд**, **постоянно** (не только сидя). - maxHP/maxSP **+10%** (это работало и раньше). - **Краевые:** на полном HP не «переливает» (кап по maxHP); под **Berserk** HP-регены нет (классика); снял карту — реген сразу прекратился; смена другого экипа не сбрасывает накопленный тик. ### ✅ Каст-рейт конкретного скилла — `bonus2 bCastRate` (готово к тесту) **Итемы:** Imp Card (**4433**) → **Fire Bolt** каст −25%; Siroma Card (**4416**) → **Frost Diver** −25%; Holy Stick (**1631**) → Turn Undead / Magnus Exorcismus / Assumptio −25%; Staff of Destruction (**2000**) → скилл 366 −50%. - **Действие:** надеть итем, кастовать затронутый скилл, засечь время каста (с итемом и без). - **Ожидается:** время каста затронутого скилла короче на указанный %; **остальные скиллы — без изменений**. ### ✅ Игнор % MDEF цели (маг-урон) — `bIgnoreMdefRate` (готово к тесту) **Итемы:** Staff of Piercing (**1626**) → игнор **(10 + рефайн)% MDEF** всех целей; Vesper Card (**4374**) → игнор **30% MDEF боссов**; Necromancer Card (**4440**) → игнор 2% MDEF всех. - **Действие:** кастовать болт по цели с заметным MDEF, сравнить урон с итемом и без. - **Ожидается:** маг-урон **выше** (эффективный MDEF цели срезан на %). У Vesper эффект **только по боссам** (по обычным мобам разницы нет). Несколько источников складываются, суммарный кап 100%. --- ## Tier 2 — улучшения игроку (бэкпорт eAthena) · ⏳ не готово *(детальные шаги добавятся при реализации каждого)* - ✅ Damage-бонусы **стакаются** (уже в uAthena: True Sight / EDP / Link — раздельные `ATK_ADDRATE`, идентично eAthena master). Тест: совместить True Sight + EDP на ассасине — бонусы перемножаются, а не берётся максимум. - ✅ `bAtkRate` **складывается** (уже было в uAthena: `atk_rate += val`) — два +10% итема дают +20%, не +10%. Тест: надеть два ATK%-итема, проверить суммарный урон. - ✅ **HT_POWER** (Beast Strafing) — формула `-50+8*STR`: урон выше при STR ≥ 17 (STR 50 ≈ +28%, STR 99 ≈ +41%). Тест: STR-хантер, замерить урон Beast Strafing. - ✅ **Storm Gust** счётчик хитов не сбрасывается при рекасте [eAthena 2010] — перекрывающиеся SG копят счётчик → фриз быстрее. Тест: два SG на одну цель → фриз наступает раньше, чем от одного. - ✅ **Fire Wall / Heat** каденция ударов 20 мс — уже в uAthena (`skill_unit_db` interval=20). - ✅ **Quagmire** действует на боссов (полная длительность — eAthena-нерф 5× НЕ берём). Тест: кинуть Quagmire на MVP → у босса падают AGI/DEX/ASPD/скорость. ## Tier 3 — новые фичи · ⏳ не готово - ✅ **SC_ITEMBOOST / EXPBOOST** (Bubble Gum **12210** / Battle Manual **12208**): юзнуть → иконка баффа. - Bubble Gum: дроп ×2 (кап 90%, если базовый не выше). Тест: бить мобов с/без — дроп выше. - Battle Manual: +50% base+job exp. Тест: убить моба — опыта больше. - **Переживают смерть** и **не снимаются Gospel/диспелом**. Тест: умереть → бафф остался; под Gospel → остался. - ✅ **Cash Food** (STR/AGI/VIT/INT/DEX/LUK_Dish, **12202-12207**): отдельные cash-SC, +10 стат на 30 мин, своя иконка. - **Не стакается с обычной едой** (применяется бо́льшая из двух). Тест: съесть cash +10 → стат +10; добавить обычную +5 → всё равно +10 (не +15). - **Переживает смерть** и не снимается Gospel/диспелом. Тест: умереть → cash-бафф остался. --- ## Tier 4 — подсистема `autobonus` (шанс-на-удар временный бонус) · ✅ готово к тесту Что это: бэкпорт eAthena-подсистемы `autobonus` / `autobonus2` / `autobonus3` — временный бонус с собственным таймером по шансу при **атаке** (`autobonus`), при **получении удара** (`autobonus2`) или при **использовании скилла** (`autobonus3`). Скрипт парсится один раз и кэшируется в `autobonus_db`. ### ✅ Vanberk Card (4411) — крит +100% на 5 c по шансу при атаке **Итем:** карта в оружие (`@item 4411`), надеть. Базовый бонус: **+2 STR** (постоянно). - **Действие:** многократно атаковать моба. - **Ожидается:** с шансом **0.5%** на удар — вспышка (EF_ENHANCE) и на **5 секунд** даётся **+100 Critical**; пока активно — криты почти всегда. Через 5 c бонус спадает. - **Краевые:** снять оружие при активном баффе → бонус и флаг снимаются (нет «вечного» крита); пересчёт стата (смена другого экипа, левелап) **не теряет** остаток длительности; повторный прок не стакается, пока активен (один слот = один активный autobonus). ### ✅ Isilla Card (4412) — каст −50% и Flee +30 на 5 c по шансу при получении маг-удара **Итем:** карта в оружие (`@item 4412`), надеть. Базовый бонус: **+2 INT** (постоянно). - **Действие:** получать **магический** урон (BF_MAGIC). - **Ожидается:** с шансом **5%** при маг-ударе — вспышка (EF_SUFFRAGIUM) и на **5 секунд** **−50% время каста** и **+30 Flee**. По физ-урону **не срабатывает** (только BF_MAGIC). - **Краевые:** как у Vanberk (снятие / пересчёт / не-стак). ### Общая проверка autobonus - В консоли map при надевании **нет** `script error` по строкам карт — скрипт распарсился. - Прочие бэкпортнутые `autobonus`/`autobonus2`-итемы (напр. Shield of Naga 2134, Chameleon Armor 2386) тестируются так же: надеть → выполнить условие (атака / получение удара нужного типа) → бафф на N c. ### ✅ `autobonus3` (бонус при использовании скилла) — ТЕПЕРЬ РАБОТАЕТ (готово к тесту) Бэкпортирована функция `skill_onskillusage` (триггер при использовании скилла), вызывается из диспетчеров `skill_castend_id` (таргетные скиллы) и `skill_castend_pos` (наземные). Затронуты: **Dea Staff (2005)**, **Angelic Ring (2743)**. - **Тест:** надеть Angelic Ring (2743) → каждый каст **Heal** с шансом 50% даёт на 2 c `bonus bHealPower,20` (и аналогично для AM_POTIONPITCHER / PR_SANCTUARY); каст другого скилла бонус не даёт. - **Проверки:** срабатывает на использование указанного скилла (не на атаку); шанс/длительность как у обычного autobonus; снятие предмета снимает. ### Данные: визуальные эффекты `EF_*` В `db/const.txt` добавлен стандартный eAthena-блок `EF_*` (1023 константы) — нужен для `specialeffect/specialeffect2` в картах и бэкпортнутом `item_db2` (EF_ENHANCE, EF_SUFFRAGIUM, EF_GUARD, EF_HEAL, …). Без него имена эффектов парсились как 0 (неверная/отсутствующая вспышка). --- ## Tier 5 — доработки бонусов из `item_db2` (бэкпорт eAthena pre-renewal) Реализуются по одному, коммит на каждый. Все — player-positive (ранние формулы eAthena master). ### ✅ `bIgnoreDefRate` — игнор % физического DEF цели по расе (готово к тесту) **Что:** `bonus2 bIgnoreDefRate,<раса>,<%>` — снижает эффективный физ-DEF цели указанной расы на % (зеркало `bIgnoreMdefRate`, только для физ-атак). Суммируется (boss/nonboss + раса), кап 100%. **Где в данных:** 65 использований в `item_db2`, в основном `RC_DemiHuman,20` (WoE-урон по игрокам). - **Тест:** надеть итем с `bonus2 bIgnoreDefRate,RC_DemiHuman,20`, бить **игрока/демихуман-моба** с заметным DEF; сравнить урон с итемом и без — **с итемом выше** (DEF цели срезан на 20%). - **Проверки:** работает только по своей расе (по другим расам разницы нет); несколько источников складываются, суммарно не больше 100%; на маг-атаки **не влияет** (это отдельный `bIgnoreMdefRate`); в консоли при надевании нет `pc_bonus: unknown type`. ### ✅ `bHealPower` — сила хила кастующего +% (готово к тесту) **Что:** `bonus bHealPower,<%>` — увеличивает **исходящий** хил игрока на %. По умолчанию действует на **Heal, Sanctuary, Potion Pitcher** (конфиг `skill_add_heal_rate: 7` в `conf/battle/skill.conf`; биты 1/2/4/8/16 = Heal/Sanctuary/PotionPitcher/SlimPitcher/AppleIdun). **Где в данных:** 13 использований (хил-гир, напр. Angelic-гир). - **Тест:** прист с `bonus bHealPower,30`, кастовать **Heal** на цель — вылеченное HP больше на ~30%, чем без итема; сравнить число. - **Проверки:** действует на скиллы из маски (по умолчанию Slim Pitcher / Apple of Idun **не** усилены, если не включить биты 8/16); складывается с per-skill `bSkillHeal`; в консоли нет `unknown type`. - **Конфиг:** админ может расширить/сузить набор скиллов через `skill_add_heal_rate` (битмаска). ### ✅ `bMagicHPGainValue` / `bMagicSPGainValue` — личь HP/SP при убийстве магией (готово к тесту) **Что:** `bonus bMagicHPGainValue,` / `bonus bMagicSPGainValue,` — восстанавливают n HP/SP, когда игрок **добивает моба магией** (BF_MAGIC killing blow). **Где в данных:** 2 / 1 использование (маг-гир). - **Тест:** маг с `bonus bMagicHPGainValue,50`, **убить** моба болтом — после убийства +50 HP; убить моба в **ближнем бою** (без магии) — магической прибавки **нет**. - **Проверки:** срабатывает только на **убивающем** маг-ударе (не на каждом хите); HP/SP не переливают за макс; в консоли нет `unknown type`. - **Нюанс реализации:** обычный `bHPGainValue` (личь оружием) в uAthena начисляется в `mob_dead` безусловно — на маг-килле теоретически могут сработать оба, но маг-гир обычно не несёт оружейной личи. ### ✅ `bHealpower2` / `bSkillHeal2` — сила хила, ПОЛУЧАЕМОГО целью, +% (готово к тесту) **Что:** усиливают хил, который игрок **получает** (сторона получателя, в отличие от `bHealPower` — стороны кастующего). `bonus bHealpower2,<%>` — на любой хил; `bonus2 bSkillHeal2,,<%>` — только на указанный скилл. **Где в данных:** 2 / 5 использований. - **Тест (bHealpower2):** на игрока-цель надеть `bonus bHealpower2,20`; другой игрок кастует на него Heal — вылеченное HP **на 20% больше**, чем без итема (бонус на стороне принимающего, не кастующего). - **Тест (bSkillHeal2):** `bonus2 bSkillHeal2,AL_HEAL,30` на цель → только Heal лечит её на +30%, прочие хилы (напр. Sanctuary) — без изменений. - **Проверки:** работает на стороне **получателя** (надевает цель, не кастер); складывается с `bHealPower` кастующего; в консоли нет `unknown type`. - **Доработка движка:** `skill_calc_heal` теперь принимает `skill_id` (свёрнут receiver-бонус внутрь, как в eAthena) — 3 вызова обновлены; формула базового хила не изменилась. ### ✅ `bAddClassDropItem` — доп. дроп с конкретного класса моба (готово к тесту) **Что:** `bonus3 bAddClassDropItem,,,` — шанс `rate`/10000 уронить `item` при убийстве моба, **класс (ID) которого = `mobclass`** (в отличие от `bAddMonsterDropItem`, который по расе). **Где в данных:** 2 использования (напр. `bonus3 bAddClassDropItem,6152,2047,70`). - **Тест:** надеть итем с `bonus3 bAddClassDropItem,512,1002,5000` (яблоко с Poring, шанс 50%); убить **Poring (1002)** много раз — часто падает яблоко; убить **другого** моба — этого дропа нет. - **Проверки:** дроп привязан строго к указанному `mobclass` (ID моба), не к расе; не ломает обычные расовые `bAddMonsterDropItem` (race>0 ветка); в консоли нет `unknown type`. - **Реализация:** класс кодируется как **отрицательная race** в `add_drop[]` (`race == -md->class_`, паттерн eAthena) — без нового поля в структуре. ### ✅ `bAutoSpellOnSkill` — авто-каст скилла при использовании скилла (готово к тесту) **Что:** `bonus4 bAutoSpellOnSkill,"<скилл-триггер>","<скилл-каст>",,` — при использовании скилла-триггера с шансом `rate`/1000 авто-кастует скилл-каст. Имена скиллов — **строкой** (конвертируются `skill_name2id`). **Где в данных:** 25 использований (напр. `bonus4 bAutoSpellOnSkill,"MG_FIREBOLT","MG_LIGHTNINGBOLT",3,10000`). - **Тест:** надеть итем с `bonus4 bAutoSpellOnSkill,"MG_FIREBOLT","MG_LIGHTNINGBOLT",3,1000`; кастовать **Fire Bolt** — с шансом 100% авто-кастуется Lightning Bolt Lv3 по той же цели; кастовать другой скилл — авто-каста нет. - **Проверки:** триггер — именно указанный скилл (не атака); support/self скиллы-касты идут на себя; без таргета (для not-self скиллов) не срабатывает; в консоли нет `unknown type`. - **Реализация:** `skill_onskillusage` зовётся из диспетчеров (не из самих castend) → авто-каст через прямой `skill_castend_*` **не** рекурсит обратно (lock не нужен, в отличие от eAthena). `.flag` в `s_autospell` хранит скилл-триггер. ### ✅ `bAddEffOnSkill` — шанс наложить статус на цель при использовании скилла (готово к тесту) **Что:** `bonus3 bAddEffOnSkill,"<скилл>",,` — при использовании указанного скилла (физ-атака, BF_WEAPON) с шансом `rate`/10000 накладывает статус на **цель**. Имя скилла — строкой. **Где в данных:** 9 использований (напр. `bonus3 bAddEffOnSkill,"BS_HAMMERFALL",Eff_Stun,500`). - **Тест:** надеть итем с `bonus3 bAddEffOnSkill,"RG_RAID",Eff_Poison,10000`; бить мобов/игроков **Raid'ом** — цель **отравляется** (100%); бить обычной атакой/другим скиллом — статуса нет. - **⚠️ ВоЕ-баланс:** это **наступательный** бонус (стан/фриз/яд по вражеским игрокам) — взят **аутентично** pre-renewal по согласованию; учесть при балансе ВоЕ. - **Проверки:** срабатывает на указанный скилл при физ-атаке (внутри BF_WEAPON-блока, как eAthena); статус на цель (ATF_TARGET); в консоли нет `unknown type`.