Мод для 7 Days to Die 3.2: навык «Некромантия», растущий от счётчика убитых зомби, тёмное оружие с шестью собственными модами, призывная нежить, пирамида духов и сюжетный финал через Чёрный портал. Локализация на 13 языках. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MaNro5hAGTzcQ7rJNN2tCX
195 lines
16 KiB
XML
195 lines
16 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). -->
|
||
<unlock_entry item="thrownStoneSpirit,necroWpnBladeNecroKnife,thrownStonePortalBlue,necroHeresyPyramid" 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>
|