Чинит поломку сейвов, внесённую предыдущим коммитом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
403 lines
28 KiB
XML
403 lines
28 KiB
XML
<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>
|