From e362c627e761457d75e6e2fc49cc9145bbe439cd Mon Sep 17 00:00:00 2001 From: AlexCube Date: Tue, 15 Sep 2026 22:32:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9A=D1=80=D0=BE=D0=B2=D1=8C=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BA=D1=80=D0=BE=D0=BC=D0=B0=D0=BD=D1=82=D0=B0=20-=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BF=D0=BB=D0=B8=D0=B2=D0=BE=20=D0=9F=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D1=82=D1=80=D0=B0=D0=BD=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B1=D1=80=D0=B0=D1=81=D0=BB=D0=B5=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Шесть указаний одного захода, которые сложились в одну механику: поглощение блока больше не бесплатно. Браслет требует модификацию в слоте, кровь ею стала, и она на это тратится. СТАК ПО ОДНОЙ БАНКЕ. Наследуемый medicalBloodBag даёт Stacknumber 15, и это надо перебивать явно - Extends копирует свойство целиком, а не "если не задано иначе". Дорого и так задумано: Чёрный портал просит десять банок, то есть десять ячеек. ПРОЧНОСТЬ 1000. Свойства с именем вроде Durability в игре нет; ручек две, и обе обязательны. Число - пассивный эффект DegradationMax (ItemValue.MaxUseTimesBase -> EffectManager.GetValue), полоска - отдельное свойство ShowQuality (XUiC_ItemStack.ShowDurability -> ItemClass.ShowQualityBar). Без первой прочность равна нулю, а полоска при MaxUseTimes == 0 рисуется ПОЛНОЙ, то есть забытый эффект выглядит как "всё работает". tiered="false" обязателен: ItemClass.HasQuality читается как Effects.IsOwnerTiered(), и тированная группа превратила бы банку в предмет с качеством, с тирами и рамкой. КРОВЬ ПЕРЕЕХАЛА В item_modifiers.xml. Это не настройка, а смена класса предмета: XUiC_ItemPartStack.CanSwap открывается строкой `if (!(stack.itemValue.ItemClass is ItemClassModifier ...)) return false;` - слот модификации не смотрит ни на теги, ни на свойства, пока предмет не ItemClassModifier, а этот класс создаётся только из . Свойства вида CanBeInstalled не существует; остаться ресурсом в items.xml и вставляться в браслет физически нельзя. На старом месте оставлен комментарий-указатель. Что при этом проверено, а не понадеялось: рецепты резолвятся (ItemClassModifier наследует ItemClass, имена лежат в общем ItemClass.nameToItem, Recipe ищет через GetItemClass по тому же словарю); сейв цел (ItemClass.assignIdsFromMapping берёт айди из сохранённого name->id мэппинга, перестановка в конфигах предмет не подменит); Harmony-патч и ключи локализации ходят по имени, имя не менялось. ЛОВУШКА ПЕРЕЕЗДА: у модификации effect_group применяется к предмету, В КОТОРЫЙ её вставили - прочность 1000 начала бы выдаваться БРАСЛЕТУ. Пассивка гейтована tags="necroBloodFlask", тег добавлен в Tags флакона: MaxUseTimesBase зовёт GetValue с ItemTags того предмета, для которого считает. СЛОТОВ У БРАСЛЕТА 1, было 4. Слот из набора улучшений стал выбором. ПУСТОЙ СЛОТ ОТКАЗЫВАЕТ. Проверка стоит первой строкой Begin, впереди всех остальных отказов: прочие про ЦЕЛЬ (нет блока, не тот блок, хранилище полно), эта про ИНСТРУМЕНТ, и сказать "здесь нет блока", когда пуст браслет, значит отправить игрока искать не там. Тест - ItemValue.HasMods(), игровой собственный: обходит только Modifications, пропуская null и IsEmpty, и не считает CosmeticMods, иначе краска читалась бы как "браслет заряжен". Звук отказа достался бесплатно - Deny() в этом файле уже играет ванильный ui_denied. РАСХОД. Цена пула считается ОДИН раз, при старте, и едет в PickupJob.ChannelSeconds вместе с самим браслетом. Не потому, что так короче: ChannelSecondsFor меряет луч игрока, а за десять секунд игрок успевает отвернуться - второй вызов насчитал бы цену за другой блок, а не за тот, который забрали. Браслет хранится экземпляром по той же причине: моды живут на ItemValue, а колесо прокручивается. Списывается в SpendBlood, ПОСЛЕ SetBlockRPC и после того, как предмет лёг в хранилище: все отказы выходят раньше через return, так что кровь за отменённое поглощение невозможна по построению. Имя предмета берётся из NecromancerBloodPatch.BloodItemName, а не вторым литералом, чтобы не разъехались. Мод, который не кровь, не платит ничего и поглощению не мешает - слот задуман под другие вещи. КОНЧИЛАСЬ - РАЗБИВАЕТСЯ. Правило именно "прочность 0 или меньше", а не "не хватило на пул", и разница не косметическая: по второй формулировке флакон, которому хватило впритык, остался бы в слоте с нулём, HasMods() видел бы "что-то вставлено", и браслет работал бы бесплатно до конца света. Поэтому зажим по MaxUseTimes убран, а слот обнуляется через ItemValue.None - это type 0, ровно то, что проверяет IsEmpty(). Последнее поглощение проходит всегда, флакон его просто не переживает. Звук - ванильный itembreak, тот же, что играет ItemAction.HandleItemBreak. Защита: если MaxUseTimes окажется 0 (снесли passive_effect или тег), флакон НЕ удаляется, а в лог идёт предупреждение с указанием, где чинить. Без этой ветки ошибка в XML съедала бы игроку предмет на первом же поглощении, и выглядело бы это багом механики. Локализация: новый ключ braceletSpatialVaultNoMod в 13 языках, плюс описания флакона и браслета - механика стала условной и платной, и оба текста без этого стали бы враньём. Известное и намеренное: кровавого камня, который обещает сообщение о пустом слоте, ещё нет - он запланирован, разбор в BACKLOG.md. В игре ничего из этого не проверено. --- Necromancer's Blood is the Spatial Bracelet's fuel Six instructions from one session that add up to one mechanic: pulling a block into the vault is no longer free. The bracelet needs a mod in its slot, the blood became that mod, and it is spent doing the work. ONE JAR PER STACK. The inherited medicalBloodBag sets Stacknumber 15 and it has to be overridden explicitly - Extends copies a property wholesale, not "unless set". Expensive on purpose: the Black Portal asks for ten jars, so ten slots. DURABILITY 1000. There is no property called anything like Durability; there are two knobs and both are required. The number is a DegradationMax passive effect (ItemValue.MaxUseTimesBase -> EffectManager.GetValue); the bar is a separate ShowQuality property (XUiC_ItemStack.ShowDurability -> ItemClass.ShowQualityBar). Without the first, durability is zero - and the bar at MaxUseTimes == 0 draws FULL, so a forgotten effect looks exactly like success. tiered="false" is mandatory: ItemClass.HasQuality is Effects.IsOwnerTiered(), and a tiered group would have turned the jar into a quality item with tiers and a frame. THE BLOOD MOVED TO item_modifiers.xml. Not a setting but a change of item class: XUiC_ItemPartStack.CanSwap opens with `if (!(stack.itemValue.ItemClass is ItemClassModifier ...)) return false;` - a mod slot looks at neither tags nor properties until the item is an ItemClassModifier, and that class is only created from . No CanBeInstalled property exists; staying a resource in items.xml and going into the bracelet is impossible. A pointer comment was left where it used to live. Checked rather than hoped: recipes still resolve (ItemClassModifier extends ItemClass, names live in the shared ItemClass.nameToItem, Recipe looks them up through GetItemClass); saves are safe (ItemClass.assignIdsFromMapping takes ids from the stored name->id mapping, so shuffling configs cannot swap the item); the Harmony patch and the localization keys go by name, and the name did not change. THE TRAP IN MOVING IT: a modifier's effect_group applies to the item it is INSTALLED IN - the 1000 durability would have been granted to the BRACELET. The passive is gated with tags="necroBloodFlask" and the tag added to the flask's own Tags: MaxUseTimesBase calls GetValue with the ItemTags of whatever it is computing for. THE BRACELET HAS 1 MOD SLOT, down from 4. The slot stopped being a set of upgrades and became a choice. AN EMPTY SLOT REFUSES. The check is the first line of Begin, ahead of every other refusal: the others are about the TARGET (no block, wrong block, vault full), this one is about the TOOL, and saying "no block there" when the real problem is an empty bracelet sends the player looking in the wrong place. The test is ItemValue.HasMods(), the game's own: it walks Modifications only, skipping nulls and IsEmpty, and does not count CosmeticMods - a dye would otherwise have read as "loaded". The refusal sound came free: Deny() in this file already plays vanilla's ui_denied. THE COST. The price of a pull is computed ONCE, at the start, and carried in PickupJob.ChannelSeconds along with the bracelet itself. Not for brevity: ChannelSecondsFor measures the player's ray, and ten seconds is long enough to turn away - a second call would charge for a different block than the one taken. The bracelet is kept as an instance for the same reason: mods live on the ItemValue and the hotbar scrolls. It is charged in SpendBlood, AFTER SetBlockRPC and after the item is in the vault: every refusal returns earlier, so blood charged for a cancelled pull is impossible by construction. The item name comes from NecromancerBloodPatch.BloodItemName rather than a second literal, so the two cannot drift. A mod that is not blood pays nothing and does not block the pull - the slot is meant for other things. RUNS OUT, SHATTERS. The rule is "durability 0 or less", not "could not cover the pull", and the difference is not cosmetic: under the second wording a flask with exactly enough left would sit in the slot at zero, HasMods() would see "something installed", and the bracelet would work for free forever. So the MaxUseTimes clamp is gone and the slot is cleared with ItemValue.None - type 0, exactly what IsEmpty() tests. The last pull always completes; the flask simply does not survive it. The sound is vanilla's itembreak, the same cue ItemAction.HandleItemBreak plays. A guard: if MaxUseTimes comes out 0 (the passive effect or the tag removed), the flask is NOT deleted and a warning naming the fix goes to the log. Without that branch a config error would eat the player's item on the first pull and look like a bug in the mechanic. Localization: a new braceletSpatialVaultNoMod key in 13 languages, plus the flask and bracelet descriptions - the mechanic became conditional and paid, and both texts would have been lies without it. Known and deliberate: the Blood Stone the empty-slot message promises does not exist yet - it is planned, written up in BACKLOG.md. None of this is tested in game. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MnwP2Dt1vk8bUPJ452EoVL --- Config/Localization.csv | 5 +- Config/item_modifiers.xml | 118 ++++++++++++++++++ Config/items.xml | 109 ++++++---------- HarmonySrc/NecromancerBloodPatch.cs | 8 +- HarmonySrc/SpatialVaultPatch.cs | 4 +- HarmonySrc/SpatialVaultPickupPatch.cs | 172 +++++++++++++++++++++++++- NecromancerHarmony.dll | Bin 90624 -> 92160 bytes NecromancerHarmony.pdb | Bin 28980 -> 29272 bytes 8 files changed, 336 insertions(+), 80 deletions(-) diff --git a/Config/Localization.csv b/Config/Localization.csv index 6096762..bf13695 100644 --- a/Config/Localization.csv +++ b/Config/Localization.csv @@ -37,7 +37,7 @@ resourceVictimSkinDesc,items,Item,,,,Skin taken from a zombie marked as a Victim resourceZombieAsh,items,Item,,,,Zombie Ash,,Zombieasche,Ceniza de zombi,Cendre de zombie,Cenere di zombie,ゾンビの灰,좀비의 재,Popiół zombie,Cinza de zumbi,Прах зомби,Zombi Külü,僵尸灰烬,殭屍灰燼 resourceZombieAshDesc,items,Item,,,,Ash left over from a zombie marked as a Victim by the Necromancer's Knife. An ingredient in most necromantic recipes.,,"Asche, die von einem Zombie übrig blieb, den das Messer des Nekromanten als Opfer markiert hat. Zutat der meisten nekromantischen Rezepte.",Ceniza que queda de un zombi marcado como Víctima por el Cuchillo del nigromante. Ingrediente de la mayoría de las recetas nigrománticas.,Cendre laissée par un zombie marqué comme Victime par le Couteau du nécromancien. Ingrédient de la plupart des recettes nécromantiques.,Cenere rimasta da uno zombie marchiato come Vittima dal Coltello del negromante. Ingrediente della maggior parte delle ricette negromantiche.,ネクロマンサーのナイフに「犠牲者」として刻まれたゾンビの残した灰。ほとんどの降霊術レシピの材料。,강령술사의 단검이 '희생자'로 표시한 좀비가 남긴 재. 대부분의 강령술 제작법에 들어가는 재료입니다.,Popiół pozostały po zombie oznaczonym jako Ofiara przez Nóż nekromanty. Składnik większości nekromanckich receptur.,Cinza deixada por um zumbi marcado como Vítima pela Faca do necromante. Ingrediente da maioria das receitas necromânticas.,"Прах, оставшийся от зомби, помеченного Ножом некроманта как Жертва. Ингредиент большинства некромантских рецептов.",Nekromantın Bıçağı tarafından Kurban olarak işaretlenmiş bir zombiden geriye kalan kül. Nekromansi tariflerinin çoğunda kullanılır.,被亡灵法师之刃标记为「祭品」的僵尸所留下的灰烬。多数亡灵配方的材料。,被亡靈法師之刃標記為「祭品」的殭屍所留下的灰燼。多數亡靈配方的材料。 resourceNecromancerBlood,items,Item,,,,Necromancer's Blood,,Blut des Nekromanten,Sangre del nigromante,Sang du nécromancien,Sangue del negromante,ネクロマンサーの血,강령술사의 피,Krew nekromanty,Sangue do necromante,Кровь некроманта,Nekromantın Kanı,亡灵法师之血,亡靈法師之血 -resourceNecromancerBloodDesc,items,Item,,,,"A jar filled with the necromancer's own blood, drawn during a ritual requiring a knife. An ingredient for the darkest necromantic rites.",,"Ein Glas, gefüllt mit dem eigenen Blut des Nekromanten, in einem Ritual abgezapft, für das ein Messer nötig ist. Zutat für die finstersten nekromantischen Riten.","Un tarro lleno de la propia sangre del nigromante, extraída en un ritual que requiere un cuchillo. Ingrediente para los ritos nigrománticos más oscuros.","Un bocal rempli du sang même du nécromancien, tiré lors d'un rituel qui exige un couteau. Ingrédient des rites nécromantiques les plus sombres.","Un barattolo pieno del sangue stesso del negromante, prelevato in un rituale che richiede un coltello. Ingrediente dei riti negromantici più oscuri.",儀式によって抜かれた、ネクロマンサー自身の血で満たされた瓶。儀式にはナイフが要る。最も暗い降霊術の儀式の材料。,"칼이 필요한 의식으로 뽑아낸, 강령술사 자신의 피가 담긴 병. 가장 어두운 강령술 의식의 재료입니다.","Słoik wypełniony własną krwią nekromanty, utoczoną w rytuale wymagającym noża. Składnik najmroczniejszych nekromanckich obrzędów.","Um pote cheio do próprio sangue do necromante, extraído num ritual que exige uma faca. Ingrediente dos ritos necromânticos mais sombrios.","Банка, наполненная кровью самого некроманта, взятой во время ритуала, для которого нужен нож. Ингредиент для самых тёмных некромантских ритуалов.","Bir bıçak gerektiren bir ritüelde alınmış, nekromantın kendi kanıyla dolu bir kavanoz. En karanlık nekromansi ayinlerinin malzemesi.",一罐盛满亡灵法师自身鲜血的容器,取自一场需要刀刃的仪式。最黑暗的亡灵仪式所用的材料。,一罐盛滿亡靈法師自身鮮血的容器,取自一場需要刀刃的儀式。最黑暗的亡靈儀式所用的材料。 +resourceNecromancerBloodDesc,items,Item,,,,"A jar filled with the necromancer's own blood, drawn during a ritual requiring a knife. An ingredient for the darkest necromantic rites. Fits into the Spatial Bracelet.",,"Ein Glas, gefüllt mit dem eigenen Blut des Nekromanten, in einem Ritual abgezapft, für das ein Messer nötig ist. Zutat für die finstersten nekromantischen Riten. Passt in das Raumarmband.","Un tarro lleno de la propia sangre del nigromante, extraída en un ritual que requiere un cuchillo. Ingrediente para los ritos nigrománticos más oscuros. Encaja en el Brazalete espacial.","Un bocal rempli du sang même du nécromancien, tiré lors d'un rituel qui exige un couteau. Ingrédient des rites nécromantiques les plus sombres. S'insère dans le Bracelet spatial.","Un barattolo pieno del sangue stesso del negromante, prelevato in un rituale che richiede un coltello. Ingrediente dei riti negromantici più oscuri. Si inserisce nel Bracciale spaziale.",儀式によって抜かれた、ネクロマンサー自身の血で満たされた瓶。儀式にはナイフが要る。最も暗い降霊術の儀式の材料。「空間の腕輪」に取り付けられる。,"칼이 필요한 의식으로 뽑아낸, 강령술사 자신의 피가 담긴 병. 가장 어두운 강령술 의식의 재료입니다. '공간의 팔찌'에 장착할 수 있습니다.","Słoik wypełniony własną krwią nekromanty, utoczoną w rytuale wymagającym noża. Składnik najmroczniejszych nekromanckich obrzędów. Pasuje do Bransolety przestrzennej.","Um pote cheio do próprio sangue do necromante, extraído num ritual que exige uma faca. Ingrediente dos ritos necromânticos mais sombrios. Encaixa no Bracelete espacial.","Банка, наполненная кровью самого некроманта, взятой во время ритуала, для которого нужен нож. Ингредиент для самых тёмных некромантских ритуалов. Помещается в Пространственный браслет.","Bir bıçak gerektiren bir ritüelde alınmış, nekromantın kendi kanıyla dolu bir kavanoz. En karanlık nekromansi ayinlerinin malzemesi. Uzam Bileziği'ne takılabilir.",一罐盛满亡灵法师自身鲜血的容器,取自一场需要刀刃的仪式。最黑暗的亡灵仪式所用的材料。可装入空间手环。,一罐盛滿亡靈法師自身鮮血的容器,取自一場需要刀刃的儀式。最黑暗的亡靈儀式所用的材料。可裝入空間手環。 resourceNecromancerBloodNeedsKnife,items,Item,,,,You need a knife to perform this ritual,,Für dieses Ritual brauchst du ein Messer,Necesitas un cuchillo para realizar este ritual,Il te faut un couteau pour accomplir ce rituel,Ti serve un coltello per compiere questo rituale,この儀式にはナイフが必要です,이 의식을 치르려면 칼이 필요합니다,Do tego rytuału potrzebujesz noża,Você precisa de uma faca para realizar este ritual,Для этого ритуала нужен нож,Bu ritüeli gerçekleştirmek için bir bıçağa ihtiyacın var,进行此仪式需要一把刀,進行此儀式需要一把刀 bookSummonZombieGriffin,items,Item,,,,Summon Zombie Griffin,,Zombiegreif beschwören,Invocar Grifo Zombi,Invoquer un Griffon Zombie,Evoca Grifone Zombie,ゾンビグリフォン召喚,좀비 그리핀 소환,Przyzwanie: Gryf Zombie,Invocar Grifo Zumbi,Призыв зомбогрифа,Zombi Grifin Çağırma,召唤僵尸狮鹫,召喚殭屍獅鷲 bookSummonZombieGriffinDesc,items,Item,,,,A necromantic tome that raises a zombie griffin bound to your will. It fights alongside you against other zombies until it dies. You can only have one bound at a time. Power attack to recall it back into the book.,,"Ein nekromantisches Buch, das einen Zombiegreifen erweckt, der deinem Willen unterworfen ist. Er kämpft an deiner Seite gegen andere Zombies, bis er stirbt. Du kannst immer nur einen gebunden haben. Mit dem Powerangriff rufst du ihn ins Buch zurück.",Un tomo nigromántico que alza un Grifo Zombi sometido a tu voluntad. Lucha a tu lado contra otros zombis hasta morir. Solo puedes tener uno vinculado a la vez. Usa el ataque potente para devolverlo al libro.,Un ouvrage nécromantique qui relève un Griffon Zombie soumis à ta volonté. Il combat à tes côtés contre les autres zombies jusqu'à sa mort. Tu ne peux en lier qu'un seul à la fois. L'attaque puissante le rappelle dans le livre.,Un tomo negromantico che rialza un Grifone Zombie soggetto alla tua volontà. Combatte al tuo fianco contro gli altri zombie finché non muore. Puoi averne vincolato solo uno alla volta. L'attacco potente lo richiama nel libro.,あなたの意志に縛られたゾンビグリフォンを起こす降霊術の書。死ぬまで、あなたの側で他のゾンビと戦う。同時に縛っておけるのは一体だけ。強攻撃で書物へ呼び戻せる。,당신의 의지에 묶인 좀비 그리핀을(를) 일으키는 강령술 서적. 죽을 때까지 당신 곁에서 다른 좀비와 싸운다. 한 번에 하나만 묶어 둘 수 있다. 강공격으로 책 속에 불러들인다.,"Nekromancki tom, który wskrzesza Gryfa Zombie związanego twoją wolą. Walczy u twojego boku z innymi zombie, aż zginie. Naraz możesz mieć związanego tylko jednego. Atak specjalny odwołuje go z powrotem do księgi.",Um tomo necromântico que ergue um Grifo Zumbi preso à sua vontade. Luta ao seu lado contra outros zumbis até morrer. Você só pode ter um vinculado por vez. O ataque forte o chama de volta para o livro.,"Некромантский фолиант, поднимающий зомбогрифа, подчинённого вашей воле. Он сражается на вашей стороне против других зомби, пока не погибнет. Одновременно можно держать только одного. Силовая атака отзывает его обратно в книгу.",İradene bağlı bir Zombi Grifin dirilten bir nekromansi kitabı. Ölene kadar yanında diğer zombilere karşı savaşır. Aynı anda yalnızca bir tanesini bağlı tutabilirsin. Güçlü saldırı onu kitaba geri çağırır.,一本亡灵法术典籍,唤起一只受你意志束缚的僵尸狮鹫。它会在你身边与其他僵尸战斗,直到死亡。同时只能束缚一只。使用强力攻击可将其召回书中。,一本亡靈法術典籍,喚起一隻受你意志束縛的殭屍獅鷲。牠會在你身邊與其他殭屍戰鬥,直到死亡。同時只能束縛一隻。使用強力攻擊可將其召回書中。 @@ -73,7 +73,7 @@ EntityLootContainerVictim,entityclasses,Entity Info,,,,Victim's Bag,,Beutel des noteDuke01,items,Quest - Note,,,,Note,,Notiz,Nota,Mot,Biglietto,書き置き,쪽지,List,Bilhete,Записка,Not,纸条,紙條 noteDuke01Desc,items,Quest - Note,,,,"You don't deserve death by my hand. You deserve death by a thousand hands. Every seven days, this world will tear you apart - and every time, it will hurt more, terrify more. You will build, only to lose it all. You will hope, only to despair. And when you tire, when you finally break, you will simply cease to be. You will become one of them. And even then, I won't remember your name. Let the dead make you dead. Let death bring you no peace. Let the living forget you forever. Goodbye, mistake.",,"Du verdienst keinen Tod durch meine Hand. Du verdienst den Tod durch tausend Hände. Alle sieben Tage wird diese Welt dich zerreißen – und jedes Mal wird es mehr wehtun, mehr Angst machen. Du wirst bauen, nur um alles zu verlieren. Du wirst hoffen, nur um zu verzweifeln. Und wenn du müde wirst, wenn du endlich zerbrichst, wirst du einfach aufhören zu sein. Du wirst einer von ihnen. Und selbst dann werde ich mich nicht an deinen Namen erinnern. Sollen die Toten dich tot machen. Soll der Tod dir keinen Frieden bringen. Sollen die Lebenden dich für immer vergessen. Leb wohl, Fehler.","No mereces morir a mi mano. Mereces morir a manos de mil. Cada siete días, este mundo te hará pedazos, y cada vez dolerá más y aterrará más. Construirás solo para perderlo todo. Tendrás esperanza solo para desesperar. Y cuando te canses, cuando por fin te quiebres, sencillamente dejarás de existir. Te convertirás en uno de ellos. Y ni siquiera entonces recordaré tu nombre. Que los muertos te hagan morir. Que la muerte no te traiga paz. Que los vivos te olviden para siempre. Adiós, error.","Tu ne mérites pas de mourir de ma main. Tu mérites de mourir de mille mains. Tous les sept jours, ce monde te mettra en pièces – et chaque fois, la douleur sera plus vive, la terreur plus grande. Tu bâtiras pour tout perdre. Tu espéreras pour désespérer. Et quand tu seras las, quand tu finiras par te briser, tu cesseras simplement d'être. Tu deviendras l'un d'eux. Et même alors, je ne me souviendrai pas de ton nom. Que les morts te rendent mort. Que la mort ne t'apporte aucune paix. Que les vivants t'oublient à jamais. Adieu, erreur.","Non meriti di morire per mano mia. Meriti di morire per mille mani. Ogni sette giorni questo mondo ti farà a pezzi, e ogni volta farà più male, spaventerà di più. Costruirai solo per perdere tutto. Spererai solo per disperare. E quando sarai stanco, quando alla fine ti spezzerai, semplicemente cesserai di essere. Diventerai uno di loro. E nemmeno allora ricorderò il tuo nome. Che i morti ti rendano morto. Che la morte non ti porti pace. Che i vivi ti dimentichino per sempre. Addio, errore.",お前は私の手にかかって死ぬに値しない。千の手にかかって死ぬに値する。七日ごとに、この世界はお前を引き裂く。そのたびに痛みは増し、恐怖は深まる。築いては、すべて失う。望んでは、絶望する。そして疲れ果て、ついに折れたとき、お前はただ在ることをやめる。お前は奴らの一人になる。そのときでさえ、私はお前の名を覚えていない。死者にお前を死者たらしめよ。死がお前に安らぎを与えぬように。生者が永久にお前を忘れるように。さらばだ、過ち。,"너는 내 손에 죽을 자격이 없다. 너는 천 개의 손에 죽을 자격이 있다. 이레마다 이 세계가 너를 찢어놓을 것이다. 그리고 그때마다 더 아프고, 더 두려울 것이다. 너는 세울 것이고, 모두 잃을 것이다. 너는 바랄 것이고, 절망할 것이다. 그러다 지치고, 마침내 부러지면, 너는 그저 존재하기를 그친다. 너는 그들 중 하나가 된다. 그때조차 나는 네 이름을 기억하지 못할 것이다. 죽은 자들이 너를 죽게 하리라. 죽음이 네게 안식을 주지 않기를. 산 자들이 너를 영원히 잊기를. 잘 가라, 실수여.","Nie zasługujesz na śmierć z mojej ręki. Zasługujesz na śmierć z tysiąca rąk. Co siedem dni ten świat będzie cię rozdzierał – i za każdym razem będzie bolało bardziej, przerażało bardziej. Będziesz budował, by wszystko stracić. Będziesz miał nadzieję, by rozpaczać. A gdy się zmęczysz, gdy w końcu pękniesz, po prostu przestaniesz być. Staniesz się jednym z nich. I nawet wtedy nie przypomnę sobie twojego imienia. Niech umarli uczynią cię umarłym. Niech śmierć nie przyniesie ci spokoju. Niech żywi zapomną o tobie na zawsze. Żegnaj, pomyłko.","Você não merece morrer pela minha mão. Merece morrer por mil mãos. A cada sete dias, este mundo vai te despedaçar - e a cada vez doerá mais, apavorará mais. Você vai construir, só para perder tudo. Vai esperar, só para se desesperar. E quando se cansar, quando finalmente se quebrar, simplesmente deixará de existir. Você se tornará um deles. E nem mesmo então eu lembrarei o seu nome. Que os mortos te façam morto. Que a morte não te traga paz. Que os vivos te esqueçam para sempre. Adeus, erro.","Ты не заслуживаешь смерти от моей руки. Ты заслуживаешь смерти от тысяч рук. Каждые семь дней этот мир будет рвать тебя на части, и каждый раз — всё больнее, всё страшнее. Ты будешь строить, чтобы терять. Ты будешь надеяться, чтобы отчаиваться. И когда ты устанешь, когда сломаешься — ты просто перестанешь быть. Ты превратишься в одного из них. И даже тогда — я не запомню твоё имя. Пусть мёртвые сделают тебя мёртвым. Пусть смерть не принесёт тебе покоя. Пусть живые навсегда забудут тебя. Прощай, ошибка.","Benim elimden ölmeyi hak etmiyorsun. Bin elin altında ölmeyi hak ediyorsun. Her yedi günde bir bu dünya seni paramparça edecek - ve her seferinde daha çok acıtacak, daha çok korkutacak. İnşa edeceksin, sonra hepsini kaybedeceksin. Umut edeceksin, sonra umutsuzluğa düşeceksin. Yorulduğunda, sonunda kırıldığında ise yalnızca var olmaktan çıkacaksın. Onlardan biri olacaksın. O zaman bile adını hatırlamayacağım. Bırak ölüler seni öldürsün. Bırak ölüm sana huzur getirmesin. Bırak yaşayanlar seni sonsuza dek unutsun. Elveda, hata.",你不配死在我手上。你配死在一千双手下。每隔七天,这个世界都会把你撕碎——而且一次比一次更痛,一次比一次更恐怖。你会建起一切,只为失去一切。你会心存希望,只为坠入绝望。等你倦了,等你终于崩溃,你便会干脆不再存在。你会成为它们中的一员。即便到那时,我也不会记得你的名字。让死者置你于死地。愿死亡不予你安宁。愿生者永远将你遗忘。永别了,错误。,你不配死在我手上。你配死在一千雙手下。每隔七天,這個世界都會把你撕碎——而且一次比一次更痛,一次比一次更恐怖。你會建起一切,只為失去一切。你會心存希望,只為墜入絕望。等你倦了,等你終於崩潰,你便會乾脆不再存在。你會成為牠們中的一員。即便到那時,我也不會記得你的名字。讓死者置你於死地。願死亡不予你安寧。願生者永遠將你遺忘。永別了,錯誤。 braceletSpatialVault,items,Item,,,,Spatial Bracelet,,Raumarmband,Brazalete espacial,Bracelet spatial,Bracciale spaziale,空間の腕輪,공간의 팔찌,Bransoleta przestrzenna,Bracelete espacial,Пространственный браслет,Uzam Bileziği,空间手环,空間手環 -braceletSpatialVaultDesc,items,Item,,,,"A necromantic bracelet. Power attack to tear open a personal storage rift - its size grows with your Necromancy skill. Hold the regular attack on a block and it is pulled into the rift: ten seconds up close, one more for every block of distance. The power attack interrupts that and opens the rift instead.",,Ein nekromantisches Armband. Ein Machtangriff reißt einen persönlichen Lagerriss auf - seine Größe wächst mit deiner Nekromantie-Fertigkeit. Halte den normalen Angriff auf einem Block und er wird in den Riss gezogen: zehn Sekunden aus der Nähe und eine weitere pro Block Entfernung. Der Machtangriff bricht das ab und öffnet stattdessen den Riss.,Un brazalete nigromántico. El ataque potente abre una grieta de almacenamiento personal; su tamaño crece con tu habilidad de Nigromancia. Mantén el ataque normal sobre un bloque y este será atraído a la grieta: diez segundos de cerca y uno más por cada bloque de distancia. El ataque potente lo interrumpe y abre la grieta.,Un bracelet nécromantique. L'attaque puissante ouvre une faille de stockage personnelle - sa taille augmente avec votre compétence de Nécromancie. Maintenez l'attaque normale sur un bloc et il est aspiré dans la faille : dix secondes de près et une de plus par bloc de distance. L'attaque puissante interrompt cela et ouvre la faille.,Un bracciale negromantico. L'attacco potente apre una faglia di stoccaggio personale - la sua dimensione cresce con l'abilità Negromanzia. Tieni premuto l'attacco normale su un blocco e verrà attirato nella faglia: dieci secondi da vicino e uno in più per ogni blocco di distanza. L'attacco potente lo interrompe e apre la faglia.,ネクロマンサーの腕輪。パワーアタックで個人用の収納亀裂を開きます。容量はネクロマンシーのスキルと共に増えます。ブロックに照準して通常攻撃を押し続けると亀裂に引き込まれます。密着で十秒、距離が1ブロック増えるごとに1秒追加されます。パワーアタックで中断し、亀裂を開きます。,강령술사의 팔지. 강타로 개인 보관 균열을 열며 크기는 강령술 스킬에 따라 커집니다. 블록을 조준한 채 일반 공격을 누르고 있으면 그 블록이 균열로 빨려들어갑니다. 밀착 시 10초이며 거리 1블록마다 1초씩 늘어납니다. 강타는 이를 중단하고 균열을 엽니다.,Nekromancka bransoleta. Silny atak rozrywa osobistą szczelinę magazynową - jej rozmiar rośnie wraz z umiejętnością Nekromancji. Przytrzymaj zwykły atak na bloku a zostanie on wciągnięty do szczeliny: dziesięć sekund z bliska i jedna więcej za każdy blok odległości. Silny atak przerywa to i otwiera szczelinę.,Uma bracelete necromântica. O ataque forte abre uma fenda de armazenamento pessoal - seu tamanho cresce com a sua habilidade de Necromancia. Segure o ataque normal sobre um bloco e ele será puxado para a fenda: dez segundos de perto e mais um por bloco de distância. O ataque forte interrompe isso e abre a fenda.,Некромантский браслет. Силовая атака вскрывает личный разлом-хранилище - его размер растёт вместе с навыком Некромантии. Зажмите обычную атаку на блоке - и он втянется в разлом: десять секунд вплотную и ещё по секунде за каждый блок расстояния. Силовая атака прерывает это и открывает хранилище.,Nekromantik bir bileklik. Güçlü saldırı kişisel bir depo yarığı açar; boyutu Nekromantik becerinle birlikte büyür. Normal saldırıyı bir bloka basılı tut ve blok yarığa çekilsin: yakından on saniye ve her blokluk mesafe için bir saniye daha. Güçlü saldırı bunu keser ve yarığı açar.,亡灵法师的手镯。重击可撕开个人储物裂隙,其容量随亡灵法术技能增长。对准方块按住普通攻击,方块便会被拉入裂隙:贴近时为十秒,每远一格再加一秒。重击可中断并打开裂隙。,亡靈法師的手鐠。重擊可撕開個人儲物裂隙,其容量隨亡靈法術技能增長。對準方塊按住普通攻擊,方塊便會被拉入裂隙:貼近時為十秒,每遠一格再加一秒。重擊可中斷並打開裂隙。 +braceletSpatialVaultDesc,items,Item,,,,"A necromantic bracelet. Power attack to tear open a personal storage rift - its size grows with your Necromancy skill. Hold the regular attack on a block and it is pulled into the rift: ten seconds up close, one more for every block of distance. The power attack interrupts that and opens the rift instead. Pulling blocks needs Necromancer's Blood or a Blood Stone in the bracelet's mod slot. Every second of the pull costs the blood one point of durability. When the blood runs out the empty jar shatters.",,"Ein nekromantisches Armband. Ein Machtangriff reißt einen persönlichen Lagerriss auf - seine Größe wächst mit deiner Nekromantie-Fertigkeit. Halte den normalen Angriff auf einem Block und er wird in den Riss gezogen: zehn Sekunden aus der Nähe und eine weitere pro Block Entfernung. Der Machtangriff bricht das ab und öffnet stattdessen den Riss. Zum Einziehen von Blöcken muss Blut des Nekromanten oder ein Blutstein im Modslot des Armbands stecken. Jede Sekunde des Einziehens kostet das Blut einen Haltbarkeitspunkt. Ist das Blut aufgebraucht, zerspringt das leere Glas.","Un brazalete nigromántico. El ataque potente abre una grieta de almacenamiento personal; su tamaño crece con tu habilidad de Nigromancia. Mantén el ataque normal sobre un bloque y este será atraído a la grieta: diez segundos de cerca y uno más por cada bloque de distancia. El ataque potente lo interrumpe y abre la grieta. Para absorber bloques hace falta sangre del nigromante o una piedra de sangre en la ranura de modificación del brazalete. Cada segundo de absorción cuesta un punto de durabilidad de la sangre. Cuando la sangre se agota, el tarro vacío se hace añicos.","Un bracelet nécromantique. L'attaque puissante ouvre une faille de stockage personnelle - sa taille augmente avec votre compétence de Nécromancie. Maintenez l'attaque normale sur un bloc et il est aspiré dans la faille : dix secondes de près et une de plus par bloc de distance. L'attaque puissante interrompt cela et ouvre la faille. Pour aspirer des blocs, il faut du sang de nécromancien ou une pierre de sang dans l'emplacement de mod du bracelet. Chaque seconde d'aspiration coûte un point de durabilité au sang. Quand le sang est épuisé, le bocal vide se brise.","Un bracciale negromantico. L'attacco potente apre una faglia di stoccaggio personale - la sua dimensione cresce con l'abilità Negromanzia. Tieni premuto l'attacco normale su un blocco e verrà attirato nella faglia: dieci secondi da vicino e uno in più per ogni blocco di distanza. L'attacco potente lo interrompe e apre la faglia. Per assorbire blocchi serve sangue del negromante o una pietra di sangue nello slot mod del bracciale. Ogni secondo di assorbimento costa al sangue un punto di durabilità. Quando il sangue finisce, il barattolo vuoto va in frantumi.",ネクロマンサーの腕輪。パワーアタックで個人用の収納亀裂を開きます。容量はネクロマンシーのスキルと共に増えます。ブロックに照準して通常攻撃を押し続けると亀裂に引き込まれます。密着で十秒、距離が1ブロック増えるごとに1秒追加されます。パワーアタックで中断し、亀裂を開きます。ブロックの吸収には、腕輪の改造スロットにネクロマンサーの血か血の石が必要。吸収の1秒ごとに、血の耐久値を1消費する。血を使い切ると、空の瓶は砕け散る。,강령술사의 팔지. 강타로 개인 보관 균열을 열며 크기는 강령술 스킬에 따라 커집니다. 블록을 조준한 채 일반 공격을 누르고 있으면 그 블록이 균열로 빨려들어갑니다. 밀착 시 10초이며 거리 1블록마다 1초씩 늘어납니다. 강타는 이를 중단하고 균열을 엽니다. 블록을 흡수하려면 팔찌의 개조 슬롯에 강령술사의 피나 피의 돌이 있어야 합니다. 흡수 1초마다 피의 내구도가 1씩 소모됩니다. 피가 다하면 빈 병은 산산이 부서집니다.,"Nekromancka bransoleta. Silny atak rozrywa osobistą szczelinę magazynową - jej rozmiar rośnie wraz z umiejętnością Nekromancji. Przytrzymaj zwykły atak na bloku a zostanie on wciągnięty do szczeliny: dziesięć sekund z bliska i jedna więcej za każdy blok odległości. Silny atak przerywa to i otwiera szczelinę. Wciąganie bloków wymaga krwi nekromanty albo krwawego kamienia w gnieździe modyfikacji bransolety. Każda sekunda wciągania kosztuje krew jeden punkt wytrzymałości. Gdy krew się skończy, pusty słoik pęka.","Uma bracelete necromântica. O ataque forte abre uma fenda de armazenamento pessoal - seu tamanho cresce com a sua habilidade de Necromancia. Segure o ataque normal sobre um bloco e ele será puxado para a fenda: dez segundos de perto e mais um por bloco de distância. O ataque forte interrompe isso e abre a fenda. Para absorver blocos é preciso sangue do necromante ou uma pedra de sangue no encaixe de modificação do bracelete. Cada segundo de absorção custa um ponto de durabilidade do sangue. Quando o sangue acaba, o pote vazio se estilhaça.","Некромантский браслет. Силовая атака вскрывает личный разлом-хранилище - его размер растёт вместе с навыком Некромантии. Зажмите обычную атаку на блоке - и он втянется в разлом: десять секунд вплотную и ещё по секунде за каждый блок расстояния. Силовая атака прерывает это и открывает хранилище. Чтобы поглощать блоки, в слоте модификаций браслета должна быть кровь некроманта или кровавый камень. Каждая секунда поглощения тратит единицу прочности крови. Когда кровь кончается, пустая банка разбивается.",Nekromantik bir bileklik. Güçlü saldırı kişisel bir depo yarığı açar; boyutu Nekromantik becerinle birlikte büyür. Normal saldırıyı bir bloka basılı tut ve blok yarığa çekilsin: yakından on saniye ve her blokluk mesafe için bir saniye daha. Güçlü saldırı bunu keser ve yarığı açar. Blok çekmek için bileziğin mod yuvasında nekromantın kanı ya da bir kan taşı bulunmalı. Çekmenin her saniyesi kanın dayanıklılığından bir puan götürür. Kan tükendiğinde boş kavanoz paramparça olur.,亡灵法师的手镯。重击可撕开个人储物裂隙,其容量随亡灵法术技能增长。对准方块按住普通攻击,方块便会被拉入裂隙:贴近时为十秒,每远一格再加一秒。重击可中断并打开裂隙。吸收方块需要在手环的改造槽中装有亡灵法师之血或血石。吸收每持续一秒,血的耐久度便消耗一点。血用尽时,空罐随之碎裂。,亡靈法師的手鐠。重擊可撕開個人儲物裂隙,其容量隨亡靈法術技能增長。對準方塊按住普通攻擊,方塊便會被拉入裂隙:貼近時為十秒,每遠一格再加一秒。重擊可中斷並打開裂隙。吸收方塊需要在手環的改造槽中裝有亡靈法師之血或血石。吸收每持續一秒,血的耐久度便消耗一點。血用盡時,空罐隨之碎裂。 braceletSpatialVaultWindowTitle,items,Item,,,,Spatial Storage,,Raumlager,Almacén espacial,Stockage spatial,Deposito spaziale,空間収納,공간 보관함,Schowek przestrzenny,Armazenamento espacial,Пространственное хранилище,Uzam Deposu,空间储物,空間儲物 braceletSpatialVaultTooWeak,items,Item,,,,Your Necromancy skill isn't strong enough yet to open a storage rift,,"Deine Nekromantie-Fertigkeit reicht noch nicht, um einen Lagerriss zu öffnen",Tu habilidad de Nigromancia aún no es lo bastante fuerte para abrir una grieta de almacenamiento,Ta compétence de Nécromancie n'est pas encore assez forte pour ouvrir une faille de stockage,La tua abilità di Negromanzia non è ancora abbastanza forte per aprire una fessura di stoccaggio,降霊術スキルがまだ足りず、収納の裂け目を開けません,강령술 기술이 아직 부족해 보관 균열을 열 수 없습니다,"Twoja Nekromancja jest jeszcze za słaba, by otworzyć szczelinę na zapasy",Sua habilidade de Necromancia ainda não é forte o bastante para abrir uma fenda de armazenamento,"Ваш навык Некромантии пока недостаточен, чтобы открыть разлом-хранилище",Nekromansi yeteneğin bir depo yarığı açacak kadar güçlü değil,你的亡灵法术技能尚不足以开启储物裂隙,你的亡靈法術技能尚不足以開啟儲物裂隙 braceletSpatialVaultNoTarget,items,Item,,,,There's no zombie in your sight,,Kein Zombie in Sicht,No hay ningún zombi a la vista,Aucun zombie en vue,Non c'è nessuno zombie nel mirino,視界にゾンビがいません,시야에 좀비가 없습니다,W polu widzenia nie ma zombie,Não há nenhum zumbi à vista,В поле зрения нет зомби,Görüş alanında zombi yok,视野中没有僵尸,視野中沒有殭屍 @@ -83,6 +83,7 @@ braceletSpatialVaultFull,items,Item,,,,The storage rift is full,,Der Lagerriss i braceletSpatialVaultPickupChanneling,items,Item,,,,Pulling the block into the rift,,Block wird in den Riss gezogen,Atrayendo el bloque a la grieta,Attraction du bloc dans la faille,Il blocco viene attirato nella faglia,ブロックを亀裂に引き込んでいます,블록을 균열로 끌어들이는 중,Wciąganie bloku do szczeliny,Puxando o bloco para a fenda,Блок втягивается в разлом,Blok yarığa çekiliyor,正在将方块拉入裂隙,正在將方塊拉入裂隙 braceletSpatialVaultTraderArea,items,Item,,,,You can't take blocks on a trader's ground,,Auf dem Gelände eines Händlers kannst du keine Blöcke aufnehmen,No puedes llevarte bloques en el recinto de un comerciante,Impossible de prendre des blocs sur le terrain d'un marchand,Non puoi prendere blocchi nel recinto di un mercante,商人の敷地内ではブロックを回収できません,상인의 부지에서는 블록을 가져갈 수 없습니다,Na terenie handlarza nie możesz zabierać bloków,Você não pode levar blocos no terreno de um comerciante,На территории торговца блоки забирать нельзя,Tüccarın arazisinde blok alamazsın,无法在商人的地盘上收取方块,無法在商人的地盤上收取方塊 braceletSpatialVaultIndestructible,items,Item,,,,This block can't be destroyed or taken,,Dieser Block kann weder zerstört noch aufgenommen werden,Este bloque no puede destruirse ni llevarse,Ce bloc ne peut être ni détruit ni emporté,Questo blocco non può essere distrutto né preso,このブロックは破壊も回収もできません,이 블록은 파괴하거나 가져갈 수 없습니다,Tego bloku nie można zniszczyć ani zabrać,Este bloco não pode ser destruído nem levado,Этот блок нельзя разрушить или забрать,Bu blok ne yıkılabilir ne de alınabilir,该方块无法被破坏或收取,該方塊無法被破壞或收取 +braceletSpatialVaultNoMod,items,Item,,,,You need Necromancer's Blood or a Blood Stone,,Du brauchst Blut des Nekromanten oder einen Blutstein,Necesitas sangre del nigromante o una piedra de sangre,Il te faut du sang de nécromancien ou une pierre de sang,Ti serve sangue del negromante o una pietra di sangue,ネクロマンサーの血か血の石が必要です,강령술사의 피나 피의 돌이 필요합니다,Potrzebujesz krwi nekromanty albo krwawego kamienia,Você precisa de sangue do necromante ou de uma pedra de sangue,Нужна кровь некроманта или кровавый камень,Nekromantın kanına ya da bir kan taşına ihtiyacın var,需要亡灵法师之血或血石,需要亡靈法師之血或血石 necroHeresyPyramid,blocks,Block,,,,Pyramid of Spirits,,Pyramide der Geister,Pirámide de los espíritus,Pyramide des esprits,Piramide degli spiriti,精霊のピラミッド,영혼의 피라미드,Piramida duchów,Pirâmide dos espíritos,Пирамида духов,Ruhlar Piramidi,灵魂金字塔,靈魂金字塔 necroHeresyPyramidDesc,blocks,Block,,,,"A necromantic ward shaped like a pyramid, wreathed in cold purple flame. While you stand within its radius, it charms any un-deviated zombie nearby (see the Deviator) and sets it alight, turning it against other zombies instead of you or your base. Its menu lets you toggle the effect and show or hide the boundary of its radius.",,"Ein nekromantischer Bannstein in Pyramidenform, umkränzt von kaltem violettem Feuer. Solange du in seinem Radius stehst, bezaubert er jeden nicht abgewichenen Zombie in der Nähe (siehe Abweichung) und setzt ihn in Brand, sodass er sich gegen andere Zombies wendet statt gegen dich oder deine Basis. Über sein Menü lässt sich der Effekt umschalten und die Grenze des Radius ein- oder ausblenden.","Un guardián nigromántico con forma de pirámide, envuelto en llamas moradas y frías. Mientras te encuentres dentro de su radio, hechiza a todo zombi cercano que no haya sido desviado (véase la desviación) y lo prende fuego, volviéndolo contra otros zombis en vez de contra ti o tu base. Su menú permite activar o desactivar el efecto y mostrar u ocultar el límite del radio.","Une protection nécromantique en forme de pyramide, ceinte de flammes violettes et froides. Tant que tu te tiens dans son rayon, elle charme tout zombie proche non dévié (voir la déviation) et l'embrase, le retournant contre les autres zombies plutôt que contre toi ou ta base. Son menu permet d'activer ou de couper l'effet et d'afficher ou masquer la limite du rayon.","Una protezione negromantica a forma di piramide, avvolta da una fredda fiamma viola. Finché resti nel suo raggio, incanta ogni zombie vicino non deviato (vedi la deviazione) e lo incendia, rivoltandolo contro gli altri zombie invece che contro te o la tua base. Dal suo menu si può accendere o spegnere l'effetto e mostrare o nascondere il confine del raggio.",冷たい紫の炎をまとった、ピラミッド型の降霊術の守り。あなたがその半径内に立っているあいだ、近くの未逸脱のゾンビを魅了し(逸脱を参照)、燃え上がらせて、あなたや拠点ではなく他のゾンビへ差し向ける。メニューから効果の入切と、半径の境界の表示・非表示を切り替えられる。,"차가운 보랏빛 불꽃에 휩싸인 피라미드 형태의 강령술 수호물. 당신이 그 반경 안에 있는 동안, 근처의 아직 일탈하지 않은 좀비를 매혹하고(일탈 참조) 불붙여, 당신이나 당신의 거점 대신 다른 좀비를 공격하게 만듭니다. 메뉴에서 효과를 켜고 끄거나 반경 경계를 표시/숨길 수 있습니다.","Nekromancki strażnik w kształcie piramidy, spowity zimnym fioletowym płomieniem. Dopóki stoisz w jego promieniu, oczarowuje każde pobliskie zombie, które nie uległo dewiacji (patrz: dewiacja), i podpala je, obracając przeciwko innym zombie zamiast przeciw tobie czy twojej bazie. Jego menu pozwala włączyć lub wyłączyć efekt oraz pokazać lub ukryć granicę promienia.","Uma proteção necromântica em forma de pirâmide, envolta em chamas roxas e frias. Enquanto você estiver dentro do seu raio, ela encanta qualquer zumbi próximo que ainda não tenha sido desviado (veja o desvio) e o incendeia, voltando-o contra outros zumbis em vez de contra você ou sua base. O menu permite ligar ou desligar o efeito e mostrar ou ocultar o limite do raio.","Некромантический оберег в форме пирамиды, окутанный холодным фиолетовым пламенем. Пока вы находитесь в радиусе его действия, он накладывает девиацию на не заряженных зомби поблизости (см. Девиатор) и поджигает их, обращая против других зомби, а не против вас или вашей базы. Меню блока позволяет включать эффект и показывать границу радиуса действия.","Soğuk mor alevlerle çevrili, piramit biçiminde bir nekromansi koruması. Yarıçapı içinde durduğun sürece, yakındaki henüz sapmamış her zombiyi büyüler (bkz. sapma) ve tutuşturur; böylece zombi sana ya da üssüne değil, diğer zombilere saldırır. Menüsünden etkiyi açıp kapatabilir, yarıçapın sınırını gösterip gizleyebilirsin.",一座亡灵法术守护物,形如金字塔,缭绕着冰冷的紫焰。只要你站在其半径之内,它便会魅惑附近尚未悖逆的僵尸(参见悖逆),并将其点燃,使其转而攻击其他僵尸,而非你或你的基地。其菜单可开关此效果,并显示或隐藏半径边界。,一座亡靈法術守護物,形如金字塔,繚繞著冰冷的紫焰。只要你站在其半徑之內,牠便會魅惑附近尚未悖逆的殭屍(參見悖逆),並將其點燃,使其轉而攻擊其他殭屍,而非你或你的基地。其選單可開關此效果,並顯示或隱藏半徑邊界。 blockcommand_TEFeaturePyramidWard:effect_on,blocks,Block,,,,Enable Effect,,Effekt aktivieren,Activar efecto,Activer l'effet,Attiva effetto,効果をオン,효과 켜기,Włącz efekt,Ativar efeito,Включить эффект,Etkiyi Aç,启用效果,啟用效果 diff --git a/Config/item_modifiers.xml b/Config/item_modifiers.xml index b27642b..8b62340 100644 --- a/Config/item_modifiers.xml +++ b/Config/item_modifiers.xml @@ -324,4 +324,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Config/items.xml b/Config/items.xml index ef1540b..ae55e63 100644 --- a/Config/items.xml +++ b/Config/items.xml @@ -1284,70 +1284,23 @@ - - - - - - - + Причина - указание «пусть флакон крови можно будет вставлять как модификацию для + пространственного хранилища», и это оказалось не настройкой, а сменой класса предмета. + XUiC_ItemPartStack.CanSwap открывается строкой - - - - - - - - + if (!(stack.itemValue.ItemClass is ItemClassModifier itemClassModifier)) return false; + + - слот модификации не смотрит ни на теги, ни на свойства, пока предмет не ItemClassModifier, + а этот класс создаётся ТОЛЬКО из в item_modifiers.xml. Никакого свойства + вида "CanBeInstalled" не существует; остаться в items.xml и стать модификацией нельзя. + + Предмет при этом остался обычным во всём остальном: ItemClassModifier наследует ItemClass и + регистрируется в том же ItemClass.nameToItem, поэтому рецепты, крафт и Harmony-патч + (NecromancerBloodPatch.cs) находят его по имени как раньше. Разбор - в BACKLOG.md. + + Само определение, со всеми старыми комментариями про банку, текстуры и прочность - там. --> + FOR THE MODS THEMSELVES: give each one its OWN modifier_tags. + XUiC_ItemPartStack.CanSwap counts already-installed mods whose modifier_tags + intersect the one being installed and refuses at num >= ItemClass.MaxModsAllowed, + which defaults to 1. With a single slot this no longer costs slots - but it still + matters, because a shared tag would ALSO make two different bracelet mods mutually + exclusive in ways nothing in the UI explains. Keep them distinct. + + ОДИН СЛОТ, указание 2026-09-15 («убавь у пространственного браслета количество + слотов под модификации до одного»). Было 4, поставленные 2026-08-30 по прежнему + выбору пользователя («4 фиксированно»). + + Что это меняет по сути: слот из «набора улучшений» превратился в ВЫБОР. Сейчас + единственный кандидат - флакон Крови некроманта (item_modifiers.xml, переехал туда + 2026-09-15), так что выбирать пока не из чего; но каждая следующая модификация + браслета теперь конкурирует за один слот, а не добавляется к остальным. Это стоит + держать в голове при их придумывании - иначе получится набор, из которого всегда + берут одну и ту же. + + Число только здесь. ModSlots - пассивка, а не свойство, и никакой другой файл на + него не смотрит; менять обратно - эта же строка. У Ножа некроманта свои 4 слота + (выше в этом файле, ~строка 1056) - их указание НЕ трогало. --> - + diff --git a/HarmonySrc/NecromancerBloodPatch.cs b/HarmonySrc/NecromancerBloodPatch.cs index 6c3c415..b9eb006 100644 --- a/HarmonySrc/NecromancerBloodPatch.cs +++ b/HarmonySrc/NecromancerBloodPatch.cs @@ -4,8 +4,12 @@ using UnityEngine; namespace NecromancerTome { /// - /// "Кровь некроманта" (Necromancer's Blood) - dictated 2026-08-30. See items.xml - /// (resourceNecromancerBlood) for the item, recipes.xml for the base recipe (an empty jar, + /// "Кровь некроманта" (Necromancer's Blood) - dictated 2026-08-30. See item_modifiers.xml + /// (resourceNecromancerBlood - it lives THERE, not in items.xml, since 2026-09-15: it had to + /// become an ItemClassModifier to be installable in the Spatial Bracelet, and that class is + /// only created from . Nothing here changed - the lookup is by name, and both + /// files register into the same ItemClass.nameToItem) for the item, recipes.xml for the base + /// recipe (an empty jar, /// like any other resource conversion). Two rules the user asked for have NO vanilla XML /// equivalent at all, so both are enforced here instead: /// 1. "нужна... наличие любого ножа" - a knife must be present (in the toolbelt or diff --git a/HarmonySrc/SpatialVaultPatch.cs b/HarmonySrc/SpatialVaultPatch.cs index 4d1d166..db1e9e1 100644 --- a/HarmonySrc/SpatialVaultPatch.cs +++ b/HarmonySrc/SpatialVaultPatch.cs @@ -105,7 +105,9 @@ namespace NecromancerTome // пространственного браслета не делает ничего"), after the knockback+slow version did not // visibly do anything in testing. ShoveZombieAtCrosshair is kept below, unused, // because that abandoned version was never shown to be WRONG - only invisible. - SpatialVaultPickup.Begin(player); + // The ItemValue goes with it: the pickup refuses outright when this particular + // bracelet has nothing in its mod slot, and mods live on the instance. + SpatialVaultPickup.Begin(player, _actionData.invData.itemValue); } // Skip ItemActionEat's own logic entirely - the click has been fully handled here. diff --git a/HarmonySrc/SpatialVaultPickupPatch.cs b/HarmonySrc/SpatialVaultPickupPatch.cs index 0c7e25b..76a9ed7 100644 --- a/HarmonySrc/SpatialVaultPickupPatch.cs +++ b/HarmonySrc/SpatialVaultPickupPatch.cs @@ -130,6 +130,7 @@ namespace NecromancerTome public const string MsgChanneling = "braceletSpatialVaultPickupChanneling"; public const string MsgTraderArea = "braceletSpatialVaultTraderArea"; public const string MsgIndestructible = "braceletSpatialVaultIndestructible"; + public const string MsgNoMod = "braceletSpatialVaultNoMod"; /// The denial sound vanilla plays with these tooltips. public const string DeniedSound = "ui_denied"; @@ -169,12 +170,52 @@ namespace NecromancerTome public EntityPlayerLocal Player; public Vector3i Position; public BlockValue Expected; + + /// The bracelet this pull was started with, so the blood that pays for it is + /// taken from the flask in THAT bracelet. Kept as the live ItemValue rather than + /// looked up again at the end: mods live on the instance, and ten seconds is long + /// enough for the player to have scrolled to another slot. + public ItemValue Bracelet; + + /// What this particular pull costs, in seconds - computed once when the + /// channel starts (user request 2026-09-15: "пусть количество секунд требуемое для + /// поглощения блока записывается в отдельную переменную"). It is the same number the + /// timer counts down and the same number the flask pays, and that is the point of + /// storing it instead of recomputing: by the time the channel ends the player may + /// have turned away, the ray is gone, and a second call to ChannelSecondsFor would + /// quietly charge for a different block than the one that was taken. + public float ChannelSeconds; } /// Regular attack on the bracelet. Every refusal happens here, before the player /// is asked to stand still for ten seconds. - public static void Begin(EntityPlayerLocal _player) + public static void Begin(EntityPlayerLocal _player, ItemValue _bracelet) { + // AN EMPTY MOD SLOT REFUSES THE WHOLE ACTION (user request 2026-09-15: "пусть обычная + // атака (поглощение блока) у пространственного хранилища не работает, если у хранилища + // в слоте модификаций пусто"). FIRST, deliberately, ahead of every other check in this + // method: the others are about the TARGET (no block, wrong kind of block, vault full), + // and telling the player "no block there" when the real problem is his empty bracelet + // would send him looking in the wrong place. This one is about the tool, so it is + // answered before the tool is even pointed at anything. + // + // ItemValue.HasMods() is the game's own test and the right one: it walks Modifications + // only, skipping both nulls and IsEmpty() slots, and does NOT count CosmeticMods - a + // dye would otherwise have read as "the bracelet is loaded". The bracelet has no + // cosmetic slot anyway (canHaveCosmetic is deliberately absent from its Tags, see + // items.xml), so this is belt and braces rather than a live case - but the next item + // that reuses this pattern may well have one. + // + // The ItemValue is handed in rather than read from the player, because the caller + // already holds the exact instance the click came from (_actionData.invData.itemValue) + // and mods live on the INSTANCE, not on the ItemClass. Two bracelets in the same + // inventory can legitimately disagree about whether they are loaded. + if (_bracelet == null || !_bracelet.HasMods()) + { + Deny(_player, MsgNoMod); + return; + } + World world = GameManager.Instance != null ? GameManager.Instance.World : null; if (world == null) { @@ -249,9 +290,20 @@ namespace NecromancerTome return; } + // Computed HERE, while the ray still exists, and carried in the job from this point + // on - see PickupJob.ChannelSeconds. + float channelSeconds = ChannelSecondsFor(hitInfo); + TimerEventData timerData = new TimerEventData { - Data = new PickupJob { Player = _player, Position = position, Expected = blockValue }, + Data = new PickupJob + { + Player = _player, + Position = position, + Expected = blockValue, + Bracelet = _bracelet, + ChannelSeconds = channelSeconds + }, // Vanilla's own two escapes: taking a hit stops the channel, and so does the // activate key. Neither is built here - both are fields XUiC_Timer.Update reads. CloseOnHit = true, @@ -267,7 +319,6 @@ namespace NecromancerTome ChannelVision.End(_player); }; - float channelSeconds = ChannelSecondsFor(hitInfo); LocalPlayerUI playerUI = LocalPlayerUI.GetUIForPlayer(_player); XUiC_Timer.OpenTimer(playerUI.xui, channelSeconds, timerData, -1f, Localization.Get(MsgChanneling)); // After the window is up, so a channel that somehow fails to open never leaves the @@ -344,13 +395,124 @@ namespace NecromancerTome } world.SetBlockRPC(job.Position, BlockValue.Air); + + // AFTER the block is gone and the item is in the vault, never before: every refusal + // above returns early, and blood paid for a pull that was then refused would be blood + // charged for nothing. This is the only place the flask is spent. + float spent = SpendBlood(job); + // The vault lives in memory and is written out with the player's own save data; this // is the same commit point closing the vault window uses, so a block taken and then - // left alone is not waiting on the next autosave to become real. + // left alone is not waiting on the next autosave to become real. The flask's UseTimes + // rides along in the same save - it lives on the bracelet in the player's inventory. GameManager.Instance.SaveLocalPlayerData(); Debug.Log("[NecromancerTome] SpatialVaultPickup: owner=" + job.Player.entityId + " took " + - blockValue.Block.GetBlockName() + " at " + job.Position + " into the vault"); + blockValue.Block.GetBlockName() + " at " + job.Position + " into the vault for " + + spent.ToString("0.#") + " of blood"); + } + + /// Charges this pull to the Necromancer's Blood in the bracelet's mod slot, one + /// point of durability per second of channel (user request 2026-09-15). Returns what was + /// actually taken, which is not always what was asked for - see the clamp. + /// + /// WHY THE NAME CHECK AND NOT "whatever is in the slot". The instruction is explicit - + /// "если эта модификация кровь некроманта" - and it has to stay that way: the slot is + /// meant to take other things later (the message the empty slot prints already promises a + /// Blood Stone), and those will have their own price, or none. A mod that is not blood + /// pays nothing here and the pull still happens - deliberately, because refusing it would + /// be a second rule nobody asked for. + /// + /// The name comes from NecromancerBloodPatch rather than a second literal in this file, + /// so the two cannot drift apart if the item is ever renamed. + /// + /// NOT ENOUGH BLOOD IS NOT A REFUSAL (user request 2026-09-15: "пусть поглощение всё-равно + /// сработает, но флакон крови некроманта после этого пусть исчезнет из слота", clarified to + /// "если прочность 0 или меньше, пусть флакон исчезнет из слота"). So the last pull is + /// always free of charge in the sense that matters - it completes - and the flask simply + /// does not survive it. The charge is therefore NOT clamped: UseTimes is allowed to go past + /// MaxUseTimes, because the only thing that then reads it is the emptiness test right + /// below, and a clamp would have made "spent exactly to zero" and "overdrawn" look the + /// same at the moment the difference stopped mattering anyway. + /// + /// The test is "durability 0 or less", not "could not cover the cost", and those are not + /// the same rule: a flask with exactly enough left is also gone afterwards. That is the + /// user's own correction and it closes the hole the first version would have left - a + /// flask sitting at 0/1000 in the slot, counting as "something is installed" for the empty- + /// slot gate in Begin, and pulling blocks for free forever. + /// + /// WHY THE NAME CHECK AND NOT "whatever is in the slot" - see above; a mod that is not + /// blood pays nothing, is not emptied, and the pull still happens. + public static float SpendBlood(PickupJob _job) + { + ItemValue bracelet = _job.Bracelet; + if (bracelet == null || bracelet.Modifications == null || _job.ChannelSeconds <= 0f) + { + return 0f; + } + + float spent = 0f; + bool emptied = false; + for (int i = 0; i < bracelet.Modifications.Length; i++) + { + ItemValue mod = bracelet.Modifications[i]; + if (mod == null || mod.IsEmpty()) + { + continue; + } + if (mod.ItemClass == null || mod.ItemClass.Name != NecromancerBloodPatch.BloodItemName) + { + continue; + } + + int max = mod.MaxUseTimes; + mod.UseTimes += _job.ChannelSeconds; + spent += _job.ChannelSeconds; + + // max <= 0 means this flask has no durability at all - a DegradationMax that did + // not resolve. Draining something with no capacity would delete it on the first + // pull, which is a config bug eating the player's item, so it is left alone and + // said out loud instead. + if (max <= 0) + { + Debug.LogWarning("[NecromancerTome] SpatialVaultPickup: blood in slot " + i + + " has MaxUseTimes 0 - nothing to spend, flask kept. Check the " + + "DegradationMax passive_effect in Config/item_modifiers.xml"); + continue; + } + + if (mod.UseTimes >= max) + { + // ItemValue.None is what an empty mod slot holds - type 0, which is exactly + // what IsEmpty() tests for, so the slot reads as free to every other piece of + // code including the gate in Begin. + bracelet.Modifications[i] = ItemValue.None; + emptied = true; + Debug.Log("[NecromancerTome] SpatialVaultPickup: blood in slot " + i + + " ran out (" + mod.UseTimes.ToString("0.#") + "/" + max + + ") - flask removed from the bracelet"); + } + else + { + Debug.Log("[NecromancerTome] SpatialVaultPickup: blood in slot " + i + " now " + + mod.UseTimes.ToString("0.#") + "/" + max + " used"); + } + } + + if (emptied) + { + // Vanilla's own answer to "the thing you were using is gone" - the same cue + // ItemAction.HandleItemBreak plays. An item vanishing out of a slot in silence is + // the one outcome here the player could miss entirely. + _job.Player.PlayOneShot("itembreak"); + } + if (spent > 0f && _job.Player.inventory != null) + { + // Without this the number is right and the bar on the toolbelt icon is stale + // until something else happens to redraw it. + _job.Player.inventory.CallOnToolbeltChangedInternal(); + } + return spent; } /// How long this particular pull takes. See the class comment for why the ray's diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index 1b08c8cd33bf79028cef89767fc723b37268e4a2..3729244124170bdf5c3959f67a0a1a9d28671290 100644 GIT binary patch delta 20038 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

A2b+5^4rWvEJA*`22AbrjyI?}` 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 A8vp@|RA(TPO0W61JsHK2{im63)x#E;sibv5h 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 A&Hw-a