Чинит поломку сейвов, внесённую предыдущим коммитомe362c62, и заменяет её механику на безопасную. ЧТО БЫЛО СЛОМАНО.e362c62перенёс resourceNecromancerBlood из items.xml в item_modifiers.xml, чтобы кровь вставлялась в Пространственный браслет. Класс предмета определяет БАЙТОВУЮ РАСКЛАДКУ каждого его стака в сейве: ItemValue.Read строка 1094: if ((version > 4 || HasQuality) && !(itemClass is ItemClassModifier)) ItemValue.Write строка 1228: if (!(ItemClass is ItemClassModifier)) Обычный предмет пишет байт числа модификаций и байт числа косметических слотов; ItemClassModifier не пишет ни того, ни другого. Сейв, записанный до переноса, после переноса читается со сдвигом - поток съезжает на первом же стаке крови, и PlayerDataFile.Load падает. Бэкап .ttp.bak умирает вместе с основным файлом: он того же формата. В тестовом мире персонаж потерян вместе с бэкапом, игра откатилась на Respawning: NewGame. В коммитеe362c62написано "сейв цел" со ссылкой на assignIdsFromMapping. Айди действительно берутся из сохранённого name->id мэппинга - но ломается не айди, а раскладка байтов, и к мэппингу это отношения не имеет. Была проверена не та вещь. ОТКАТ. Кровь вернулась в items.xml обычным <item>. Набор её свойств сверен с7172681и совпадает посимвольно: убраны и Stacknumber=1, и прочность (ShowQuality + DegradationBreaksAfter + effect_group DegradationMax). Обе правки были безвредны для сейва, но существовали ради отменённой механики - по указанию пользователя откат доведён до "как было", а не до "как было плюс безвредное". Стак снова 15, наследуется от medicalBloodBag. В комментарии у предмета оставлено предупреждение с номерами строк Read/Write - единственное, что вынесено из аварии, и единственное, ради чего стоит читать этот комментарий целиком. КРОВАВАЯ СФЕРА. Расходник браслета теперь отдельный предмет, и это ровно то, что делает правку безопасной: resourceBloodSphere - НОВОЕ имя, в старых сейвах его нет, значит нет и ни одного стака, который читался бы по другой раскладке. Общее правило, выведенное из аварии: предмет, который уже мог попасть в чужой инвентарь, нельзя переводить между ItemClass и ItemClassModifier ни в какую сторону - нужна модификация, заводи новый предмет. Продиктовано: доступна на первом грейде, без станка, 1 кровь некроманта + 5 праха зомби дают две сферы, прочность 500. В руке - камень с алым тинтом. - item_modifiers.xml: installable_tags="necroBracelet", свой modifier_tags, type="attachment", DegradationMax 500 в tiered="false" группе. Extends=modGeneralMaster, а НЕ resourceRockSmall: вместе с камнем приезжали бы Action0 ThrowAway и ThrowableDecoy, то есть сферу можно было бы метать. Меш берётся строкой Meshfile, наследовать ради него весь предмет не нужно. - Вид в руке: HoldType 40 и все три меша (Meshfile/HandMeshfile/DropMeshfile) на rock_smallPrefab плюс TintColor "220, 30, 45". Путь проверенный - на этом же меше с таким же тинтом в моде живут Камень духов и оба портальных камня. - recipes.xml: count=2, без craft_area и без тега разблокировки (группа 1 открыта с уровня 1, рецепт без тега доступен всегда - как у Камня духов). - progression.xml: сфера в unlock_entry группы 1, unlock_tier="1". - SpatialVaultPickupPatch: SpendBlood -> SpendCharge, имя из новой константы ChargeItemName. Гейт пустого слота в Begin снова включён - после отката он был временно закомментирован, потому что вставлять было нечего. ИКОНКИ. Свои, от пользователя: BloodSphere.png и BloodStone.png, 160x160 RGBA, в ItemIconAtlas и ItemIconAtlasGreyscale. Серая копия обязательна - без неё у заблокированной записи в скиллах не будет картинки вообще. Способ её получения подобран сверкой с существующими файлами и совпал ПОБИТОВО: convert('L') на RGB без альфы, альфа приклеивается обратно отдельным каналом. Записано в BACKLOG.md, раньше это нигде не было зафиксировано. Иконка камня положена заранее - самого предмета ещё нет, он запланирован. ПРОВЕРЕНО, ЧТО НИЧЕГО БОЛЬШЕ НЕ ЕДЕТ. Сверка с7172681: набор <item> в items.xml не изменился, в item_modifiers.xml единственное добавление - resourceBloodSphere, и ни у одного существующего предмета не менялись Tags, ShowQuality и Stacknumber. То есть ни один предмет не сменил класс и не сменил раскладку. В игре: мир грузится без ошибок, сфера крафтится и тратится - в логе "sphere in slot 0 now 12/500 used" за 12-секундный канал. --- Revert the blood, and a Blood Sphere in its place Fixes the save corruption introduced bye362c62and replaces the mechanic behind it with a safe one. WHAT WAS BROKEN.e362c62moved resourceNecromancerBlood from items.xml into item_modifiers.xml so it could be installed in the Spatial Bracelet. An item's CLASS decides the BYTE LAYOUT of every stack of it in a save: ItemValue.Read line 1094: if ((version > 4 || HasQuality) && !(itemClass is ItemClassModifier)) ItemValue.Write line 1228: if (!(ItemClass is ItemClassModifier)) A plain item writes a modifications count and a cosmetic-slot count; an ItemClassModifier writes neither. A save written before the move reads out of step after it - the stream slips on the first blood stack and PlayerDataFile.Load throws. The .ttp.bak backup dies with the main file, being the same format. In the test world the character was lost along with its backup and the game fell back to Respawning: NewGame. e362c62's message claimed "saves are safe", citing assignIdsFromMapping. Item ids really do come from the stored name->id mapping - but what breaks is not the id, it is the byte layout, and the mapping has nothing to do with it. The wrong thing was verified. THE REVERT. The blood is a plain <item> in items.xml again. Its property set was diffed against7172681and matches character for character: both Stacknumber=1 and the durability (ShowQuality + DegradationBreaksAfter + the DegradationMax effect_group) are gone. Both were harmless to the save format, but both existed only to serve the cancelled mechanic - on the user's instruction the revert goes back to "as it was", not "as it was plus whatever I judged harmless". The stack is 15 again, inherited from medicalBloodBag. A warning carrying the Read/Write line numbers stays in the item's comment - the one thing worth keeping out of this accident. THE BLOOD SPHERE. The bracelet's charge is its own item now, and that is precisely what makes this safe: resourceBloodSphere is a NEW name, absent from every existing save, so no stack of it can be read under the wrong layout. The general rule the accident produced: an item that may already sit in someone's inventory must never be moved between ItemClass and ItemClassModifier in either direction - if a modifier is wanted, make a new item. Dictated: available at the first grade, no workstation, 1 Necromancer's Blood + 5 zombie ash makes two spheres, durability 500. Held, it is a stone with a scarlet tint. - item_modifiers.xml: installable_tags="necroBracelet", its own modifier_tags, type="attachment", DegradationMax 500 in a tiered="false" group. Extends=modGeneralMaster, NOT resourceRockSmall: the rock would have brought Action0 ThrowAway and ThrowableDecoy with it, making the sphere throwable. The mesh comes from the Meshfile line; inheriting a whole item for it is not needed. - Held look: HoldType 40 and all three meshes (Meshfile/HandMeshfile/ DropMeshfile) on rock_smallPrefab, plus TintColor "220, 30, 45". A proven path - the Spirit Stone and both portal stones already live on that mesh with that same kind of tint. - recipes.xml: count=2, no craft_area and no unlock tag (group 1 opens at level 1, and a recipe with no tag is simply always available, as with the Spirit Stone). - progression.xml: the sphere joins group 1's unlock_entry at unlock_tier="1". - SpatialVaultPickupPatch: SpendBlood -> SpendCharge, the name coming from a new ChargeItemName constant. The empty-slot gate in Begin is switched back on - it was commented out during the revert because nothing could be installed. ICONS. The user's own art: BloodSphere.png and BloodStone.png, 160x160 RGBA, in both ItemIconAtlas and ItemIconAtlasGreyscale. The greyscale copy is mandatory - without it a locked skill entry has no picture at all. How those copies are made was worked out by diffing against the existing files and matched BIT FOR BIT: convert('L') over RGB without the alpha, with the alpha merged back as its own channel. Written up in BACKLOG.md; it had never been recorded anywhere. The stone's icon is filed ahead of the item, which is still only planned. VERIFIED THAT NOTHING ELSE SHIFTS. Diffed against7172681: the set of <item> entries in items.xml is unchanged, the only addition to item_modifiers.xml is resourceBloodSphere, and no existing item had its Tags, ShowQuality or Stacknumber changed. No item changed class, and no item changed layout. In game: the world loads clean, and the sphere crafts and drains - the log shows "sphere in slot 0 now 12/500 used" for a 12-second channel. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MnwP2Dt1vk8bUPJ452EoVL
199 lines
17 KiB
XML
199 lines
17 KiB
XML
<config>
|
||
<!-- "Некромантия" (Necromancy) skill.
|
||
Reuses the vanilla crafting_skill mechanism (same class that powers e.g.
|
||
craftingHarvestingTools) parented to the vanilla "attCrafting" virtual
|
||
attribute — this makes it auto-level from a game action (not spent perk
|
||
points) and show up for free in the game's existing crafting-skills panel.
|
||
|
||
Originally this leveled from reading books (see git history / earlier
|
||
comments), but items.xml effect_group does NOT inherit through Extends in
|
||
this game version (confirmed by decompiling ItemClassesFromXml.parseItem -
|
||
it always parses effect_group from the item's own XML node, passing null as
|
||
the "parent node" argument to MinEffectController.ParseXml regardless of
|
||
Extends; entity_class does the equivalent WITH the parent node passed in,
|
||
which is why the zombie kill counter below always worked and reading books
|
||
never did). Patching every single one of the ~150 skill magazine/schematic
|
||
items individually to work around that was judged not worth it - so this
|
||
levels from zombie kills instead, via the same entityclasses.xml patch on
|
||
zombieTemplateMale that already drives necroZombieKillsCVar (see
|
||
entityclasses.xml) - one kill, one level, capped at max_level.
|
||
|
||
max_level=5000, with 5 recipe groups gated at fixed total-zombie-kills
|
||
thresholds (proportional to the original 1000-max version: 0.1% / 10% / 40%
|
||
/ 60% / 100%):
|
||
Group 1 "Адепт" - available from the start (level 1), but not all
|
||
of it - individual recipes within the group still
|
||
unlock at their own level as usual.
|
||
Group 2 "Подмастерье" - level 500
|
||
Group 3 "Ученик" - level 2000
|
||
Group 4 "Некромант" - level 3000
|
||
Group 5 "Мастер" - level 5000
|
||
|
||
Recipe unlocks: give a recipe Tags="necroNecromancyAdept" / "necroNecromancyJourneyman"
|
||
/ "necroNecromancyApprentice" / "necroNecromancyNecromancer" / "necroNecromancyMaster"
|
||
(whichever group it belongs to) and it will unlock automatically once the
|
||
player crosses that group's threshold - no further change needed here.
|
||
thrownStoneSpirit (Камень духов) carries none of these tags at all, since Group 1
|
||
"Адепт" is unlocked from level 1 anyway - a recipe with no unlock tag is just always
|
||
available, same effect, no need to spend a tag on it.
|
||
|
||
One genuine one-off exception: necroNecromancyLvl20 (level 20) - the Пространственный
|
||
браслет, per direct instruction 2026-08-30 ("нож, камень духов и хранилище - это база...
|
||
хранилище, когда убито минимум 20 зомби") - it belongs in the Group 1 "Адепт" display
|
||
bucket (see below) but needs its own slightly-later unlock level within that same group,
|
||
which is what unlock_tier is for (see display_entry below), not a reason to invent a
|
||
whole separate group.
|
||
|
||
UPDATED 2026-08-29: display_entry blocks added below now that real necromancer items/
|
||
recipes exist to point them at - per the user's own direct report ("до сих пор нету ни
|
||
одного рецепта" in the skill panel).
|
||
|
||
UPDATED 2026-08-30 (user report: "превью пустые" - the group icons in the skill panel
|
||
were blank). Root cause: `icon=` on display_entry needs a real ICON ATLAS SPRITE NAME
|
||
(the same string you'd give CustomIcon), not the item's own internal id - fixed by
|
||
pointing icon= at each group's actual CustomIcon sprite value.
|
||
|
||
REVERTED-AND-REDISTRIBUTED AGAIN 2026-08-30, two direct corrections in a row:
|
||
1. "Что ещё за 'уровень'? Была же система! А рецепту можно без группы задать уровень
|
||
скилла на котором он откроется." - an earlier edit had invented ad-hoc "Level
|
||
20/50/200" display groups, abandoning the real 5-tier flavor-name system this
|
||
comment already documents above (Адепт/Подмастерье/Ученик/Некромант/Мастер -
|
||
craftingNecroNecromancyTier1-5Name, all already localized, unused since). A recipe's
|
||
actual unlock level is controlled entirely by its own `tags=` + the
|
||
RecipeTagUnlocked effect_group below - display_entry is PURELY the skill-panel
|
||
preview widget, the two don't need to be 1:1. Confirmed against real vanilla
|
||
precedent (Data/Config/progression.xml's own explosives group): one display_entry
|
||
can list several items that reveal at different levels via a comma-list
|
||
unlock_level plus multiple unlock_entry elements at increasing unlock_tier.
|
||
2. "У тебя получается 5 групп, как и должно было быть. А вот уровень скилла ты
|
||
распределил идиотски." - the fix for #1 above had (wrongly) folded EVERYTHING except
|
||
the black stone into Group 1 alone (levels 1/20/50/200), leaving the three real
|
||
mid-game tiers (Подмастерье@500/Ученик@2000/Некромант@3000) completely empty and
|
||
unused - defeating the entire point of having 5 groups spread across the level
|
||
range. Fixed by actually spreading the non-base items across all 5 real tiers
|
||
instead of clustering them all near the bottom - see the effect_group tags below and
|
||
recipes.xml for the final per-item distribution:
|
||
Group 1 "Адепт" (level 1, +20 for the bracelet) - Spirit Stone, Knife,
|
||
Blue Portal Stone, Spatial Vault, Pyramid of Spirits,
|
||
and (since 2026-09-09) the four survival-flavoured knife
|
||
mods at +30 / +60 / +100 / +300
|
||
Group 2 "Подмастерье" (level 500) - Grimoire of Deviation, plus the two combat
|
||
knife mods at 1400 / 1700
|
||
Group 3 "Ученик" (level 2000) - Zombie Dog, Insect Swarm, Zombie Griffin
|
||
Group 4 "Некромант" (level 3000) - Zombie Bear, Zombie Wolf, Banshee's Scroll
|
||
Group 5 "Мастер" (level 5000) - Black Portal Stone
|
||
necroNecromancyLvl50/Lvl200 tags removed (no longer used by anything - Grimoire and
|
||
the summon books now use the real necroNecromancyJourneyman/Apprentice/Necromancer
|
||
tags instead). necroNecromancyLvl20 stays - still the one legitimate one-off (see
|
||
above). -->
|
||
<append xpath="/progression/crafting_skills">
|
||
<crafting_skill name="craftingNecroNecromancy" max_level="5000" parent="attCrafting" name_key="craftingNecroNecromancyName" desc_key="craftingNecroNecromancyDesc" long_desc_key="craftingNecroNecromancyLongDesc" icon="ui_game_symbol_zombie">
|
||
|
||
<!-- display_entry block kept in the SAME append as the crafting_skill itself (unlike
|
||
an earlier draft of this edit, which tried appending display_entry via a second,
|
||
separate xpath targeting crafting_skill[@name='craftingNecroNecromancy'] BEFORE
|
||
this element even exists in load order - same class of bug that already broke
|
||
loot.xml once, see that file's own load-order comment. Nesting it here avoids the
|
||
ordering question entirely, and matches how vanilla itself writes display_entry -
|
||
directly inside the crafting_skill tag, not as a separate append). -->
|
||
<display_entry icon="SpiritStone" name_key="craftingNecroNecromancyTier1Name" has_quality="false" unlock_level="1,20,30,60,100,300">
|
||
<!-- necroHeresyPyramid added here 2026-08-31 (user request: "добавь рецепт блока в
|
||
скиллы") - unlock_tier="1" alongside the other always-available Tier-1 items,
|
||
matching its recipe's own necroNecromancyAdept tag in recipes.xml (see that
|
||
file's comment - both express the same "available immediately" intent). -->
|
||
<!-- resourceBloodSphere добавлена 2026-09-15 (указание «доступна на первом
|
||
грейде»): tier 1 - это уровень 1, то есть с самого начала, как и весь
|
||
остальной базовый набор. Её рецепт в recipes.xml намеренно без тега
|
||
разблокировки - для tier 1 тег не нужен, группа открыта сразу. -->
|
||
<unlock_entry item="thrownStoneSpirit,necroWpnBladeNecroKnife,thrownStonePortalBlue,necroHeresyPyramid,resourceBloodSphere" unlock_tier="1"/>
|
||
<unlock_entry item="braceletSpatialVault" unlock_tier="2"/>
|
||
<!-- ЧЕТЫРЕ МОДА НОЖА ПЕРЕЕХАЛИ СЮДА ИЗ ГРУППЫ 2, 2026-09-09. Продиктовано:
|
||
"Питьё важно в тот же день. Оно должно быть доступно после 30 убитых зомби.
|
||
Еда - 60. Это самые важные для начала выживания модификации. Модификация на
|
||
покой - 100 зомби. Модификацию на тёмное чутьё я бы сделал доступной после
|
||
300 убитых зомби."
|
||
|
||
ЧТО БЫЛО СЛОМАНО. Правка 2026-09-07 разложила все шесть модов ножа внутри
|
||
группы 2, то есть в диапазоне 500-1700 убийств. Это ошибка баланса, а не
|
||
кода (сама тройка "тег рецепта + RecipeTagUnlocked + unlock_tier" сходилась
|
||
по всем шести): голод и жажда - проблема ПЕРВЫХ ДНЕЙ, а к 500 убийствам у
|
||
игрока давно есть ферма, костёр, банки и фильтр, и +2 воды с трупа ему уже
|
||
не нужны. Два самых "выживальческих" мода открывались ровно тогда, когда
|
||
переставали быть нужны - мёртвый контент. Сам нож лежит в группе 1 и
|
||
доступен с уровня 1, поэтому моды на воду, еду и тепло теперь идут сразу за
|
||
ним, в той же группе.
|
||
|
||
Ступени группы 1 после правки: 1 - база, 20 - браслет, 30 - вода, 60 - еда,
|
||
100 - покой, 300 - чутьё. Все шесть порогов ниже 500, то есть на группу 2
|
||
они не заезжают. Хватка мертвеца (1400) и Мёртвая буря (1700) остались в
|
||
группе 2 - это чисто боевые моды, ранний доступ им не нужен ("дальше уже не
|
||
так принципиально").
|
||
|
||
Порядок вода -> еда не случаен и задан пользователем прямо: пить хочется в
|
||
тот же день, есть - позже. -->
|
||
<unlock_entry item="necroModKnifeTearsOfTheDead" unlock_tier="3"/>
|
||
<unlock_entry item="necroModKnifeScavengersFeast" unlock_tier="4"/>
|
||
<unlock_entry item="necroModKnifeGravesRepose" unlock_tier="5"/>
|
||
<unlock_entry item="necroModKnifeDarkSense" unlock_tier="6"/>
|
||
</display_entry>
|
||
<!-- Ступенчатая разблокировка внутри группы. ПЕРЕРАСПРЕДЕЛЕНО 2026-09-09: четыре из
|
||
шести модов ножа (вода/еда/покой/чутьё) уехали отсюда в группу 1 - см. большой
|
||
комментарий там. Здесь остались Гримуар и два боевых мода ножа.
|
||
|
||
КАК ЭТО ЧИТАЕТСЯ (разобрано по декомпиляции, потому что семантика неочевидная):
|
||
unlock_level - это список порогов (ProgressionClass.QualityStarts), а unlock_tier
|
||
в XML 1-based, при разборе из него вычитается единица
|
||
(ProgressionFromXml.cs:396 - "ParseSInt32(...) - 1"). Дальше
|
||
GetUnlockItemLocked = GetQualityLevel(level) <= UnlockTier
|
||
где GetQualityLevel возвращает индекс первого порога, который БОЛЬШЕ текущего
|
||
уровня. В сумме это даёт простое правило: запись с unlock_tier="N" выходит
|
||
из-под замка ровно на N-м значении unlock_level, считая с единицы. Поэтому здесь
|
||
tier 1 -> 500, tier 2 -> 1400, tier 3 -> 1700, а в группе 1 выше -
|
||
tier 1 -> 1, tier 2 -> 20, tier 3 -> 30, tier 4 -> 60, tier 5 -> 100,
|
||
tier 6 -> 300.
|
||
|
||
Заблокированная запись рисуется греем из АТЛАСА ItemIconAtlasGreyscale плюс
|
||
спрайт-замок ui_game_symbol_unlock поверх (XUi_InGame/windows.xml ~2523-2524,
|
||
привязки unlock_icon_atlasN / unlock_icon_lockedN). Именно поэтому у мода теперь
|
||
есть вторая папка UIAtlases/ItemIconAtlasGreyscale - без неё под замком у иконки
|
||
не было бы картинки вообще. -->
|
||
<display_entry icon="ScrollOfDeviation" name_key="craftingNecroNecromancyTier2Name" has_quality="false" unlock_level="500,1400,1700">
|
||
<unlock_entry item="thrownBookGrimoireDeviation" unlock_tier="1"/>
|
||
<unlock_entry item="necroModKnifeDeadMansGrip" unlock_tier="2"/>
|
||
<unlock_entry item="necroModKnifeDeadStorm" unlock_tier="3"/>
|
||
</display_entry>
|
||
<display_entry icon="SummonZombieDog" name_key="craftingNecroNecromancyTier3Name" has_quality="false" unlock_level="2000">
|
||
<unlock_entry item="bookSummonZombieDog,bookSummonInsectSwarm,bookSummonZombieGriffin" unlock_tier="1"/>
|
||
</display_entry>
|
||
<display_entry icon="SummonZombieBear" name_key="craftingNecroNecromancyTier4Name" has_quality="false" unlock_level="3000">
|
||
<unlock_entry item="bookSummonZombieBear,bookSummonZombieWolf,bookBanshee" unlock_tier="1"/>
|
||
</display_entry>
|
||
<display_entry icon="BlackPortalStone" name_key="craftingNecroNecromancyTier5Name" has_quality="false" unlock_level="5000">
|
||
<unlock_entry item="thrownStonePortalBlack" unlock_tier="1"/>
|
||
</display_entry>
|
||
|
||
<effect_group>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1,5000" value="1" tags="necroNecromancyAdept"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="20,5000" value="1" tags="necroNecromancyLvl20"/>
|
||
<!-- Пороги модов ножа, 2026-09-09 (см. комментарий в recipes.xml и в группе 1
|
||
выше). Каждый уровень тут ОБЯЗАН совпадать с соответствующим значением в
|
||
unlock_level того display_entry, где лежит мод, иначе замок на панели скилла
|
||
разойдётся с реальной доступностью рецепта: display_entry рисует замок сам по
|
||
себе, по unlock_tier, и о тегах не знает.
|
||
Lvl800 и Lvl1100 удалены вместе с этой правкой - ими больше никто не
|
||
пользуется (Тёмное чутьё уехало на 300, Могильный покой на 100). -->
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="30,5000" value="1" tags="necroNecromancyLvl30"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="60,5000" value="1" tags="necroNecromancyLvl60"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="100,5000" value="1" tags="necroNecromancyLvl100"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="300,5000" value="1" tags="necroNecromancyLvl300"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="500,5000" value="1" tags="necroNecromancyJourneyman"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1400,5000" value="1" tags="necroNecromancyLvl1400"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1700,5000" value="1" tags="necroNecromancyLvl1700"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="2000,5000" value="1" tags="necroNecromancyApprentice"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="3000,5000" value="1" tags="necroNecromancyNecromancer"/>
|
||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="5000,5000" value="1" tags="necroNecromancyMaster"/>
|
||
</effect_group>
|
||
</crafting_skill>
|
||
</append>
|
||
</config>
|