Files
necromants-tome-7d2d-3-2/Config/recipes.xml
T
AlexCubeandClaude Opus 5 896501dcd8 Откат крови и Кровавая сфера вместо неё
Чинит поломку сейвов, внесённую предыдущим коммитом 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 by e362c62 and replaces the mechanic behind
it with a safe one.

WHAT WAS BROKEN. e362c62 moved 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 against 7172681 and 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 against 7172681: 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
2026-09-15 23:50:37 +03:00

403 lines
28 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<config>
<!-- Tin can water boiling - user request 2026-08-30 ("Вода в консервных банках должна
кипятиться на костре даже если там нету кастрюли... так было сделано в другом моём моде
'Энерголук'" = AC-EnergyBow, the same __NoMods reference the tin can items themselves were
ported from - see items.xml's own comment on tinCanEmpty/tinCanRiverWater/
tinCanBoiledWater).
Root cause this was missing at all: `Extends` copies an item's PROPERTIES, never its
RECIPES - recipes are separate top-level <recipe> nodes matched by name, with no
inheritance mechanism of their own (confirmed by grepping this mod's own recipes.xml -
zero "tinCan" hits before this entry). tinCanRiverWater/tinCanBoiledWater extending
drinkJarRiverWater/drinkJarBoiledWater therefore got NONE of the vanilla mason-jar-boiling
recipe (`<recipe name="drinkJarBoiledWater" craft_area="campfire"
craft_tool="toolCookingPot">`, Data/Config/recipes.xml) - boiling a tin can was never
possible at all until this recipe existed, not merely pot-gated.
No `craft_tool="toolCookingPot"` here BY DESIGN, per the direct request - a metal can can
sit right in a campfire's coals on its own, unlike a mason jar. Confirmed real vanilla
precedent for a pot-less campfire recipe existing at all: `foodBakedPotato`/
`foodCharredMeat` both use craft_area="campfire" with no craft_tool attribute at all - a
campfire recipe is not implicitly pot-gated, craft_tool is an opt-in extra requirement,
not something `craft_area="campfire"` implies on its own. -->
<append xpath="/recipes">
<recipe name="tinCanBoiledWater" count="1" craft_area="campfire">
<ingredient name="tinCanRiverWater" count="1"/>
</recipe>
</append>
<!-- "Камень духов" (Spirit Stone): craftable from the start, no perk/skill gate -
packMuleCrafting is a weight-while-crafting tag, not a gate (see vanilla
campfire/candle recipes for the same pattern). Per BACKLOG.md item 1: 1 rock +
20 grass fiber (resourceRockSmall doubles as both the crafted item's own mesh/icon
source and its craft ingredient here, same as vanilla's own resourceRockSmallBundle). -->
<append xpath="/recipes">
<!-- resourceZombieAsh added 2026-08-29 (BACKLOG.md item 8) - count is a guess, not
specified by the user, kept modest like the rest of this recipe's ingredients. -->
<!-- resourceZombieAsh REMOVED 2026-08-31, direct user correction: this is the starter
weapon, craftable before the player has the Knife at all - same circular-dependency
problem items.xml's own resourceZombieAsh comment already flags and deliberately avoids
for the Knife's own recipe ("the knife has to stay craftable from scratch, and ash only
exists because the knife already tagged a zombie as a Victim"). Ash got added here
anyway during the 2026-08-29 item-8 blanket rollout ("becomes a crafting ingredient
across the other necromancy recipes") without checking this one against that same rule
- missed it then, fixed now. Back to the original 2026-08-28 recipe (1 rock + 20
fibers, BACKLOG.md item 1), nothing else changed. -->
<recipe name="thrownStoneSpirit" count="1" tags="packMuleCrafting">
<ingredient name="resourceRockSmall" count="1"/>
<ingredient name="resourceYuccaFibers" count="20"/>
</recipe>
</append>
<!-- Two portal stones, BACKLOG.md item 6. Blue: no gate, simple early recipe by analogy with
the Spirit Stone (per that backlog note) - not specified exactly by the user. Black:
necroNecromancyMaster (level 5000, the existing "Мастер" tier, group 5) per direct
instruction. Both carry resourceZombieAsh like the other necromancy recipes
(BACKLOG.md item 8). -->
<append xpath="/recipes">
<!-- resourceZombieAsh bumped 5 -> 150, direct user correction 2026-08-31: unlike the Spirit
Stone (removed entirely, see that fix above), the Blue Portal Stone is NOT a starter
weapon - "он не является начальным оружием... больше про комфорт" - so the same
circular-dependency concern doesn't apply, and the user wants it to actually cost a
real chunk of ash rather than a token amount. -->
<recipe name="thrownStonePortalBlue" count="1" tags="packMuleCrafting">
<ingredient name="resourceRockSmall" count="1"/>
<ingredient name="drinkJarPureMineralWater" count="3"/>
<ingredient name="resourceYuccaFibers" count="15"/>
<ingredient name="resourceZombieAsh" count="150"/>
</recipe>
</append>
<!-- resourceNecromancerBlood x10 added 2026-08-30, direct instruction ("10 крови некроманта
нужно будет для рецепта чёрного портала"). ADDITIVE to the existing medicalBloodBag
ingredient, not a replacement - the user said "также" (also/additionally), not "instead
of"; the plain blood bag stays as the mundane-blood component, Necromancer's Blood as the
new, harder-to-get one. Say if this should replace medicalBloodBag instead. -->
<append xpath="/recipes">
<recipe name="thrownStonePortalBlack" count="1" tags="learnable,packMuleCrafting,necroNecromancyMaster">
<ingredient name="resourceRockSmall" count="1"/>
<ingredient name="medicalBloodBag" count="5"/>
<ingredient name="resourceNecromancerBlood" count="10"/>
<ingredient name="casinoCoin" count="20"/>
<ingredient name="resourceYuccaFibers" count="15"/>
<ingredient name="resourceZombieAsh" count="20"/>
</recipe>
</append>
<!-- "Кровь некроманта" (Necromancer's Blood): dictated 2026-08-30, see items.xml for the item
itself and HarmonySrc/NecromancerBloodPatch.cs for the knife-requirement/HP-cost mechanic
this recipe alone can't express. No level gate given by the user and none applied - same
"base" tier as the jar it's made from being a mundane always-available item; the real
gate on this ritual is the HP cost + knife requirement, not a skill level. drinkJarEmpty
confirmed as the real vanilla empty-jar item (Data/Config/items.xml) - not invented. -->
<append xpath="/recipes">
<recipe name="resourceNecromancerBlood" count="1" tags="packMuleCrafting">
<ingredient name="drinkJarEmpty" count="1"/>
</recipe>
</append>
<!-- "Пирамида Ереси" (Pyramid of Heresy): user request 2026-08-31, see blocks.xml/
HarmonySrc/PyramidWardPatch.cs for the block itself. "Рецепт доступен сразу" - no
"learnable" tag and no gate beyond necroNecromancyAdept (Group 1 "Адепт", unlocked from
level 1 - see progression.xml's own comment: a recipe with no unlock tag at all is already
always-available, the tag here is added anyway purely so the intent ("this is a Tier-1,
immediately-available necromancy recipe") is visible directly in this file, matching how
braceletSpatialVault documents itself with necroNecromancyLvl20 below rather than staying
unmarked). craft_area="workbench" (unlike the hand-craftable Knife/Spirit Stone) - this is
a heavy placeable structure, not a pocket item, matching braceletSpatialVault's own
workbench gate.
INGREDIENTS: resourceZombieAsh(1200)/resourceRockSmall/resourceYuccaFibers dictated
directly by the user ("прах зомби, камень, трава"). The rest chosen to fit a "necromantic
iron pylon" ("остальные ингредиенты добавь сам исходя из контекста"):
- resourceScrapIron: the block's own structural frame (real vanilla resource, matches
its own Destroy-drop in blocks.xml).
- resourceNecromancerBlood: the mod's existing magic-binding reagent (see above) - ties
the ward's charm magic to the same "blood" reagent already used elsewhere in this
mod's necromancy recipes, kept to a small count (3) since it costs the player 90% of
their current HP per unit to make (NecromancerBloodPatch.cs) - this recipe shouldn't
demand many. -->
<append xpath="/recipes">
<recipe name="necroHeresyPyramid" count="1" craft_area="workbench" tags="workbenchCrafting,necroNecromancyAdept">
<ingredient name="resourceZombieAsh" count="1200"/>
<ingredient name="resourceRockSmall" count="300"/>
<ingredient name="resourceYuccaFibers" count="200"/>
<ingredient name="resourceScrapIron" count="300"/>
<ingredient name="resourceNecromancerBlood" count="3"/>
</recipe>
</append>
<!-- "Гримуар девиации" (Grimoire of Deviation): BACKLOG.md item 2. Gated at
necroNecromancyJourneyman - group 2 "Подмастерье" (level 500), one of the 5 real skill
tiers (see progression.xml; REDISTRIBUTED 2026-08-30, was a one-off level-50 tag before -
direct user correction, "уровень скилла ты распределил идиотски"). -->
<append xpath="/recipes">
<recipe name="thrownBookGrimoireDeviation" count="1" tags="learnable,packMuleCrafting,necroNecromancyJourneyman">
<ingredient name="resourcePaper" count="20"/>
<ingredient name="resourceGlue" count="2"/>
<ingredient name="resourceCoal" count="5"/>
<ingredient name="resourceWood" count="10"/>
<ingredient name="resourceYuccaFibers" count="10"/>
<ingredient name="resourceZombieAsh" count="5"/>
</recipe>
</append>
<!-- "Призыв зомбособаки" (Summon Zombie Dog): BACKLOG.md item 3. Gated at
necroNecromancyApprentice - group 3 "Ученик" (level 2000), one of the 5 real skill tiers
(see progression.xml; REDISTRIBUTED 2026-08-30, was a one-off level-200 tag before -
direct user correction, "уровень скилла ты распределил идиотски"). Per user request,
crafted at a workbench specifically (craft_area="workbench"), same as advanced-tier weapons
(e.g. vanilla gunHandgunT3SMG5) - NOT available from the player's own personal crafting
menu like the Spirit Stone/Grimoire above (those have no craft_area, so default to
personal crafting). workbenchCrafting is just the same UI-categorization tag vanilla's
own workbench recipes carry alongside craft_area, not a separate gate. -->
<append xpath="/recipes">
<recipe name="bookSummonZombieDog" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyApprentice">
<ingredient name="foodRottingFlesh" count="50"/>
<ingredient name="medicalBloodBag" count="3"/>
<ingredient name="drinkJarBoiledWater" count="4"/>
<ingredient name="resourceYuccaFibers" count="50"/>
<ingredient name="resourceCloth" count="3"/>
<ingredient name="resourceLeather" count="10"/>
<ingredient name="resourceBone" count="40"/>
<ingredient name="casinoCoin" count="5"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<!-- "Жуки Властелина": user request 2026-08-28. Personal crafting (no craft_area) - unlike the
Dog, unconfirmed whether this should be workbench-gated too; see items.xml. Same
necroNecromancyApprentice gate as the Dog - group 3 "Ученик" (level 2000, see
progression.xml; REDISTRIBUTED 2026-08-30 like the others above). Ingredients per
explicit user instruction: 1 resourceQueenBee ("одна пчеломатка") is required; the rest
("сам додумай, но без фанатизма") is a modest hive/bait theme (honey to draw and bind the
swarm, wood for a hive, fiber to hold it together) - kept deliberately small, no rare
currency/high counts like the Dog's recipe. -->
<append xpath="/recipes">
<recipe name="bookSummonInsectSwarm" count="1" tags="learnable,necroNecromancyApprentice">
<ingredient name="resourceQueenBee" count="1"/>
<ingredient name="foodHoney" count="20"/>
<ingredient name="resourceWood" count="10"/>
<ingredient name="resourceYuccaFibers" count="15"/>
<ingredient name="resourceZombieAsh" count="5"/>
</recipe>
</append>
<!-- "Книга банши" (Banshee's Book): BACKLOG.md item 7. Gated at necroNecromancyNecromancer -
group 4 "Некромант" (level 3000), alongside Bear/Wolf (see progression.xml;
REDISTRIBUTED 2026-08-30, was necroNecromancyLvl200 before) - not specified by the user,
guessed consistent with the other "advanced ritual" summon items. -->
<append xpath="/recipes">
<recipe name="bookBanshee" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyNecromancer">
<ingredient name="resourcePaper" count="15"/>
<ingredient name="resourceGlue" count="3"/>
<ingredient name="foodRottingFlesh" count="10"/>
<ingredient name="resourceYuccaFibers" count="15"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<!-- "Нож некроманта" (Necromancer's Knife): BACKLOG.md item 5, user request 2026-08-28.
No recipe/gate specified beyond the item's own mechanics - guessed modest and available
from the start (personal crafting, no craft_area, no level tag), same tier as the Spirit
Stone, since its real power comes from playing the necromancer build over time (damage
scales with kill count), not an expensive unlock. Say if this should change.
resourceZombieAsh (BACKLOG.md item 8) deliberately NOT added here, unlike the other
necromancy recipes - per explicit user instruction 2026-08-29: ash only drops from
zombies the knife itself has already marked as "Жертва", so requiring ash to craft the
knife would make the knife uncraftable from a fresh start (circular dependency).
medicalBloodBag SWAPPED for resourceNecromancerBlood 2026-08-30, direct instruction
("для ножа некроманта пусть используется кровь некроманта"). NOT a circular dependency
like the ash case above, even though this item needs a knife to craft (see
NecromancerBloodPatch.cs) - resourceNecromancerBlood's own requirement is "ANY knife"
(ItemClass.DisplayType == "meleeKnife"), which vanilla's own starting/craftable knives
(e.g. the plain bone knife) already satisfy - it does NOT require this specific
necroWpnBladeNecroKnife to already exist. Count kept at 1, same as the medicalBloodBag it
replaces - not inflated further, since the blood itself is now a genuinely costly
ingredient (90% current HP + a knife + a jar per unit). -->
<append xpath="/recipes">
<recipe name="necroWpnBladeNecroKnife" count="1" tags="packMuleCrafting">
<ingredient name="resourceBone" count="5"/>
<ingredient name="resourceNecromancerBlood" count="1"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
</append>
<!-- Three more summon-book recipes, BACKLOG.md item 4a. REPLACED 2026-08-29 - Griffin/Bear/
Wolf instead of Stripper/Cop/Soldier (see entityclasses.xml). Same workbench shape as the
Dog's own recipe; Griffin shares the Dog's gate (necroNecromancyApprentice, group 3
"Ученик", level 2000), Bear/Wolf are one tier higher (necroNecromancyNecromancer, group 4
"Некромант", level 3000, alongside the Banshee) - split REDISTRIBUTED 2026-08-30 across
the real 5 skill tiers instead of one shared one-off level-200 tag (see progression.xml).
Ingredient lists are a themed guess per creature (not specified by the user) -
resourceFeather/foodRawMeat both verified to exist in vanilla items.xml before use, same
lesson as the earlier wrong guesses. -->
<append xpath="/recipes">
<recipe name="bookSummonZombieGriffin" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyApprentice">
<ingredient name="resourceFeather" count="30"/>
<ingredient name="resourceBone" count="20"/>
<ingredient name="casinoCoin" count="5"/>
<ingredient name="resourceYuccaFibers" count="20"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<append xpath="/recipes">
<recipe name="bookSummonZombieBear" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyNecromancer">
<ingredient name="resourceLeather" count="20"/>
<ingredient name="foodRawMeat" count="10"/>
<ingredient name="resourceBone" count="20"/>
<ingredient name="resourceYuccaFibers" count="20"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<append xpath="/recipes">
<recipe name="bookSummonZombieWolf" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyNecromancer">
<ingredient name="resourceLeather" count="15"/>
<ingredient name="foodRawMeat" count="10"/>
<ingredient name="resourceBone" count="15"/>
<ingredient name="resourceYuccaFibers" count="20"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<!-- "Петля вора" (Thief's Loop) recipe REMOVED 2026-08-30 along with the item itself - see
items.xml for why. -->
<!-- "Пространственный браслет" (Spatial Bracelet) - gate moved 2026-08-30 from
necroNecromancyLvl200 to necroNecromancyLvl20 per direct instruction ("нож, камень духов
и хранилище - это база... хранилище, когда убито минимум 20 зомби"). craft_area/workbench
left as-is (not specified either way) - still an "advanced" build, just unlocked much
earlier than before. -->
<append xpath="/recipes">
<recipe name="braceletSpatialVault" count="1" craft_area="workbench" tags="learnable,workbenchCrafting,necroNecromancyLvl20">
<ingredient name="resourceLeather" count="10"/>
<ingredient name="resourceMechanicalParts" count="5"/>
<ingredient name="resourceScrapIron" count="10"/>
<ingredient name="resourceYuccaFibers" count="15"/>
<ingredient name="resourceZombieAsh" count="10"/>
</recipe>
</append>
<!-- СТУПЕНЧАТАЯ РАЗБЛОКИРОВКА МОДОВ НОЖА. Изначально (2026-09-07) продиктовано: "механика
скиллов даёт возможность сделать их доступными не сразу, а по мере набора количества
убитых зомби. Т.е. грейд открылся, а рецепт ещё нет, на нём замочек. Еда/вода должны
открываться на грейде сразу. Чутьё чуть позже, хватка ещё позже. Но всё в рамках грейда."
ПЕРЕСТАВЛЕНО 2026-09-09 - прямая правка баланса от пользователя: "Питьё важно в тот же
день. Оно должно быть доступно после 30 убитых зомби. Еда - 60. Это самые важные для
начала выживания модификации. Модификация на покой - 100 зомби. Модификацию на тёмное
чутьё я бы сделал доступной после 300 убитых зомби. Дальше уже не так принципиально."
ЧТО БЫЛО НЕ ТАК. Первая раскладка держала все шесть модов внутри группы 2, то есть в
диапазоне 500-1700 убийств. Ошибка не в коде (тег рецепта, RecipeTagUnlocked и
unlock_tier сходились по всем шести), а в балансе: вода и еда нужны в ПЕРВЫЕ ДНИ, а к
500 убийствам у игрока уже есть ферма, костёр, банки и фильтр - мод, дающий +2 воды с
трупа, к этому моменту бесполезен. Теперь порог у мода стоит там, где мод реально нужен,
а не там, где он "по силе" смотрится ровно.
Итоговая раскладка:
30 - Слёзы мертвеца (вода) группа 1 "Адепт"
60 - Пир падальщика (еда) группа 1
100 - Могильный покой (тепло/холод) группа 1
300 - Тёмное чутьё (радар) группа 1
1400 - Хватка мертвеца (замедление) группа 2 "Подмастерье"
1700 - Мёртвая буря (силовая) группа 2
Первые четыре - выживание и информация, они переехали в группу 1 к самому ножу (он там и
доступен с уровня 1). Последние два - чистый бой, остались в группе 2 на прежних порогах:
пользователь про них сказал "дальше уже не так принципиально".
Двигать - тройка "тег в рецепте + RecipeTagUnlocked в progression.xml + unlock_tier в
display_entry", все три должны совпадать, иначе замок на панели соврёт. -->
<!-- Модификации Ножа некроманта (см. Config/item_modifiers.xml), 2026-09-07. Пользователь
выбрал получение через "Крафт по скиллу Некромантии", поэтому все три идут обычными
рецептами с тегом группы, а не через лут.
Пороги у каждого свои, см. комментарий выше - изначально все шесть сидели в группе 2
("Подмастерье", 500 убийств), но 2026-09-09 четыре из них уехали в группу 1 к самому
ножу. Распределение остальных тиров скилла эта правка не трогает - его пользователь уже
правил вручную (см. progression.xml).
Ингредиенты - только из уже существующих ресурсов мода плюс ванильная база, как и просил
("Ингредиенты из уже существующих ресурсов мода"). Прах зомби и Кожа жертвы обе падают
из мешка "Жертва", то есть добываются этим же ножом - моды для ножа делаются из того, что
нож добыл. Крафт личный (без craft_area), как у Камня духов и самого ножа: моды дешевле
призывов и не должны требовать верстак. Тег learnable, как у остальных гейтованных
рецептов мода, чтобы рецепт не светился в меню до открытия группы. -->
<append xpath="/recipes">
<recipe name="necroModKnifeTearsOfTheDead" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl30">
<ingredient name="resourceZombieAsh" count="10"/>
<ingredient name="resourceVictimSkin" count="1"/>
<ingredient name="drinkJarEmpty" count="2"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
<recipe name="necroModKnifeScavengersFeast" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl60">
<ingredient name="resourceZombieAsh" count="10"/>
<ingredient name="resourceVictimSkin" count="1"/>
<ingredient name="foodRawMeat" count="5"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
<recipe name="necroModKnifeDeadMansGrip" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl1400">
<ingredient name="resourceZombieAsh" count="10"/>
<ingredient name="resourceBone" count="15"/>
<ingredient name="resourceNecromancerBlood" count="1"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
<!-- "Могильный покой" (термозащита), добавлен 2026-09-07, порог 100 с 2026-09-09. Тот же
личный крафт, что у остальных модов ножа. Кожа жертвы тут не косметика: мод по смыслу - обмотка
рукояти, поэтому её взято 2 (больше всех), плюс перо как утеплитель - ванильный
resourceFeather, существование проверено. -->
<recipe name="necroModKnifeGravesRepose" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl100">
<ingredient name="resourceZombieAsh" count="10"/>
<ingredient name="resourceVictimSkin" count="2"/>
<ingredient name="resourceFeather" count="10"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
<!-- "Мёртвая буря" (переделка силовой атаки), 2026-09-07. Единственный мод ножа с
электрическими деталями в рецепте - искрение берётся из ванильного buffShocked, того
же, что у электродубинки, так что ингредиент тематически честный. Существование
resourceElectricParts проверено. -->
<!-- "Тёмное чутьё" (радар зомби), 2026-09-07. Глаз мертвеца как линза - отсюда кожа
жертвы и прах. Стекло взято resourceBrokenGlass (обычный лут), а НЕ resourceScopeLens:
та линза крафтится только в кузне и под перком perkAdvancedEngineering, то есть
утащила бы рецепт ножа в зависимость от чужой ветки прокачки. resourceGlass, которое
напрашивалось по названию, в игре не существует вовсе - проверено. -->
<recipe name="necroModKnifeDarkSense" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl300">
<ingredient name="resourceZombieAsh" count="15"/>
<ingredient name="resourceVictimSkin" count="1"/>
<ingredient name="resourceBrokenGlass" count="10"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
<recipe name="necroModKnifeDeadStorm" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl1700">
<ingredient name="resourceZombieAsh" count="15"/>
<ingredient name="resourceElectricParts" count="5"/>
<ingredient name="resourceNecromancerBlood" count="1"/>
<ingredient name="resourceYuccaFibers" count="10"/>
</recipe>
</append>
<!-- Кровавая сфера, продиктовано 2026-09-15: «Станки не нужны. Ингридиенты: Кровь некроманта,
5 праха зомби. По одному рецепту изготавливается две сферы.»
Ни craft_area, ни тега разблокировки: «первый грейд» - это группа 1 «Адепт», а она открыта
с уровня 1, и рецепт БЕЗ тега просто доступен всегда. Ровно так же сделан Камень духов
выше в этом файле - см. комментарий в progression.xml, там это правило записано словами.
В скиллах сфера показана отдельной строкой группы 1 с unlock_tier="1".
ЗАМЕЧЕНО, НЕ ИСПРАВЛЕНО: сам Пространственный браслет открывается на 20 убийствах
(unlock_tier="2" в группе 1), то есть сферу можно скрафтить на 19 уровней раньше, чем
появится предмет, в который её вставляют. По записанному правилу «пороги - по нужде, а не
по силе» ей место рядом с браслетом. Оставлено как продиктовано; переезд - это unlock_tier
с 1 на 2 в progression.xml плюс тег necroNecromancyLvl20 сюда.
Цена реальная, а не по списку: одна кровь некроманта стоит ещё и 90% текущего ХП на её
собственный крафт (NecromancerBloodPatch.cs). Две сферы за один заход это и учитывают. -->
<append xpath="/recipes">
<recipe name="resourceBloodSphere" count="2" tags="packMuleCrafting">
<ingredient name="resourceNecromancerBlood" count="1"/>
<ingredient name="resourceZombieAsh" count="5"/>
</recipe>
</append>
</config>