diff --git a/Config/Localization.csv b/Config/Localization.csv
index f0285f3..b7d5052 100644
--- a/Config/Localization.csv
+++ b/Config/Localization.csv
@@ -36,9 +36,11 @@ necroWpnBladeNecroKnifeThread,items,Item,,,,Necromancer's Knife (thread grip),,M
necroWpnBladeNecroKnifeThreadDesc,items,Item,,,,"The same knife, held by the blade like a stylus. It does not strike - it draws ghostly threads between a cinerarium and chests, up to 15 m long. Right-click a chest, then the urn: the spirit takes from that chest. Right-click the urn, then a chest: the spirit brings things there. Which things - you choose in the urn's Contents, by item group. Left-click an urn or a chest to cut its threads. An urn with threads only carries things between chests. Press R to change the grip.",,"Dasselbe Messer, an der Klinge gehalten wie ein Griffel. Es schlägt nicht zu - es zieht geisterhafte Fäden zwischen einem Cinerarium und Truhen, bis zu 15 m lang. Rechtsklick auf eine Truhe, dann auf die Urne: Der Geist nimmt aus dieser Truhe. Rechtsklick auf die Urne, dann auf eine Truhe: Der Geist bringt Dinge dorthin. Welche Dinge, wählst du im Inhalt der Urne nach Gegenstandsgruppen. Linksklick auf Urne oder Truhe trennt ihre Fäden. Eine Urne mit Fäden trägt nur noch Dinge zwischen Truhen. R wechselt den Griff.","El mismo cuchillo, sujeto por la hoja como un punzón. No golpea: tiende hilos fantasmales entre un cinerario y cofres, de hasta 15 m. Clic derecho en un cofre y luego en la urna: el espíritu toma de ese cofre. Clic derecho en la urna y luego en un cofre: el espíritu lleva cosas allí. Qué cosas, lo eliges en el Contenido de la urna, por grupos de objetos. Clic izquierdo en una urna o un cofre corta sus hilos. Una urna con hilos solo transporta cosas entre cofres. R cambia el agarre.","Le même couteau, tenu par la lame comme un stylet. Il ne frappe pas : il tend des fils spectraux entre un cinéraire et des coffres, jusqu'à 15 m. Clic droit sur un coffre puis sur l'urne : l'esprit prend dans ce coffre. Clic droit sur l'urne puis sur un coffre : l'esprit y apporte des objets. Lesquels - tu les choisis dans le Contenu de l'urne, par groupes d'objets. Clic gauche sur une urne ou un coffre coupe ses fils. Une urne reliée ne fait plus que transporter entre coffres. R change de prise.","Lo stesso coltello, tenuto per la lama come uno stilo. Non colpisce: tende fili spettrali tra un cinerario e dei forzieri, lunghi fino a 15 m. Clic destro su un forziere, poi sull'urna: lo spirito prende da quel forziere. Clic destro sull'urna, poi su un forziere: lo spirito vi porta oggetti. Quali, lo scegli nel Contenuto dell'urna, per gruppi di oggetti. Clic sinistro su un'urna o un forziere ne taglia i fili. Un'urna con fili trasporta soltanto tra forzieri. R cambia la presa.",刃を持ち、筆のように握った同じナイフ。攻撃はせず、骨壺と箱のあいだに最長15mの霊の糸を張る。箱を右クリックしてから骨壺を右クリックすると、霊はその箱から取る。骨壺を右クリックしてから箱を右クリックすると、霊はそこへ運ぶ。何を運ぶかは、骨壺の「中身」で品目グループごとに選ぶ。骨壺か箱を左クリックすると糸を断つ。糸のある骨壺は箱から箱への運搬だけをする。Rで握りを変える。,"칼날을 쥐고 붓처럼 잡은 같은 단검. 공격하지 않고, 유골함과 상자 사이에 최대 15m의 유령 실을 잇습니다. 상자를 우클릭한 뒤 유골함을 우클릭하면 영혼이 그 상자에서 가져갑니다. 유골함을 우클릭한 뒤 상자를 우클릭하면 영혼이 그곳으로 옮깁니다. 무엇을 옮길지는 유골함의 내용물에서 물품 그룹별로 고릅니다. 유골함이나 상자를 좌클릭하면 실이 끊어집니다. 실이 이어진 유골함은 상자 사이 운반만 합니다. R로 쥐는 법을 바꿉니다.","Ten sam nóż, trzymany za ostrze jak rysik. Nie zadaje ciosów - rozpina widmowe nici między cinerarium a skrzyniami, do 15 m. PPM na skrzyni, potem na urnie: duch bierze z tej skrzyni. PPM na urnie, potem na skrzyni: duch zanosi tam rzeczy. Jakie - wybierasz w Zawartości urny, według grup przedmiotów. LPM na urnie lub skrzyni przecina jej nici. Urna z niciami tylko przenosi rzeczy między skrzyniami. R zmienia chwyt.","A mesma faca, segurada pela lâmina como um estilete. Não golpeia: estende fios fantasmagóricos entre um cinerário e baús, de até 15 m. Clique direito num baú e depois na urna: o espírito tira desse baú. Clique direito na urna e depois num baú: o espírito leva coisas para lá. Quais coisas, você escolhe no Conteúdo da urna, por grupos de itens. Clique esquerdo numa urna ou num baú corta seus fios. Uma urna com fios só transporta entre baús. R troca a pegada.","Тот же нож, взятый за клинок, как стилус. Он не бьёт, а тянет призрачные нити между цинерарием и ящиками, длиной до 15 м. ПКМ по ящику, затем по урне - дух берёт из этого ящика. ПКМ по урне, затем по ящику - дух носит туда. Что именно носить, выбирается в «Содержимом» урны по группам предметов. ЛКМ по урне или ящику обрезает его нити. Урна с нитями только перевозит вещи между ящиками. R - сменить хват.","Aynı bıçak, bir kalem gibi bıçağından tutulmuş. Vurmaz; bir küllük ile sandıklar arasında 15 m'ye kadar hayalet iplikler gerer. Önce bir sandığa, sonra küllüğe sağ tıkla: ruh o sandıktan alır. Önce küllüğe, sonra bir sandığa sağ tıkla: ruh oraya taşır. Neyin taşınacağını küllüğün İçerik penceresinde eşya gruplarına göre seçersin. Bir küllüğe ya da sandığa sol tıklamak ipliklerini keser. İplikli bir küllük yalnızca sandıklar arasında taşır. R tutuşu değiştirir.",同一把刀,握住刀刃,像握笔一样。它不攻击,而是在骨灰瓮与箱子之间牵起最长15米的幽灵丝线。先右键箱子、再右键骨灰瓮:灵从那个箱子取物。先右键骨灰瓮、再右键箱子:灵把东西送到那里。搬什么,在骨灰瓮的「内容」里按物品分组选择。左键骨灰瓮或箱子可剪断它的丝线。连了丝线的骨灰瓮只在箱子之间搬运。按R换握法。,同一把刀,握住刀刃,像握筆一樣。它不攻擊,而是在骨灰甕與箱子之間牽起最長15公尺的幽靈絲線。先右鍵箱子、再右鍵骨灰甕:靈從那個箱子取物。先右鍵骨灰甕、再右鍵箱子:靈把東西送到那裡。搬什麼,在骨灰甕的「內容」裡按物品分組選擇。左鍵骨灰甕或箱子可剪斷它的絲線。連了絲線的骨灰甕只在箱子之間搬運。按R換握法。
necroKnifeGripNormal,UI,Tooltip,,,,Ordinary grip,,Normaler Griff,Agarre normal,Prise normale,Presa normale,通常の握り,보통 쥐기,Zwykły chwyt,Pegada normal,Обычный хват,Normal tutuş,普通握法,普通握法
necroKnifeGripThread,UI,Tooltip,,,,Thread grip,,Fadengriff,Agarre de hilos,Prise des fils,Presa dei fili,糸の握り,실 쥐기,Chwyt do nici,Pegada de fios,Хват для нитей,İplik tutuşu,牵线握法,牽線握法
-necroThreadStart,UI,Tooltip,,,,Thread started - now right-click the other end (urn or chest),,Faden begonnen - jetzt das andere Ende rechtsklicken (Urne oder Truhe),Hilo iniciado: ahora clic derecho en el otro extremo (urna o cofre),Fil commencé - clic droit sur l'autre bout (urne ou coffre),Filo iniziato: ora clic destro sull'altro capo (urna o forziere),糸を張り始めた――もう一方の端(骨壺か箱)を右クリック,실을 잇기 시작했다 - 다른 끝(유골함이나 상자)을 우클릭,Nić zaczęta - teraz PPM na drugim końcu (urna lub skrzynia),Fio iniciado: agora clique direito na outra ponta (urna ou baú),Нить начата - теперь ПКМ по другому концу (урна или ящик),İplik başladı - şimdi diğer uca sağ tıkla (küllük ya da sandık),丝线已起头——右键另一端(骨灰瓮或箱子),絲線已起頭——右鍵另一端(骨灰甕或箱子)
+necroThreadStart,UI,Tooltip,,,,Thread started - now right-click the other end (urn or chest) or a skull decoration to pass it through,,Faden begonnen - jetzt das andere Ende (Urne oder Truhe) oder einen Deko-Schädel zum Durchführen rechtsklicken,Hilo iniciado: ahora clic derecho en el otro extremo (urna o cofre) o en un cráneo decorativo para pasarlo por él,Fil commencé - clic droit sur l'autre bout (urne ou coffre) ou sur un crâne décoratif pour l'y faire passer,Filo iniziato: ora clic destro sull'altro capo (urna o forziere) o su un teschio decorativo per farlo passare,糸を張り始めた――もう一方の端(骨壺か箱)か、通したい飾りの頭蓋骨を右クリック,실을 잇기 시작했다 - 다른 끝(유골함이나 상자) 또는 통과시킬 장식 두개골을 우클릭,"Nić zaczęta - teraz PPM na drugim końcu (urna lub skrzynia) albo na ozdobnej czaszce, by przez nią przeprowadzić",Fio iniciado: agora clique direito na outra ponta (urna ou baú) ou num crânio decorativo para passar por ele,"Нить начата - теперь ПКМ по другому концу (урна или ящик) или по черепу-декору, чтобы провести через него",İplik başladı - şimdi diğer uca (küllük ya da sandık) veya içinden geçirmek için süs kafatasına sağ tıkla,已开始拉线——现在右键另一端(骨灰瓮或箱子),或右键装饰头骨让丝线从它那里穿过,已開始拉線——現在右鍵另一端(骨灰甕或箱子),或右鍵裝飾頭骨讓絲線從它那裡穿過
+necroThreadRelayFirst,UI,Tooltip,,,,"Start the thread at an urn or chest, then pass it through skulls",,Beginne den Faden an einer Urne oder Truhe und führe ihn dann durch Schädel,Empieza el hilo en una urna o un cofre y luego pásalo por cráneos,"Commence le fil sur une urne ou un coffre, puis fais-le passer par des crânes","Inizia il filo da un'urna o un forziere, poi fallo passare per i teschi",糸は骨壺か箱から張り始め、それから頭蓋骨に通す,실은 유골함이나 상자에서 시작해 두개골로 통과시킨다,"Zacznij nić przy urnie lub skrzyni, potem przeprowadzaj ją przez czaszki",Comece o fio numa urna ou baú e depois passe-o por crânios,"Начни нить у урны или ящика, потом проводи её через черепа","İpliğe bir küllükte ya da sandıkta başla, sonra kafataslarından geçir",先从骨灰瓮或箱子开始拉线,再让它穿过头骨,先從骨灰甕或箱子開始拉線,再讓它穿過頭骨
+necroThreadRelay,UI,Tooltip,,,,The thread passes through the skull - right-click the next skull or the other end,,Der Faden läuft durch den Schädel - jetzt den nächsten Schädel oder das andere Ende rechtsklicken,El hilo pasa por el cráneo: clic derecho en el siguiente cráneo o en el otro extremo,Le fil passe par le crâne - clic droit sur le crâne suivant ou sur l'autre bout,Il filo passa per il teschio: clic destro sul prossimo teschio o sull'altro capo,糸が頭蓋骨を通った――次の頭蓋骨か、もう一方の端を右クリック,실이 두개골을 지난다 - 다음 두개골이나 다른 끝을 우클릭,Nić przechodzi przez czaszkę - PPM na następnej czaszce albo na drugim końcu,O fio passa pelo crânio: clique direito no próximo crânio ou na outra ponta,Нить идёт через череп - ПКМ по следующему черепу или по другому концу,İplik kafatasından geçiyor - sonraki kafatasına ya da diğer uca sağ tıkla,丝线穿过了头骨——右键下一颗头骨或另一端,絲線穿過了頭骨——右鍵下一顆頭骨或另一端
necroThreadNeedPair,UI,Tooltip,,,,A thread links a cinerarium and a chest,,Ein Faden verbindet ein Cinerarium und eine Truhe,Un hilo une un cinerario y un cofre,Un fil relie un cinéraire et un coffre,Un filo unisce un cinerario e un forziere,糸は骨壺と箱をつなぐ,실은 유골함과 상자를 잇는다,Nić łączy cinerarium ze skrzynią,Um fio liga um cinerário e um baú,Нить связывает цинерарий и ящик,İplik bir küllük ile bir sandığı bağlar,丝线连接骨灰瓮与箱子,絲線連接骨灰甕與箱子
-necroThreadTooFar,UI,Tooltip,,,,Too far for a thread (15 m),,Zu weit für einen Faden (15 m),Demasiado lejos para un hilo (15 m),Trop loin pour un fil (15 m),Troppo lontano per un filo (15 m),糸には遠すぎる(15m),실을 잇기엔 너무 멀다 (15m),Za daleko na nić (15 m),Longe demais para um fio (15 m),Слишком далеко для нити (15 м),İplik için çok uzak (15 m),太远了,丝线够不着(15米),太遠了,絲線夠不著(15公尺)
+necroThreadTooFar,UI,Tooltip,,,,Too far for a thread (15 m) - pass it through a skull decoration,,Zu weit für einen Faden (15 m) - führe ihn durch einen Deko-Schädel,Demasiado lejos para un hilo (15 m): pásalo por un cráneo decorativo,Trop loin pour un fil (15 m) - fais-le passer par un crâne décoratif,Troppo lontano per un filo (15 m): fallo passare per un teschio decorativo,糸には遠すぎる(15m)――飾りの頭蓋骨に通そう,실을 잇기엔 너무 멀다 (15m) - 장식 두개골로 통과시켜라,Za daleko na nić (15 m) - przeprowadź ją przez ozdobną czaszkę,Longe demais para um fio (15 m): passe-o por um crânio decorativo,Слишком далеко для нити (15 м) - проведи её через череп-декор,İplik için çok uzak (15 m) - bir süs kafatasından geçir,太远了,丝线够不着(15米)——让它穿过一颗装饰头骨,太遠了,絲線夠不著(15公尺)——讓它穿過一顆裝飾頭骨
necroThreadFrom,UI,Tooltip,,,,Thread: chest to urn - the spirit will take from here,,Faden: Truhe zur Urne - der Geist nimmt von hier,Hilo: cofre a urna; el espíritu tomará de aquí,Fil : coffre vers urne - l'esprit prendra ici,Filo: forziere verso urna - lo spirito prenderà da qui,糸:箱から骨壺へ――霊はここから取る,실: 상자에서 유골함으로 - 영혼이 여기서 가져간다,Nić: skrzynia do urny - duch będzie stąd brał,Fio: baú para urna - o espírito vai tirar daqui,Нить: ящик - урна. Дух будет брать отсюда,İplik: sandıktan küllüğe - ruh buradan alacak,丝线:箱子到骨灰瓮——灵会从这里取,絲線:箱子到骨灰甕——靈會從這裡取
necroThreadTo,UI,Tooltip,,,,Thread: urn to chest - the spirit will bring things here,,Faden: Urne zur Truhe - der Geist bringt Dinge hierher,Hilo: urna a cofre; el espíritu traerá cosas aquí,Fil : urne vers coffre - l'esprit apportera ici,Filo: urna verso forziere - lo spirito porterà qui,糸:骨壺から箱へ――霊はここへ運ぶ,실: 유골함에서 상자로 - 영혼이 여기로 옮긴다,Nić: urna do skrzyni - duch będzie tu znosił,Fio: urna para baú - o espírito vai trazer para cá,Нить: урна - ящик. Дух будет носить сюда,İplik: küllükten sandığa - ruh buraya taşıyacak,丝线:骨灰瓮到箱子——灵会把东西送到这里,絲線:骨灰甕到箱子——靈會把東西送到這裡
necroThreadRemoved,UI,Tooltip,,,,Threads cut,,Fäden getrennt,Hilos cortados,Fils coupés,Fili tagliati,糸を断った,실을 끊었다,Nici przecięte,Fios cortados,Нити обрезаны,İplikler kesildi,丝线已剪断,絲線已剪斷
@@ -139,7 +141,7 @@ blockcommand_effect_off,blocks,Block,,,,Disable Effect,,Effekt deaktivieren,Desa
blockcommand_zone_show,blocks,Block,,,,Show Zone,,Zone anzeigen,Mostrar zona,Afficher la zone,Mostra zona,範囲を表示,구역 표시,Pokaż strefę,Mostrar zona,Показать зону,Bölgeyi Göster,显示范围,顯示範圍
blockcommand_zone_hide,blocks,Block,,,,Hide Zone,,Zone ausblenden,Ocultar zona,Masquer la zone,Nascondi zona,範囲を非表示,구역 숨기기,Ukryj strefę,Ocultar zona,Скрыть зону,Bölgeyi Gizle,隐藏范围,隱藏範圍
necroCinerarium,blocks,Block,,,,Harvest Cinerarium,,Ernte-Cinerarium,Cinerario de cosecha,Cinéraire des moissons,Cinerario del raccolto,収穫の納骨壺,수확의 유골함,Cinerarium żniw,Cinerário da colheita,Цинерарий,Hasat Küllüğü,丰收骨灰瓮,豐收骨灰甕
-necroCinerariumDesc,blocks,Block,,,,"A funeral urn that houses a skull taken from a red corpse. Place the skull inside and a spirit rises from the urn to serve its 5 by 5 area, from one block below the urn to four above: it tops up dew collectors, apiaries and chicken coops from the boxes nearby, carries finished goods from workstations and collectors into those boxes, and last of all harvests and replants the garden. The urn's own storage is the spirit's bag for whatever the boxes cannot hold. Hold E on the urn for the bag, the contents or the zone. Picked up, the urn keeps its skull. Zones of two urns cannot overlap, and you may keep one urn for every 500 dead you have put to rest.",,"Eine Grabesurne für einen Schädel aus einer roten Leiche. Leg den Schädel hinein, und ein Geist steigt aus der Urne und versorgt ihre Fläche von 5 mal 5, von einem Block unter der Urne bis vier darüber: Er füllt Taukollektoren, Bienenstöcke und Hühnerställe aus den Kisten in der Nähe auf, trägt fertige Waren aus Werkbänken und Kollektoren in diese Kisten und erntet zuletzt den Garten ab und pflanzt neu. Der Speicher der Urne ist die Tasche des Geistes für alles, was die Kisten nicht fassen. Halte E an der Urne für Tasche, Inhalt oder Zone. Aufgehoben behält die Urne ihren Schädel. Die Zonen zweier Urnen dürfen sich nicht überschneiden, und du darfst je 500 zur Ruhe gebrachte Tote eine Urne halten.","Una urna funeraria que alberga un cráneo sacado de un cadáver rojo. Pon el cráneo dentro y un espíritu surgirá de la urna para atender su área de 5 por 5, desde un bloque bajo la urna hasta cuatro por encima: repone recolectores de rocío, colmenas y gallineros con lo que hay en los cofres cercanos, lleva los productos terminados de las estaciones y recolectores a esos cofres y, por último, cosecha y vuelve a plantar el huerto. El almacén de la urna es la bolsa del espíritu para lo que no quepa en los cofres. Mantén E sobre la urna para la bolsa, el contenido o la zona. Al recogerla, la urna conserva su cráneo. Las zonas de dos urnas no pueden solaparse, y puedes tener una urna por cada 500 muertos a los que hayas dado descanso.","Une urne funéraire qui abrite un crâne pris sur un cadavre rouge. Placez le crâne à l'intérieur et un esprit s'élève de l'urne pour servir sa zone de 5 sur 5, d'un bloc sous l'urne à quatre au-dessus : il réapprovisionne collecteurs de rosée, ruchers et poulaillers à partir des caisses voisines, porte les produits finis des établis et des collecteurs dans ces caisses et, en dernier, récolte et replante le jardin. Le stockage de l'urne est le sac de l'esprit pour ce que les caisses ne peuvent contenir. Maintenez E sur l'urne pour le sac, le contenu ou la zone. Ramassée, l'urne garde son crâne. Les zones de deux urnes ne peuvent pas se chevaucher, et vous pouvez garder une urne pour 500 morts que vous avez mis au repos.","Un'urna funeraria che custodisce un teschio preso da un cadavere rosso. Metti il teschio all'interno e uno spirito sorgerà dall'urna per servire la sua area di 5 per 5, da un blocco sotto l'urna fino a quattro sopra: rifornisce raccoglitori di rugiada, apiari e pollai con ciò che c'è nelle casse vicine, porta i prodotti finiti da stazioni e raccoglitori in quelle casse e, per ultimo, raccoglie e ripianta l'orto. Il deposito dell'urna è la borsa dello spirito per ciò che le casse non contengono. Tieni premuto E sull'urna per la borsa, il contenuto o la zona. Raccolta, l'urna conserva il teschio. Le zone di due urne non possono sovrapporsi, e puoi tenere un'urna ogni 500 morti a cui hai dato riposo.",赤い死体から取った頭蓋骨を納める葬送の壺。頭蓋骨を中に納めると、壺から霊が立ち上り、5×5の範囲(壺の1ブロック下から4ブロック上まで)を世話する。近くの箱から露集め器・養蜂箱・鶏小屋に消耗品を補充し、作業台や収集器の完成品をその箱へ運び、最後に畑の収穫と植え直しを行う。壺の収納は、箱に入りきらない物のための霊の鞄。壺に向けてEを長押しすると、鞄・中身・範囲表示を選べる。拾い上げても頭蓋骨は壺に残る。2つの壺の範囲は重ねられず、眠らせた死者500体ごとに壺を1つ持てる。,"붉은 시체에서 얻은 두개골을 모시는 장례용 항아리. 두개골을 안에 넣으면 항아리에서 영혼이 솟아올라 5×5 구역(항아리 한 칸 아래부터 네 칸 위까지)을 돌본다. 근처 상자에서 이슬 수집기, 양봉장, 닭장에 소모품을 채우고, 작업대와 수집기의 완성품을 그 상자로 옮기며, 마지막으로 밭을 수확하고 다시 심는다. 항아리의 저장 공간은 상자에 들어가지 않는 것을 담는 영혼의 가방이다. 항아리에 E를 길게 누르면 가방, 내용물, 구역 표시를 고를 수 있다. 주워도 두개골은 항아리에 남는다. 두 항아리의 구역은 겹칠 수 없고, 안식시킨 망자 500명마다 항아리를 하나 둘 수 있다.","Urna pogrzebowa, w której spoczywa czaszka wzięta z czerwonych zwłok. Włóż do niej czaszkę, a z urny uniesie się duch, który obsługuje obszar 5 na 5, od bloku pod urną do czterech nad nią: uzupełnia kolektory rosy, pasieki i kurniki tym, co leży w pobliskich skrzyniach, przenosi gotowe wyroby ze stanowisk i kolektorów do tych skrzyń, a na końcu zbiera plony i obsadza ogród na nowo. Schowek urny to torba ducha na to, co nie zmieści się w skrzyniach. Przytrzymaj E na urnie: torba, zawartość lub strefa. Podniesiona urna zachowuje czaszkę. Strefy dwóch urn nie mogą na siebie zachodzić, a jedną urnę możesz mieć na każde 500 zmarłych, których ukoiłeś.","Uma urna funerária que abriga um crânio tirado de um cadáver vermelho. Coloque o crânio dentro e um espírito surge da urna para cuidar da área de 5 por 5, de um bloco abaixo da urna até quatro acima: reabastece coletores de orvalho, apiários e galinheiros com o que há nos baús próximos, leva os produtos prontos das estações e coletores para esses baús e, por último, colhe e replanta a horta. O armazenamento da urna é a bolsa do espírito para o que não couber nos baús. Segure E na urna para a bolsa, o conteúdo ou a zona. Recolhida, a urna mantém o crânio. As zonas de duas urnas não podem se sobrepor, e você pode ter uma urna para cada 500 mortos que pôs para descansar.","Погребальная урна для черепа из красного трупа. Положите в неё череп - и из урны поднимется дух, который обслуживает участок 5 на 5, от блока под урной до четырёх над ней: подкладывает из ящиков рядом расходники сборщикам росы, пасекам и курятникам, переносит готовое из станций и коллекторов в эти ящики, а в последнюю очередь собирает урожай и засаживает грядки. Хранилище урны - сумка духа для того, что не влезло в ящики. Удерживайте E на урне: сумка, содержимое или зона. Поднятая урна сохраняет череп. Зоны двух урн не пересекаются; одну урну можно держать на каждые 500 упокоенных мертвецов.","Kırmızı bir cesetten alınmış kafatasını barındıran bir cenaze küpü. Kafatasını içine koy; küpten bir ruh yükselir ve 5'e 5'lik alana, küpün bir blok altından dört blok üstüne kadar bakar: yakındaki sandıklardan çiy toplayıcılara, arılıklara ve kümeslere sarf malzemesi koyar, tezgâhlardaki ve toplayıcılardaki hazır ürünleri bu sandıklara taşır ve en son bahçeyi hasat edip yeniden eker. Küpün deposu, sandıklara sığmayanlar için ruhun çantasıdır. Çanta, içerik ya da bölge için küpe E'yi basılı tut. Toplanan küp kafatasını korur. İki küpün bölgeleri çakışamaz; huzura kavuşturduğun her 500 ölü için bir küp tutabilirsin.",安放红色尸体头骨的葬瓮。把头骨放进瓮中,瓮中便会升起一个灵魂,照料5×5的范围(瓮下方1格到上方4格):用附近箱子里的物品为集露器、蜂房和鸡舍补充消耗品,把工作台和收集器的成品搬进这些箱子,最后收割并重新种植田地。瓮的储物空间是灵魂的背包,用来存放箱子装不下的东西。对着瓮长按E可选择背包、内容或显示区域。捡起瓮时头骨仍留在其中。两个瓮的区域不能重叠;每安息500个亡者可拥有一个瓮。,安放紅色屍體頭骨的葬甕。把頭骨放進甕中,甕中便會升起一個靈魂,照料5×5的範圍(甕下方1格到上方4格):用附近箱子裡的物品為集露器、蜂房和雞舍補充消耗品,把工作台和收集器的成品搬進這些箱子,最後收割並重新種植田地。甕的儲物空間是靈魂的背包,用來存放箱子裝不下的東西。對著甕長按E可選擇背包、內容或顯示區域。撿起甕時頭骨仍留在其中。兩個甕的區域不能重疊;每安息500個亡者可擁有一個甕。
+necroCinerariumDesc,blocks,Block,,,,"A funeral urn that houses a skull taken from a red corpse. Place the skull inside and a spirit rises from the urn to serve its 5 by 5 area, from one block below the urn to four above: it tops up dew collectors, apiaries and chicken coops from the boxes nearby, carries finished goods from workstations and collectors into those boxes, and last of all harvests and replants the garden. The urn's own storage is the spirit's bag for whatever the boxes cannot hold. Hold E on the urn for the bag, the contents or the zone. Picked up, the urn keeps its skull. Zones of two urns cannot overlap, and you may keep one urn for every 200 dead you have put to rest.",,"Eine Grabesurne für einen Schädel aus einer roten Leiche. Leg den Schädel hinein, und ein Geist steigt aus der Urne und versorgt ihre Fläche von 5 mal 5, von einem Block unter der Urne bis vier darüber: Er füllt Taukollektoren, Bienenstöcke und Hühnerställe aus den Kisten in der Nähe auf, trägt fertige Waren aus Werkbänken und Kollektoren in diese Kisten und erntet zuletzt den Garten ab und pflanzt neu. Der Speicher der Urne ist die Tasche des Geistes für alles, was die Kisten nicht fassen. Halte E an der Urne für Tasche, Inhalt oder Zone. Aufgehoben behält die Urne ihren Schädel. Die Zonen zweier Urnen dürfen sich nicht überschneiden, und du darfst je 200 zur Ruhe gebrachte Tote eine Urne halten.","Una urna funeraria que alberga un cráneo sacado de un cadáver rojo. Pon el cráneo dentro y un espíritu surgirá de la urna para atender su área de 5 por 5, desde un bloque bajo la urna hasta cuatro por encima: repone recolectores de rocío, colmenas y gallineros con lo que hay en los cofres cercanos, lleva los productos terminados de las estaciones y recolectores a esos cofres y, por último, cosecha y vuelve a plantar el huerto. El almacén de la urna es la bolsa del espíritu para lo que no quepa en los cofres. Mantén E sobre la urna para la bolsa, el contenido o la zona. Al recogerla, la urna conserva su cráneo. Las zonas de dos urnas no pueden solaparse, y puedes tener una urna por cada 200 muertos a los que hayas dado descanso.","Une urne funéraire qui abrite un crâne pris sur un cadavre rouge. Placez le crâne à l'intérieur et un esprit s'élève de l'urne pour servir sa zone de 5 sur 5, d'un bloc sous l'urne à quatre au-dessus : il réapprovisionne collecteurs de rosée, ruchers et poulaillers à partir des caisses voisines, porte les produits finis des établis et des collecteurs dans ces caisses et, en dernier, récolte et replante le jardin. Le stockage de l'urne est le sac de l'esprit pour ce que les caisses ne peuvent contenir. Maintenez E sur l'urne pour le sac, le contenu ou la zone. Ramassée, l'urne garde son crâne. Les zones de deux urnes ne peuvent pas se chevaucher, et vous pouvez garder une urne pour 200 morts que vous avez mis au repos.","Un'urna funeraria che custodisce un teschio preso da un cadavere rosso. Metti il teschio all'interno e uno spirito sorgerà dall'urna per servire la sua area di 5 per 5, da un blocco sotto l'urna fino a quattro sopra: rifornisce raccoglitori di rugiada, apiari e pollai con ciò che c'è nelle casse vicine, porta i prodotti finiti da stazioni e raccoglitori in quelle casse e, per ultimo, raccoglie e ripianta l'orto. Il deposito dell'urna è la borsa dello spirito per ciò che le casse non contengono. Tieni premuto E sull'urna per la borsa, il contenuto o la zona. Raccolta, l'urna conserva il teschio. Le zone di due urne non possono sovrapporsi, e puoi tenere un'urna ogni 200 morti a cui hai dato riposo.",赤い死体から取った頭蓋骨を納める葬送の壺。頭蓋骨を中に納めると、壺から霊が立ち上り、5×5の範囲(壺の1ブロック下から4ブロック上まで)を世話する。近くの箱から露集め器・養蜂箱・鶏小屋に消耗品を補充し、作業台や収集器の完成品をその箱へ運び、最後に畑の収穫と植え直しを行う。壺の収納は、箱に入りきらない物のための霊の鞄。壺に向けてEを長押しすると、鞄・中身・範囲表示を選べる。拾い上げても頭蓋骨は壺に残る。2つの壺の範囲は重ねられず、眠らせた死者200体ごとに壺を1つ持てる。,"붉은 시체에서 얻은 두개골을 모시는 장례용 항아리. 두개골을 안에 넣으면 항아리에서 영혼이 솟아올라 5×5 구역(항아리 한 칸 아래부터 네 칸 위까지)을 돌본다. 근처 상자에서 이슬 수집기, 양봉장, 닭장에 소모품을 채우고, 작업대와 수집기의 완성품을 그 상자로 옮기며, 마지막으로 밭을 수확하고 다시 심는다. 항아리의 저장 공간은 상자에 들어가지 않는 것을 담는 영혼의 가방이다. 항아리에 E를 길게 누르면 가방, 내용물, 구역 표시를 고를 수 있다. 주워도 두개골은 항아리에 남는다. 두 항아리의 구역은 겹칠 수 없고, 안식시킨 망자 200명마다 항아리를 하나 둘 수 있다.","Urna pogrzebowa, w której spoczywa czaszka wzięta z czerwonych zwłok. Włóż do niej czaszkę, a z urny uniesie się duch, który obsługuje obszar 5 na 5, od bloku pod urną do czterech nad nią: uzupełnia kolektory rosy, pasieki i kurniki tym, co leży w pobliskich skrzyniach, przenosi gotowe wyroby ze stanowisk i kolektorów do tych skrzyń, a na końcu zbiera plony i obsadza ogród na nowo. Schowek urny to torba ducha na to, co nie zmieści się w skrzyniach. Przytrzymaj E na urnie: torba, zawartość lub strefa. Podniesiona urna zachowuje czaszkę. Strefy dwóch urn nie mogą na siebie zachodzić, a jedną urnę możesz mieć na każde 200 zmarłych, których ukoiłeś.","Uma urna funerária que abriga um crânio tirado de um cadáver vermelho. Coloque o crânio dentro e um espírito surge da urna para cuidar da área de 5 por 5, de um bloco abaixo da urna até quatro acima: reabastece coletores de orvalho, apiários e galinheiros com o que há nos baús próximos, leva os produtos prontos das estações e coletores para esses baús e, por último, colhe e replanta a horta. O armazenamento da urna é a bolsa do espírito para o que não couber nos baús. Segure E na urna para a bolsa, o conteúdo ou a zona. Recolhida, a urna mantém o crânio. As zonas de duas urnas não podem se sobrepor, e você pode ter uma urna para cada 200 mortos que pôs para descansar.","Погребальная урна для черепа из красного трупа. Положите в неё череп - и из урны поднимется дух, который обслуживает участок 5 на 5, от блока под урной до четырёх над ней: подкладывает из ящиков рядом расходники сборщикам росы, пасекам и курятникам, переносит готовое из станций и коллекторов в эти ящики, а в последнюю очередь собирает урожай и засаживает грядки. Хранилище урны - сумка духа для того, что не влезло в ящики. Удерживайте E на урне: сумка, содержимое или зона. Поднятая урна сохраняет череп. Зоны двух урн не пересекаются; одну урну можно держать на каждые 200 упокоенных мертвецов.","Kırmızı bir cesetten alınmış kafatasını barındıran bir cenaze küpü. Kafatasını içine koy; küpten bir ruh yükselir ve 5'e 5'lik alana, küpün bir blok altından dört blok üstüne kadar bakar: yakındaki sandıklardan çiy toplayıcılara, arılıklara ve kümeslere sarf malzemesi koyar, tezgâhlardaki ve toplayıcılardaki hazır ürünleri bu sandıklara taşır ve en son bahçeyi hasat edip yeniden eker. Küpün deposu, sandıklara sığmayanlar için ruhun çantasıdır. Çanta, içerik ya da bölge için küpe E'yi basılı tut. Toplanan küp kafatasını korur. İki küpün bölgeleri çakışamaz; huzura kavuşturduğun her 200 ölü için bir küp tutabilirsin.",安放红色尸体头骨的葬瓮。把头骨放进瓮中,瓮中便会升起一个灵魂,照料5×5的范围(瓮下方1格到上方4格):用附近箱子里的物品为集露器、蜂房和鸡舍补充消耗品,把工作台和收集器的成品搬进这些箱子,最后收割并重新种植田地。瓮的储物空间是灵魂的背包,用来存放箱子装不下的东西。对着瓮长按E可选择背包、内容或显示区域。捡起瓮时头骨仍留在其中。两个瓮的区域不能重叠;每安息200个亡者可拥有一个瓮。,安放紅色屍體頭骨的葬甕。把頭骨放進甕中,甕中便會升起一個靈魂,照料5×5的範圍(甕下方1格到上方4格):用附近箱子裡的物品為集露器、蜂房和雞舍補充消耗品,把工作台和收集器的成品搬進這些箱子,最後收割並重新種植田地。甕的儲物空間是靈魂的背包,用來存放箱子裝不下的東西。對著甕長按E可選擇背包、內容或顯示區域。撿起甕時頭骨仍留在其中。兩個甕的區域不能重疊;每安息200個亡者可擁有一個甕。
necroCinerariumSkull,blocks,Block,,,,Harvest Cinerarium (with skull),,Ernte-Cinerarium (mit Schädel),Cinerario de cosecha (con cráneo),Cinéraire des moissons (avec crâne),Cinerario del raccolto (con teschio),収穫の納骨壺(頭蓋骨入り),수확의 유골함 (두개골 포함),Cinerarium żniw (z czaszką),Cinerário da colheita (com crânio),Цинерарий с черепом,Hasat Küllüğü (kafatasıyla),丰收骨灰瓮(含头骨),豐收骨灰甕(含頭骨)
necroCinerariumLogist,blocks,Block,,,,Logistics Cinerarium,,Logistik-Cinerarium,Cinerario logístico,Cinéraire logisticien,Cinerario logistico,物流の骨壺,물류 유골함,Cinerarium logistyczne,Cinerário logístico,Цинерарий-логист,Lojistik Küllüğü,物流骨灰瓮,物流骨灰甕
necroCinerariumLogistSkull,blocks,Block,,,,Logistics Cinerarium (with skull),,Logistik-Cinerarium (mit Schädel),Cinerario logístico (con cráneo),Cinéraire logisticien (avec crâne),Cinerario logistico (con teschio),物流の骨壺(頭蓋骨入り),물류 유골함 (두개골 포함),Cinerarium logistyczne (z czaszką),Cinerário logístico (com crânio),Цинерарий-логист (с черепом),Lojistik Küllüğü (kafatasıyla),物流骨灰瓮(含头骨),物流骨灰甕(含頭骨)
@@ -147,7 +149,7 @@ necroCinerariumLogistWall,blocks,Block,,,,Logistics Cinerarium (wall),,Logistik-
necroCinerariumLogistWallSkull,blocks,Block,,,,"Logistics Cinerarium (wall, with skull)",,"Logistik-Cinerarium (Wand, mit Schädel)","Cinerario logístico (pared, con cráneo)","Cinéraire logisticien (mural, avec crâne)","Cinerario logistico (a muro, con teschio)",物流の骨壺(壁掛け・頭蓋骨入り),"물류 유골함 (벽걸이, 두개골 포함)","Cinerarium logistyczne (ścienne, z czaszką)","Cinerário logístico (parede, com crânio)","Цинерарий-логист (на стене, с черепом)","Lojistik Küllüğü (duvar, kafatasıyla)",物流骨灰瓮(壁挂,含头骨),物流骨灰甕(壁掛,含頭骨)
necroCinerariumLogistFormCenter,UI,Text,,,,On a stand,,Auf einem Ständer,En un soporte,Sur un pied,Su un piedistallo,台座に置く,받침대 위,Na podstawie,Em um suporte,На подставке,Ayaklı,放在底座上,放在底座上
necroCinerariumLogistFormWall,UI,Text,,,,On a wall bracket,,An einer Wandhalterung,En un soporte de pared,Sur une applique murale,Su una mensola a muro,壁の腕木に掛ける,벽 받침대에,Na wsporniku ściennym,Em um suporte de parede,На кронштейне у стены,Duvar dirseğinde,挂在墙上支架,掛在牆上支架
-necroCinerariumLogistDesc,blocks,Block,,,,"An urn for a spirit that carries things between chests. It has no zone of its own and can stand right next to other urns. Place a skull inside, then tie it to chests with ghostly threads - the Necromancer's Knife in the thread grip (R). In its Contents, choose which item groups the spirit carries. Does not count toward the urn limit.",,"Eine Urne für einen Geist, der Dinge zwischen Truhen trägt. Sie hat keine eigene Zone und kann direkt neben anderen Urnen stehen. Leg einen Schädel hinein und verbinde sie mit geisterhaften Fäden mit Truhen - mit dem Messer des Nekromanten im Fadengriff (R). Im Inhalt wählst du, welche Gegenstandsgruppen der Geist trägt. Zählt nicht zum Urnenlimit.",Una urna para un espíritu que transporta cosas entre cofres. No tiene zona propia y puede estar junto a otras urnas. Pon un cráneo dentro y únela a cofres con hilos fantasmales: el Cuchillo del nigromante con agarre de hilos (R). En su Contenido eliges qué grupos de objetos transporta el espíritu. No cuenta para el límite de urnas.,"Une urne pour un esprit qui transporte des objets entre des coffres. Elle n'a pas de zone propre et peut se placer contre d'autres urnes. Place un crâne à l'intérieur, puis relie-la à des coffres par des fils spectraux - le Couteau du nécromancien en prise des fils (R). Dans son Contenu, choisis les groupes d'objets que l'esprit transporte. Ne compte pas dans la limite d'urnes.",Un'urna per uno spirito che trasporta oggetti tra forzieri. Non ha una zona propria e può stare accanto ad altre urne. Metti dentro un teschio e collegala ai forzieri con fili spettrali - il Coltello del negromante con la presa dei fili (R). Nel suo Contenuto scegli quali gruppi di oggetti trasporta lo spirito. Non conta nel limite di urne.,箱から箱へ物を運ぶ霊のための骨壺。自分の範囲を持たず、ほかの骨壺のすぐ隣に置ける。頭蓋骨を納め、ネクロマンサーのナイフの糸の握り(R)で霊の糸を箱へ張る。「中身」で、霊が運ぶ品目グループを選ぶ。骨壺の上限には数えない。,"상자 사이로 물건을 옮기는 영혼을 위한 유골함. 자기 구역이 없어 다른 유골함 바로 옆에 놓을 수 있습니다. 두개골을 넣고, 강령술사의 단검 실 쥐기(R)로 상자와 유령 실을 잇습니다. 내용물에서 영혼이 옮길 물품 그룹을 고릅니다. 유골함 한도에 포함되지 않습니다.","Urna dla ducha, który przenosi rzeczy między skrzyniami. Nie ma własnej strefy i może stać tuż obok innych urn. Włóż do niej czaszkę i połącz ją ze skrzyniami widmowymi nićmi - nożem nekromanty w chwycie do nici (R). W Zawartości wybierasz, jakie grupy przedmiotów duch przenosi. Nie wlicza się do limitu urn.","Uma urna para um espírito que leva coisas entre baús. Não tem zona própria e pode ficar ao lado de outras urnas. Coloque um crânio dentro e ligue-a a baús com fios fantasmagóricos - a Faca do necromante na pegada de fios (R). No Conteúdo, escolha quais grupos de itens o espírito leva. Não conta no limite de urnas.","Урна для духа, который носит вещи между ящиками. Своей зоны у неё нет, она ставится вплотную к другим урнам. Положите в неё череп и свяжите с ящиками призрачными нитями - ножом некроманта хватом для нитей (R). В «Содержимом» выбирается, какие группы предметов дух носит. В лимит урн не входит.","Eşyaları sandıklar arasında taşıyan bir ruh için küllük. Kendi bölgesi yoktur, diğer küllüklerin hemen yanına konabilir. İçine bir kafatası koy ve Nekromantın Bıçağı'nın iplik tutuşuyla (R) onu sandıklara hayalet ipliklerle bağla. İçerik penceresinde ruhun hangi eşya gruplarını taşıyacağını seç. Küllük sınırına sayılmaz.",供在箱子之间搬运物品的灵所用的骨灰瓮。它没有自己的区域,可以紧挨其他骨灰瓮放置。放入头骨,再用亡灵法师之刃的牵线握法(R)以幽灵丝线连到箱子。在「内容」里选择灵搬运哪些物品分组。不计入骨灰瓮数量上限。,供在箱子之間搬運物品的靈所用的骨灰甕。它沒有自己的區域,可以緊挨其他骨灰甕放置。放入頭骨,再用亡靈法師之刃的牽線握法(R)以幽靈絲線連到箱子。在「內容」裡選擇靈搬運哪些物品分組。不計入骨灰甕數量上限。
+necroCinerariumLogistDesc,blocks,Block,,,,"A brass censer for a spirit that carries things between chests. It stands on its stand in the middle of a block or hangs on a wall bracket - hold [action:permanent:Reload][action:local:Reload] to choose. It has no zone of its own and can stand right next to other urns. Place a skull inside, then tie it to chests with ghostly threads - the Necromancer's Knife in the thread grip (R); a skull set out as decor passes a thread on farther. The small spirit leaves the censer only to carry, and if the chest it carries to is full, the censer blinks. In its Contents, choose which item groups the spirit carries. Does not count toward the urn limit.",,"Ein Messing-Räuchergefäß für einen Geist, der Dinge zwischen Truhen trägt. Es steht auf seinem Fuß mitten im Block oder hängt an einem Wandarm - halte [action:permanent:Reload][action:local:Reload] zum Wählen. Es hat keine eigene Zone und kann direkt neben anderen Urnen stehen. Leg einen Schädel hinein und verbinde es mit geisterhaften Fäden mit Truhen - mit dem Messer des Nekromanten im Fadengriff (R); ein als Deko aufgestellter Schädel leitet einen Faden weiter. Der kleine Geist verlässt das Gefäß nur zum Tragen, und ist die Zieltruhe voll, blinkt das Gefäß. Im Inhalt wählst du, welche Gegenstandsgruppen der Geist trägt. Zählt nicht zum Urnenlimit.","Un incensario de latón para un espíritu que lleva cosas entre cofres. Se apoya en su pie en el centro de un bloque o cuelga de un soporte de pared: mantén [action:permanent:Reload][action:local:Reload] para elegir. No tiene zona propia y puede estar justo al lado de otras urnas. Pon un cráneo dentro y átalo a los cofres con hilos fantasmales: el Cuchillo del Nigromante en agarre de hilo (R); un cráneo colocado como decoración lleva un hilo más lejos. El pequeño espíritu solo sale del incensario para cargar, y si el cofre de destino está lleno, el incensario parpadea. En su Contenido eliges qué grupos de objetos lleva el espíritu. No cuenta para el límite de urnas.","Un encensoir en laiton pour un esprit qui transporte des objets entre les coffres. Il se pose sur son pied au milieu d'un bloc ou se suspend à une applique murale - maintiens [action:permanent:Reload][action:local:Reload] pour choisir. Il n'a pas de zone et peut se placer juste à côté d'autres urnes. Mets un crâne à l'intérieur, puis relie-le aux coffres par des fils fantomatiques - le Couteau du Nécromancien en prise de fil (R) ; un crâne posé en décor relaie un fil plus loin. Le petit esprit ne quitte l'encensoir que pour transporter, et si le coffre de destination est plein, l'encensoir clignote. Dans son Contenu, choisis les groupes d'objets que l'esprit transporte. Ne compte pas dans la limite d'urnes.","Un turibolo d'ottone per uno spirito che porta oggetti tra i forzieri. Sta sul suo piedistallo al centro di un blocco o pende da una mensola a muro: tieni premuto [action:permanent:Reload][action:local:Reload] per scegliere. Non ha una zona propria e può stare accanto ad altre urne. Metti un teschio dentro, poi collegalo ai forzieri con fili spettrali: il Coltello del Negromante nella presa da filo (R); un teschio messo come decorazione porta un filo più lontano. Il piccolo spirito esce dal turibolo solo per trasportare, e se il forziere di destinazione è pieno, il turibolo lampeggia. Nel suo Contenuto scegli quali gruppi di oggetti porta lo spirito. Non conta nel limite di urne.",箱から箱へ物を運ぶ霊のための真鍮の香炉。ブロック中央の台座に置くか、壁の腕木に掛ける――[action:permanent:Reload][action:local:Reload]長押しで選ぶ。自分のゾーンを持たず、他の骨壺のすぐ隣にも置ける。頭蓋骨を入れ、霊の糸で箱とつなぐ――糸の握りにした死霊術師のナイフ(R)で。飾りとして置いた頭蓋骨は糸をさらに先へ中継する。小さな霊は運ぶときだけ香炉から出てきて、運び先の箱が満杯だと香炉が点滅する。中身の画面で、霊が運ぶアイテムの種類を選ぶ。骨壺の上限には数えない。,"상자 사이로 물건을 나르는 영혼을 위한 놋쇠 향로. 블록 가운데 받침대에 놓거나 벽 받침대에 건다 - [action:permanent:Reload][action:local:Reload]을 길게 눌러 고른다. 자기 구역이 없어 다른 유골함 바로 옆에도 둘 수 있다. 두개골을 넣고 유령 실로 상자와 잇는다 - 실 잡기로 쥔 강령술사의 칼(R)로. 장식으로 놓은 두개골은 실을 더 멀리 이어 준다. 작은 영혼은 나를 때만 향로에서 나오고, 보낼 상자가 가득 차면 향로가 깜빡인다. 내용물 창에서 영혼이 나를 아이템 종류를 고른다. 유골함 한도에 포함되지 않는다.","Mosiężna kadzielnica dla ducha, który przenosi rzeczy między skrzyniami. Stoi na swojej podstawie pośrodku bloku albo wisi na wsporniku ściennym - przytrzymaj [action:permanent:Reload][action:local:Reload], by wybrać. Nie ma własnej strefy i może stać tuż obok innych urn. Włóż do środka czaszkę, a potem połącz ją ze skrzyniami widmowymi nićmi - Nożem Nekromanty w chwycie do nici (R); czaszka postawiona jako ozdoba przekazuje nić dalej. Mały duch wylatuje z kadzielnicy tylko po to, by nieść, a gdy skrzynia docelowa jest pełna, kadzielnica mruga. W Zawartości wybierasz, jakie grupy przedmiotów niesie duch. Nie liczy się do limitu urn.","Um incensário de latão para um espírito que leva coisas entre baús. Fica em seu pé no centro de um bloco ou pendurado num suporte de parede - segure [action:permanent:Reload][action:local:Reload] para escolher. Não tem zona própria e pode ficar bem ao lado de outras urnas. Coloque um crânio dentro e ligue-o aos baús com fios fantasmagóricos - a Faca do Necromante na pegada de fio (R); um crânio colocado como decoração leva um fio mais longe. O pequeno espírito só sai do incensário para carregar, e se o baú de destino estiver cheio, o incensário pisca. Em Conteúdo, escolha quais grupos de itens o espírito leva. Não conta para o limite de urnas.","Латунное кадило для духа, который переносит вещи между ящиками. Стоит на подставке посреди блока или висит на кронштейне у стены - удерживай [action:permanent:Reload][action:local:Reload], чтобы выбрать. Своей зоны нет, можно ставить вплотную к другим урнам. Положи внутрь череп и протяни от кадила призрачные нити к ящикам - нож некроманта хватом для нитей (R); череп, выставленный как декор, передаёт нить дальше. Маленький дух вылетает из кадила только на перевозку, а если ящик «куда» полон - кадило мигает. В «Содержимом» выбери, какие группы предметов переносит дух. В лимит урн не входит.","Sandıklar arasında eşya taşıyan bir ruh için pirinç bir buhurdan. Bir bloğun ortasında ayağının üstünde durur ya da duvar dirseğine asılır - seçmek için [action:permanent:Reload][action:local:Reload] basılı tut. Kendi bölgesi yoktur, diğer küllüklerin hemen yanına konabilir. İçine bir kafatası koy, sonra hayalet ipliklerle sandıklara bağla - iplik tutuşundaki Nekromansör Bıçağıyla (R); süs olarak konan bir kafatası ipliği daha uzağa aktarır. Küçük ruh buhurdandan yalnızca taşımak için çıkar, hedef sandık doluysa buhurdan yanıp söner. İçerik bölümünde ruhun hangi eşya gruplarını taşıyacağını seç. Küllük sınırına sayılmaz.",一座黄铜香炉,供在箱子之间搬运物品的灵魂栖身。可放在方块中央的底座上,或挂在墙上的支架上——长按[action:permanent:Reload][action:local:Reload]选择。它没有自己的区域,可以紧挨其他骨灰瓮摆放。放入一颗头骨,再用幽灵丝线把它与箱子相连——用丝线握法的死灵法师之刃(R);作为装饰摆放的头骨能把丝线继续传向更远处。小灵魂只在搬运时离开香炉;若目标箱子已满,香炉会闪烁。在“内容”中选择灵魂搬运哪些物品类别。不计入骨灰瓮上限。,一座黃銅香爐,供在箱子之間搬運物品的靈魂棲身。可放在方塊中央的底座上,或掛在牆上的支架上——長按[action:permanent:Reload][action:local:Reload]選擇。它沒有自己的區域,可以緊挨其他骨灰甕擺放。放入一顆頭骨,再用幽靈絲線把它與箱子相連——用絲線握法的死靈法師之刃(R);作為裝飾擺放的頭骨能把絲線繼續傳向更遠處。小靈魂只在搬運時離開香爐;若目標箱子已滿,香爐會閃爍。在「內容」中選擇靈魂搬運哪些物品類別。不計入骨灰甕上限。
necroCinerariumWorker,blocks,Block,,,,Worker Cinerarium,,Arbeiter-Cinerarium,Cinerario obrero,Cinéraire ouvrier,Cinerario operaio,職人の骨壺,일꾼 유골함,Cinerarium robotnika,Cinerário operário,Цинерарий-рабочий,İşçi Küllüğü,工匠骨灰瓮,工匠骨灰甕
necroCinerariumWorkerSkull,blocks,Block,,,,Worker Cinerarium (with skull),,Arbeiter-Cinerarium (mit Schädel),Cinerario obrero (con cráneo),Cinéraire ouvrier (avec crâne),Cinerario operaio (con teschio),職人の骨壺(頭蓋骨入り),일꾼 유골함 (두개골 포함),Cinerarium robotnika (z czaszką),Cinerário operário (com crânio),Цинерарий-рабочий (с черепом),İşçi Küllüğü (kafatasıyla),工匠骨灰瓮(含头骨),工匠骨灰甕(含頭骨)
necroCinerariumWorkerDesc,blocks,Block,,,,"An urn for a spirit that crafts. In its Contents, put a skull in the first slot and a sample in the second: the spirit makes that item on workstations until there are as many as in the sample's stack. Tie threads with the Necromancer's Knife in the thread grip (R): chest to urn - ingredients and fuel; urn to workstation - where to craft; urn to chest - where to put the goods (without it they stay in the station). Lights and puts out campfires, forges and chemistry stations by itself. Has no zone of its own and does not count toward the urn limit.",,"Eine Urne für einen Geist, der herstellt. Im Inhalt kommt ein Schädel in das erste Feld und ein Muster in das zweite: Der Geist stellt diesen Gegenstand an Werkstationen her, bis es so viele gibt wie im Stapel des Musters. Fäden ziehst du mit dem Messer des Nekromanten im Fadengriff (R): Truhe zur Urne - Zutaten und Brennstoff; Urne zur Werkstation - wo hergestellt wird; Urne zur Truhe - wohin die Ware kommt (ohne sie bleibt sie in der Station). Zündet Lagerfeuer, Schmiede und Chemiestation selbst an und löscht sie. Hat keine eigene Zone und zählt nicht zum Urnenlimit.","Una urna para un espíritu que fabrica. En su Contenido, pon un cráneo en la primera casilla y una muestra en la segunda: el espíritu fabrica ese objeto en estaciones de trabajo hasta tener tantos como en la pila de la muestra. Los hilos se tienden con el Cuchillo del nigromante en agarre de hilos (R): cofre a urna - ingredientes y combustible; urna a estación - dónde fabricar; urna a cofre - dónde dejar lo hecho (sin él se queda en la estación). Enciende y apaga solo hogueras, forjas y estaciones de química. No tiene zona propia y no cuenta para el límite de urnas.","Une urne pour un esprit qui fabrique. Dans son Contenu, mets un crâne dans la première case et un modèle dans la seconde : l'esprit fabrique cet objet aux postes de travail jusqu'à en avoir autant que dans la pile du modèle. Les fils se tendent avec le Couteau du nécromancien en prise des fils (R) : coffre vers urne - ingrédients et combustible ; urne vers poste - où fabriquer ; urne vers coffre - où ranger la production (sans lui, elle reste dans le poste). Allume et éteint seul feux de camp, forges et stations de chimie. N'a pas de zone propre et ne compte pas dans la limite d'urnes.","Un'urna per uno spirito che fabbrica. Nel suo Contenuto metti un teschio nella prima casella e un campione nella seconda: lo spirito fabbrica quell'oggetto alle postazioni finché non ce ne sono tanti quanti nella pila del campione. I fili si tendono con il Coltello del negromante nella presa dei fili (R): forziere verso urna - ingredienti e combustibile; urna verso postazione - dove fabbricare; urna verso forziere - dove mettere i prodotti (senza, restano nella postazione). Accende e spegne da solo falò, forge e stazioni chimiche. Non ha una zona propria e non conta nel limite di urne.",作る霊のための骨壺。「中身」の1つ目の枠に頭蓋骨、2つ目に見本を入れると、見本の数と同じだけ揃うまで、霊が作業台でその品を作る。糸はネクロマンサーのナイフの糸の握り(R)で張る:箱から骨壺へ - 材料と燃料、骨壺から作業台へ - どこで作るか、骨壺から箱へ - 完成品の置き場(無ければ作業台に残る)。たき火・炉・化学ステーションの火は霊が自分で点けて消す。自分の範囲を持たず、骨壺の上限には数えない。,"제작하는 영혼을 위한 유골함. 내용물의 첫 칸에 두개골, 둘째 칸에 견본을 넣으면, 견본 묶음 수만큼 쌓일 때까지 영혼이 작업대에서 그 물건을 만듭니다. 실은 강령술사의 단검 실 쥐기(R)로 잇습니다: 상자에서 유골함 - 재료와 연료, 유골함에서 작업대 - 어디서 만들지, 유골함에서 상자 - 완성품을 둘 곳(없으면 작업대에 남음). 모닥불, 용광로, 화학 작업대는 스스로 켜고 끕니다. 자기 구역이 없고 유골함 한도에 포함되지 않습니다.","Urna dla ducha, który wytwarza. W Zawartości włóż czaszkę do pierwszego pola, a wzór do drugiego: duch wytwarza ten przedmiot na stanowiskach, aż będzie ich tyle, ile w stosie wzoru. Nici zaczepiasz nożem nekromanty w chwycie do nici (R): skrzynia do urny - składniki i paliwo; urna do stanowiska - gdzie wytwarzać; urna do skrzyni - gdzie odkładać wyroby (bez niej zostają w stanowisku). Sam rozpala i gasi ogniska, kuźnie i stacje chemiczne. Nie ma własnej strefy i nie wlicza się do limitu urn.","Uma urna para um espírito que fabrica. No Conteúdo, coloque um crânio no primeiro espaço e uma amostra no segundo: o espírito fabrica esse item nas estações até haver tantos quanto na pilha da amostra. Os fios se puxam com a Faca do necromante na pegada de fios (R): baú para urna - ingredientes e combustível; urna para estação - onde fabricar; urna para baú - onde guardar o produto (sem ele, fica na estação). Acende e apaga sozinho fogueiras, forjas e estações químicas. Não tem zona própria e não conta no limite de urnas.","Урна для духа-ремесленника. В «Содержимом» в первую ячейку кладётся череп, во вторую - образец: дух изготавливает этот предмет на станциях, пока их не станет столько, сколько в стопке образца. Нити тянутся ножом некроманта хватом для нитей (R): ящик -> урна - ингредиенты и топливо; урна -> станция - где изготавливать; урна -> ящик - куда класть готовое (без неё оно остаётся в станции). Костёр, кузню и химстанцию дух разжигает и гасит сам. Своей зоны у урны нет, в лимит урн она не входит.","Üreten bir ruh için küllük. İçerik penceresinde ilk yuvaya bir kafatası, ikinciye bir örnek koy: ruh, örnek yığınındaki kadar olana dek o eşyayı tezgâhlarda üretir. İplikler Nekromantın Bıçağı'nın iplik tutuşuyla (R) çekilir: sandıktan küllüğe - malzeme ve yakıt; küllükten tezgâha - nerede üretileceği; küllükten sandığa - ürünlerin konacağı yer (yoksa tezgâhta kalır). Kamp ateşini, demirci ocağını ve kimya istasyonunu kendisi yakar ve söndürür. Kendi bölgesi yoktur ve küllük sınırına sayılmaz.",供制作物品的灵所用的骨灰瓮。在「内容」里第一格放头骨,第二格放样品:灵会在工作台上制作该物品,直到数量与样品堆叠数相同。用亡灵法师之刃的牵线握法(R)拉线:箱子到骨灰瓮——材料和燃料;骨灰瓮到工作台——在哪里制作;骨灰瓮到箱子——成品放在哪里(没有则留在工作台里)。篝火、熔炉和化学工作台由灵自己点燃和熄灭。它没有自己的区域,不计入骨灰瓮数量上限。,供製作物品的靈所用的骨灰甕。在「內容」裡第一格放頭骨,第二格放樣品:靈會在工作台上製作該物品,直到數量與樣品堆疊數相同。用亡靈法師之刃的牽線握法(R)拉線:箱子到骨灰甕——材料和燃料;骨灰甕到工作台——在哪裡製作;骨灰甕到箱子——成品放在哪裡(沒有則留在工作台裡)。篝火、熔爐和化學工作台由靈自己點燃和熄滅。它沒有自己的區域,不計入骨灰甕數量上限。
@@ -170,7 +172,7 @@ blockcommand_bounds_hide,blocks,Block,,,,Hide Zone,,Zone ausblenden,Ocultar zona
necroCinerariumStateSkull,blocks,Block,,,,skull inside,,Schädel darin,con cráneo,crâne à l'intérieur,teschio dentro,頭蓋骨あり,두개골 있음,czaszka w środku,com crânio,череп внутри,kafatası içinde,已放头骨,已放頭骨
necroCinerariumStateEmpty,blocks,Block,,,,no skull,,kein Schädel,sin cráneo,pas de crâne,nessun teschio,頭蓋骨なし,두개골 없음,brak czaszki,sem crânio,черепа нет,kafatası yok,没有头骨,沒有頭骨
necroCinerariumOverlap,UI,Tooltip,,,,Too close to another cinerarium: their zones would overlap,,Zu nah an einem anderen Cinerarium: die Zonen würden sich überschneiden,Demasiado cerca de otro cinerario: sus zonas se solaparían,Trop près d'un autre cinéraire : leurs zones se chevaucheraient,Troppo vicino a un altro cinerario: le zone si sovrapporrebbero,別の納骨壺に近すぎる:範囲が重なる,다른 유골함과 너무 가깝다: 구역이 겹친다,Za blisko innego cinerarium: strefy by się nałożyły,Perto demais de outro cinerário: as zonas se sobreporiam,Слишком близко к другому цинерарию: зоны пересекутся,Başka bir küllüğe çok yakın: bölgeler çakışır,离另一个骨灰瓮太近:区域会重叠,離另一個骨灰甕太近:區域會重疊
-necroCinerariumLimit,UI,Tooltip,,,,No more cinerariums for now: one for every 500 dead put to rest,,Vorerst keine weiteren Cinerarien: eines je 500 zur Ruhe gebrachte Tote,No puedes tener más cinerarios por ahora: uno por cada 500 muertos en descanso,Pas d'autre cinéraire pour l'instant : un pour 500 morts mis au repos,Nessun altro cinerario per ora: uno ogni 500 morti messi a riposo,今はこれ以上置けない:眠らせた死者500体ごとに1つ,지금은 더 둘 수 없다: 안식시킨 망자 500명마다 하나,Na razie nie więcej cinerariów: jedno na 500 ukojonych zmarłych,Nada de mais cinerários por enquanto: um a cada 500 mortos em descanso,Больше цинерариев пока нельзя: один на каждые 500 упокоенных,Şimdilik daha fazla küllük yok: huzura kavuşan her 500 ölü için bir,暂时不能再放骨灰瓮:每安息500个亡者一个,暫時不能再放骨灰甕:每安息500個亡者一個
+necroCinerariumLimit,UI,Tooltip,,,,No more cinerariums for now: one for every 200 dead put to rest,,Vorerst keine weiteren Cinerarien: eines je 200 zur Ruhe gebrachte Tote,No puedes tener más cinerarios por ahora: uno por cada 200 muertos en descanso,Pas d'autre cinéraire pour l'instant : un pour 200 morts mis au repos,Nessun altro cinerario per ora: uno ogni 200 morti messi a riposo,今はこれ以上置けない:眠らせた死者200体ごとに1つ,지금은 더 둘 수 없다: 안식시킨 망자 200명마다 하나,Na razie nie więcej cinerariów: jedno na 200 ukojonych zmarłych,Nada de mais cinerários por enquanto: um a cada 200 mortos em descanso,Больше цинерариев пока нельзя: один на каждые 200 упокоенных,Şimdilik daha fazla küllük yok: huzura kavuşan her 200 ölü için bir,暂时不能再放骨灰瓮:每安息200个亡者一个,暫時不能再放骨灰甕:每安息200個亡者一個
necroModKnifeTearsOfTheDead,item_modifiers,Item,,,,Tears of the Dead,,Tränen des Toten,Lágrimas del muerto,Larmes du mort,Lacrime del morto,死者の涙,죽은 자의 눈물,Łzy umarłego,Lágrimas do morto,Слёзы мертвеца,Ölünün Gözyaşları,亡者之泪,亡者之淚
necroModKnifeTearsOfTheDeadDesc,item_modifiers,Item,,,,"A modification for the Necromancer's Knife alone. Every zombie the blade kills gives up what little moisture it has left: 2 units of water, drawn straight out of the corpse. Ordinary knife mods will not fit this weapon, and this one will not fit any other.",,"Eine Modifikation ausschließlich für das Messer des Nekromanten. Jeder Zombie, den die Klinge tötet, gibt her, was ihm an Feuchtigkeit noch geblieben ist: 2 Einheiten Wasser, direkt aus der Leiche gezogen. Gewöhnliche Messermodifikationen passen nicht in diese Waffe, und diese hier passt in keine andere.","Una modificación exclusiva para el Cuchillo del nigromante. Cada zombi que la hoja mata entrega la poca humedad que le queda: 2 unidades de agua, extraídas directamente del cadáver. Las modificaciones de cuchillo corrientes no encajan en esta arma, y esta no encaja en ninguna otra.","Une modification réservée au seul Couteau du nécromancien. Chaque zombie tué par la lame rend le peu d'humidité qui lui restait : 2 unités d'eau, tirées droit du cadavre. Les modifications de couteau ordinaires n'entrent pas dans cette arme, et celle-ci n'entre dans aucune autre.","Una modifica esclusiva per il Coltello del negromante. Ogni zombie ucciso dalla lama cede quel poco di umidità che gli resta: 2 unità d'acqua, estratte direttamente dal cadavere. Le modifiche per coltelli comuni non entrano in quest'arma, e questa non entra in nessun'altra.",ネクロマンサーのナイフ専用の改造パーツ。この刃に倒されたゾンビは、残されたわずかな水分を差し出す。死体から直に引き出された水2単位だ。通常のナイフ用改造パーツはこの武器に取り付けられず、これも他のどんな武器にも取り付けられない。,"강령술사의 단검 전용 개조 부품입니다. 칼날에 쓰러진 좀비는 남아 있던 얼마 안 되는 수분을 내놓습니다. 시체에서 곧바로 뽑아낸 물 2단위입니다. 일반 단검용 부품은 이 무기에 장착되지 않으며, 이 부품도 다른 무기에는 장착되지 않습니다.","Modyfikacja wyłącznie do Noża nekromanty. Każde zombie zabite tym ostrzem oddaje tę odrobinę wilgoci, jaka mu jeszcze została: 2 jednostki wody, wyciągnięte prosto ze zwłok. Zwykłe modyfikacje do noży nie pasują do tej broni, a ta nie pasuje do żadnej innej.","Uma modificação exclusiva para a Faca do necromante. Cada zumbi que a lâmina mata entrega a pouca umidade que lhe resta: 2 unidades de água, tiradas direto do cadáver. Modificações comuns de faca não servem nesta arma, e esta não serve em nenhuma outra.","Модификация только для Ножа некроманта. Каждый убитый клинком зомби отдаёт ту каплю влаги, что в нём ещё осталась: 2 единицы воды, вытянутые прямо из трупа. Обычные моды для ножей в это оружие не встанут, а этот не встанет ни во что другое.","Yalnızca Nekromantın Bıçağı'na özel bir modifikasyon. Bıçağın öldürdüğü her zombi, kendisinde kalan az miktardaki nemi verir: doğrudan cesetten çekilmiş 2 birim su. Sıradan bıçak modifikasyonları bu silaha takılmaz, bu da başka hiçbir silaha takılmaz.",亡灵法师之刃专用的改装件。被此刃杀死的每一只僵尸都会交出它仅存的那点水分:2 单位水,直接自尸体中抽出。寻常的匕首改装件装不进这把武器,而这一件也装不进其他任何武器。,亡靈法師之刃專用的改裝件。被此刃殺死的每一隻殭屍都會交出牠僅存的那點水分:2 單位水,直接自屍體中抽出。尋常的匕首改裝件裝不進這把武器,而這一件也裝不進其他任何武器。
necroModKnifeScavengersFeast,item_modifiers,Item,,,,Scavenger's Feast,,Festmahl des Aasfressers,Festín del carroñero,Festin du charognard,Banchetto dello spazzino,腐肉喰らいの宴,시체 청소부의 만찬,Uczta padlinożercy,Banquete do carniceiro,Пир падальщика,Leşçinin Ziyafeti,食腐者的盛宴,食腐者的盛宴
@@ -513,5 +515,5 @@ resourceNecroBlackRoseJuiceDesc,items,Item,,,,"A jar of ink-black juice pressed
necroSkullDecor,blocks,Block,,,,Skull (decor),,Schädel (Deko),Cráneo (decoración),Crâne (décor),Teschio (decorazione),頭蓋骨(装飾),두개골 (장식),Czaszka (dekoracja),Crânio (decoração),Череп (декор),Kafatası (dekor),头骨(装饰),頭骨(裝飾)
necroSkullDecorCenter,blocks,Block,,,,Skull: in the middle,,Schädel: in der Mitte,Cráneo: en el centro,Crâne : au centre,Teschio: al centro,頭蓋骨:中央,두개골: 가운데,Czaszka: na środku,Crânio: no centro,Череп: по центру,Kafatası: ortada,头骨:居中,頭骨:置中
necroSkullDecorBack,blocks,Block,,,,Skull: against the wall,,Schädel: an der Wand,Cráneo: contra la pared,Crâne : contre le mur,Teschio: contro il muro,頭蓋骨:壁際,두개골: 벽에 붙여,Czaszka: przy ścianie,Crânio: encostado na parede,Череп: у стены,Kafatası: duvara dayalı,头骨:靠墙,頭骨:靠牆
-necroSkullDecorDesc,blocks,Block,,,,"A skull ready to be placed as decor. Hold [action:permanent:Reload][action:local:Reload] for block rotation, the other look, or to turn it back into a skull. Picked up, it is a skull again.",,"Ein Schädel, bereit zum Platzieren als Deko. Halte [action:permanent:Reload][action:local:Reload] für Blockdrehung, die andere Ansicht oder um ihn wieder zum Schädel zu machen. Aufgehoben ist er wieder ein Schädel.","Un cráneo listo para colocarse como decoración. Mantén [action:permanent:Reload][action:local:Reload] para girar el bloque, cambiar de aspecto o volver a convertirlo en cráneo. Al recogerlo vuelve a ser un cráneo.","Un crâne prêt à être posé en décor. Maintiens [action:permanent:Reload][action:local:Reload] pour la rotation du bloc, l'autre aspect ou pour le redevenir crâne. Ramassé, il redevient un crâne.","Un teschio pronto da posare come decorazione. Tieni premuto [action:permanent:Reload][action:local:Reload] per ruotare il blocco, cambiare aspetto o tornare teschio. Raccolto, torna un teschio.",飾りとして置ける頭蓋骨。[action:permanent:Reload][action:local:Reload]を長押しでブロックの回転、もう一方の置き方、頭蓋骨に戻す。拾えば頭蓋骨に戻る。,"장식으로 놓을 수 있는 두개골. [action:permanent:Reload][action:local:Reload]을 길게 눌러 블록 회전, 다른 모양, 또는 다시 두개골로. 주우면 다시 두개골입니다.","Czaszka gotowa do postawienia jako dekoracja. Przytrzymaj [action:permanent:Reload][action:local:Reload]: obrót bloku, drugi wygląd albo powrót do czaszki. Podniesiona znów jest czaszką.","Um crânio pronto para ser colocado como decoração. Segure [action:permanent:Reload][action:local:Reload] para girar o bloco, trocar de aparência ou voltar a ser crânio. Recolhido, volta a ser crânio.","Череп, готовый встать декором. Удерживайте [action:permanent:Reload][action:local:Reload]: поворот блока, второй вид или обратно в череп. Поднятый снова станет черепом.","Dekor olarak konmaya hazır bir kafatası. [action:permanent:Reload][action:local:Reload] tuşunu basılı tut: blok döndürme, diğer görünüm ya da yeniden kafatası. Yerden alınınca yine kafatasıdır.",可作为装饰放置的头骨。按住[action:permanent:Reload][action:local:Reload]:旋转方块、切换另一种摆法或变回头骨。捡起后又是头骨。,可作為裝飾放置的頭骨。按住[action:permanent:Reload][action:local:Reload]:旋轉方塊、切換另一種擺法或變回頭骨。撿起後又是頭骨。
+necroSkullDecorDesc,blocks,Block,,,,"A skull ready to be placed as decor. Hold [action:permanent:Reload][action:local:Reload] for block rotation, the other look, or to turn it back into a skull. Picked up, it is a skull again. A skull on display also relays a cinerarium's ghostly thread: pass a thread through it to reach farther.",,"Ein Schädel, bereit zum Platzieren als Deko. Halte [action:permanent:Reload][action:local:Reload] für Blockdrehung, die andere Ansicht oder um ihn wieder zum Schädel zu machen. Aufgehoben ist er wieder ein Schädel. Ein ausgestellter Schädel leitet auch den Geisterfaden eines Cinerariums weiter: Führe einen Faden hindurch, um weiter zu reichen.","Un cráneo listo para colocarse como decoración. Mantén [action:permanent:Reload][action:local:Reload] para girar el bloque, cambiar de aspecto o volver a convertirlo en cráneo. Al recogerlo vuelve a ser un cráneo. Un cráneo expuesto también transmite el hilo fantasmal de un cinerario: pasa un hilo por él para llegar más lejos.","Un crâne prêt à être posé en décor. Maintiens [action:permanent:Reload][action:local:Reload] pour pivoter le bloc, changer d'aspect ou le reconvertir en crâne. Ramassé, il redevient un crâne. Un crâne exposé relaie aussi le fil fantomatique d'un cinéraire : fais-y passer un fil pour aller plus loin.","Un teschio pronto da posizionare come decorazione. Tieni premuto [action:permanent:Reload][action:local:Reload] per ruotare il blocco, cambiare aspetto o farlo tornare un teschio. Raccolto, torna un teschio. Un teschio esposto trasmette anche il filo spettrale di un cinerario: fai passare un filo attraverso di esso per arrivare più lontano.",飾りとして置ける頭蓋骨。[action:permanent:Reload][action:local:Reload]長押しでブロックの回転、もう一つの見た目、頭蓋骨への戻しを選ぶ。拾うと頭蓋骨に戻る。飾った頭蓋骨は骨壺の霊の糸を中継する――糸を通せばさらに遠くまで届く。,"장식으로 놓을 수 있는 두개골. [action:permanent:Reload][action:local:Reload]을 길게 눌러 블록 회전, 다른 모양, 두개골로 되돌리기를 고른다. 주우면 다시 두개골이 된다. 장식한 두개골은 유골함의 유령 실을 이어 준다 - 실을 통과시켜 더 멀리 닿게 하라.","Czaszka gotowa do postawienia jako ozdoba. Przytrzymaj [action:permanent:Reload][action:local:Reload], by obrócić blok, zmienić wygląd albo z powrotem zrobić z niej czaszkę. Podniesiona znów jest czaszką. Wystawiona czaszka przekazuje też widmową nić cinerarium: przeprowadź przez nią nić, by sięgnąć dalej.","Um crânio pronto para ser colocado como decoração. Segure [action:permanent:Reload][action:local:Reload] para girar o bloco, mudar o visual ou voltar a ser crânio. Recolhido, vira crânio de novo. Um crânio exposto também retransmite o fio fantasmagórico de um cinerário: passe um fio por ele para ir mais longe.","Череп, готовый стать декором. Удерживай [action:permanent:Reload][action:local:Reload]: поворот блока, другой вид или обратно в череп. Поднятый - снова череп. Выставленный череп ещё и передаёт призрачную нить цинерария: проведи нить через него, чтобы дотянуться дальше.","Süs olarak konmaya hazır bir kafatası. Blok döndürme, diğer görünüm ya da tekrar kafatasına çevirmek için [action:permanent:Reload][action:local:Reload] basılı tut. Toplanınca yine kafatası olur. Sergilenen kafatası bir küllüğün hayalet ipliğini de aktarır: daha uzağa ulaşmak için ipliği içinden geçir.",可作为装饰摆放的头骨。长按[action:permanent:Reload][action:local:Reload]旋转方块、切换另一种外观或变回头骨。拾起后又是头骨。摆出的头骨还能中继骨灰瓮的幽灵丝线:让丝线从它这里穿过,就能连到更远处。,可作為裝飾擺放的頭骨。長按[action:permanent:Reload][action:local:Reload]旋轉方塊、切換另一種外觀或變回頭骨。撿起後又是頭骨。擺出的頭骨還能中繼骨灰甕的幽靈絲線:讓絲線從它這裡穿過,就能連到更遠處。
necroSkullModeOff,items,Item,,,,Just a skull,,Nur ein Schädel,Solo un cráneo,Simple crâne,Solo un teschio,ただの頭蓋骨,그냥 두개골,Zwykła czaszka,Só um crânio,Просто череп,Sadece kafatası,只是头骨,只是頭骨
diff --git a/HarmonySrc/Cinerarium.cs b/HarmonySrc/Cinerarium.cs
index f91651c..81e2d25 100644
--- a/HarmonySrc/Cinerarium.cs
+++ b/HarmonySrc/Cinerarium.cs
@@ -68,8 +68,10 @@ namespace NecromancerTome
public const int HalfWidth = 2;
public const int Below = 1;
public const int Above = 4;
- public const float KillsPerUrn = 500f;
- const byte SaveVersion = 4; // 2 - нити, 3 - фильтр логиста (16.10), 4 - нити рабочего «куда» и образец (18.10)
+ /// Убийств на одну урну сборщика. 17.10: «лимит урн - ослабить/убрать» - нагрузку теперь держит общий бюджет
+ /// шагов (CinerariumLoad), лимит остался мягким игровым порогом: было 500, стало 200.
+ public const float KillsPerUrn = 200f;
+ const byte SaveVersion = 5; // 2 - нити, 3 - фильтр логиста (16.10), 4 - нити рабочего «куда» и образец (18.10), 5 - черепа-ретрансляторы (18.10)
public bool HasSkull;
public bool ZoneShown;
@@ -80,6 +82,13 @@ namespace NecromancerTome
public bool HasThreads => HasThreadTo || ThreadFrom.Count > 0 || ThreadOut.Count > 0;
/// Нити рабочего «от урны»: станции (где изготавливать) и ящики (куда класть готовое), главные клетки блоков.
public readonly List ThreadOut = new List();
+ /// Черепа-ретрансляторы на пути каждой нити (18.10: «сам череп повысить из простого предмета, до промежуточного
+ /// ретранслятора... если понадобится протащить коммуникации дальше»; «Цепочка из нескольких»): клетки черепов-декора по
+ /// порядку ОТ УРНЫ к концу нити. Списки идут вровень с ThreadFrom / ThreadOut, ToVia - у нити «куда». Пусто - нить прямая.
+ /// Каждый пролёт - не длиннее CinerariumThreads.MaxLength. Убрали череп - нить через него снимается.
+ public readonly List> FromVia = new List>();
+ public readonly List> OutVia = new List>();
+ public readonly List ToVia = new List();
/// Образец рабочего: что изготавливать; число в стопке - сколько держать в запасе (ящики «куда» и выход станций).
/// Лежит в «Содержимом» урны второй ячейкой.
public ItemStack Sample = ItemStack.Empty.Clone();
@@ -138,6 +147,10 @@ namespace NecromancerTome
ThreadTo = other.ThreadTo;
ThreadOut.Clear();
ThreadOut.AddRange(other.ThreadOut);
+ CopyVia(other.FromVia, FromVia);
+ CopyVia(other.OutVia, OutVia);
+ ToVia.Clear();
+ ToVia.AddRange(other.ToVia);
Sample = other.Sample.Clone();
GroupMask = other.GroupMask;
_threadsDirty = true;
@@ -227,6 +240,61 @@ namespace NecromancerTome
}
CinerariumWriteHelper.WriteInts(_bw, o.ToArray());
(Sample ?? ItemStack.Empty).Clone().Write(_bw);
+ // v5: черепа на пути нитей - по нити: число черепов и их клетки; порядок нитей - как выше (откуда, куда, от урны).
+ List via = new List();
+ AlignVia();
+ foreach (List l in FromVia)
+ {
+ AppendVia(via, l);
+ }
+ AppendVia(via, ToVia);
+ foreach (List l in OutVia)
+ {
+ AppendVia(via, l);
+ }
+ CinerariumWriteHelper.WriteInts(_bw, via.ToArray());
+ }
+
+ static void AppendVia(List _dst, List _l)
+ {
+ _dst.Add(_l.Count);
+ foreach (Vector3i p in _l)
+ {
+ _dst.Add(p.x); _dst.Add(p.y); _dst.Add(p.z);
+ }
+ }
+
+ static List TakeVia(int[] _v, ref int _k)
+ {
+ List l = new List();
+ int cnt = _k < _v.Length ? _v[_k++] : 0;
+ for (int i = 0; i < cnt && _k + 2 < _v.Length; i++, _k += 3)
+ {
+ l.Add(new Vector3i(_v[_k], _v[_k + 1], _v[_k + 2]));
+ }
+ return l;
+ }
+
+ static void CopyVia(List> _src, List> _dst)
+ {
+ _dst.Clear();
+ foreach (List l in _src)
+ {
+ _dst.Add(new List(l));
+ }
+ }
+
+ /// Списки черепов - вровень с нитями (старые записи без черепов, правки списков нитей).
+ void AlignVia()
+ {
+ while (FromVia.Count < ThreadFrom.Count) FromVia.Add(new List());
+ while (FromVia.Count > ThreadFrom.Count) FromVia.RemoveAt(FromVia.Count - 1);
+ while (OutVia.Count < ThreadOut.Count) OutVia.Add(new List());
+ while (OutVia.Count > ThreadOut.Count) OutVia.RemoveAt(OutVia.Count - 1);
+ if (!HasThreadTo)
+ {
+ ToVia.Clear();
+ }
}
public override void Read(PooledBinaryReader _br, StreamModeRead _eStreamMode)
@@ -298,6 +366,29 @@ namespace NecromancerTome
}
Sample = ItemStack.Empty.Clone().Read(_br);
}
+ FromVia.Clear();
+ OutVia.Clear();
+ ToVia.Clear();
+ if (version >= 5)
+ {
+ int n = _br.ReadInt32();
+ int[] v = new int[n];
+ for (int i = 0; i < n; i++)
+ {
+ v[i] = _br.ReadInt32();
+ }
+ int k = 0;
+ for (int i = 0; i < ThreadFrom.Count; i++)
+ {
+ FromVia.Add(TakeVia(v, ref k));
+ }
+ ToVia.AddRange(TakeVia(v, ref k));
+ for (int i = 0; i < ThreadOut.Count; i++)
+ {
+ OutVia.Add(TakeVia(v, ref k));
+ }
+ }
+ AlignVia();
_threadsDirty = true;
if (version > SaveVersion)
{
@@ -337,7 +428,10 @@ namespace NecromancerTome
}
SyncGenie(false);
SyncThreads(_world);
- Work(_world);
+ if (!CinerariumLoad.Tide)
+ {
+ Work(_world);
+ }
}
// ------------------------------------------------------------------
@@ -348,39 +442,54 @@ namespace NecromancerTome
GameObject _threadView;
float _nextThreadCheck;
- public bool AddThreadFrom(Vector3i _box)
+ /// _via - черепа-ретрансляторы по порядку от урны к ящику (null - прямая нить). Нить к тому же ящику -
+ /// заменяет прежнюю (новый путь).
+ public bool AddThreadFrom(Vector3i _box, List _via = null)
{
- if (ThreadFrom.Contains(_box))
+ AlignVia();
+ int i = ThreadFrom.IndexOf(_box);
+ if (i < 0)
{
- return true;
+ if (ThreadFrom.Count >= CinerariumThreads.MaxFrom)
+ {
+ return false;
+ }
+ ThreadFrom.Add(_box);
+ FromVia.Add(new List());
+ i = ThreadFrom.Count - 1;
}
- if (ThreadFrom.Count >= CinerariumThreads.MaxFrom)
- {
- return false;
- }
- ThreadFrom.Add(_box);
+ FromVia[i] = _via != null ? new List(_via) : new List();
ThreadsChanged();
return true;
}
- public void SetThreadTo(Vector3i _box)
+ public void SetThreadTo(Vector3i _box, List _via = null)
{
HasThreadTo = true;
ThreadTo = _box;
+ ToVia.Clear();
+ if (_via != null)
+ {
+ ToVia.AddRange(_via);
+ }
ThreadsChanged();
}
- public bool AddThreadOut(Vector3i _target)
+ public bool AddThreadOut(Vector3i _target, List _via = null)
{
- if (ThreadOut.Contains(_target))
+ AlignVia();
+ int i = ThreadOut.IndexOf(_target);
+ if (i < 0)
{
- return true;
+ if (ThreadOut.Count >= CinerariumThreads.MaxFrom)
+ {
+ return false;
+ }
+ ThreadOut.Add(_target);
+ OutVia.Add(new List());
+ i = ThreadOut.Count - 1;
}
- if (ThreadOut.Count >= CinerariumThreads.MaxFrom)
- {
- return false;
- }
- ThreadOut.Add(_target);
+ OutVia[i] = _via != null ? new List(_via) : new List();
ThreadsChanged();
return true;
}
@@ -390,6 +499,9 @@ namespace NecromancerTome
int n = ThreadFrom.Count + (HasThreadTo ? 1 : 0) + ThreadOut.Count;
ThreadFrom.Clear();
ThreadOut.Clear();
+ FromVia.Clear();
+ OutVia.Clear();
+ ToVia.Clear();
HasThreadTo = false;
if (n > 0)
{
@@ -398,14 +510,41 @@ namespace NecromancerTome
return n;
}
- public int RemoveThreadsTo(Vector3i _box)
+ /// Снять нити, у которых конец (_end) или череп на пути (_via) - в клетке _p.
+ int RemoveWhere(Vector3i _p, bool _end, bool _via)
{
- int n = ThreadFrom.RemoveAll(p => p == _box) + ThreadOut.RemoveAll(p => p == _box);
- if (HasThreadTo && ThreadTo == _box)
+ AlignVia();
+ int n = 0;
+ for (int i = ThreadFrom.Count - 1; i >= 0; i--)
+ {
+ if (_end && ThreadFrom[i] == _p || _via && FromVia[i].Contains(_p))
+ {
+ ThreadFrom.RemoveAt(i);
+ FromVia.RemoveAt(i);
+ n++;
+ }
+ }
+ for (int i = ThreadOut.Count - 1; i >= 0; i--)
+ {
+ if (_end && ThreadOut[i] == _p || _via && OutVia[i].Contains(_p))
+ {
+ ThreadOut.RemoveAt(i);
+ OutVia.RemoveAt(i);
+ n++;
+ }
+ }
+ if (HasThreadTo && (_end && ThreadTo == _p || _via && ToVia.Contains(_p)))
{
HasThreadTo = false;
+ ToVia.Clear();
n++;
}
+ return n;
+ }
+
+ public int RemoveThreadsTo(Vector3i _box)
+ {
+ int n = RemoveWhere(_box, true, false);
if (n > 0)
{
ThreadsChanged();
@@ -413,6 +552,53 @@ namespace NecromancerTome
return n;
}
+ /// Снять нити, идущие через череп _skull (ЛКМ ножом по черепу; череп убрали).
+ public int RemoveThreadsVia(Vector3i _skull)
+ {
+ int n = RemoveWhere(_skull, false, true);
+ if (n > 0)
+ {
+ ThreadsChanged();
+ }
+ return n;
+ }
+
+ /// Все черепы на нитях урны в клетках, где их больше нет (чанк загружен), - нити через них снимаются.
+ bool DropBrokenRelays(World _world)
+ {
+ AlignVia();
+ bool gone = false;
+ foreach (List l in AllVia())
+ {
+ foreach (Vector3i p in l)
+ {
+ if (_world.GetChunkFromWorldPos(p) != null && !CinerariumThreads.IsRelay(_world.GetBlock(p).Block))
+ {
+ if (RemoveWhere(p, false, true) > 0)
+ {
+ Debug.Log("[NecromancerTome] Cinerarium: череп-ретранслятор " + p + " убран - нить урны " + ToWorldPos() + " порвалась");
+ gone = true;
+ }
+ return gone; // списки изменились - остальное в следующей проверке
+ }
+ }
+ }
+ return gone;
+ }
+
+ IEnumerable> AllVia()
+ {
+ foreach (List l in FromVia)
+ {
+ yield return l;
+ }
+ yield return ToVia;
+ foreach (List l in OutVia)
+ {
+ yield return l;
+ }
+ }
+
void ThreadsChanged()
{
_threadsDirty = true;
@@ -427,22 +613,19 @@ namespace NecromancerTome
if (_world != null && ConnectionManager.Instance.IsServer && HasThreads && !IsZoneless && _logistKnown)
{
Debug.Log("[NecromancerTome] Cinerarium: нити у обычной урны " + ToWorldPos() + " сняты - нити только у логиста и рабочего");
- ThreadFrom.Clear();
- ThreadOut.Clear();
- HasThreadTo = false;
- ThreadsChanged();
+ ClearThreads();
}
if (_world != null && ConnectionManager.Instance.IsServer && HasThreads && Time.time >= _nextThreadCheck)
{
_nextThreadCheck = Time.time + 2f;
- bool gone = false;
+ bool gone = DropBrokenRelays(_world);
foreach (Vector3i p in ThreadFrom.ToArray())
{
if (!CinerariumThreads.Resolve(_world, p, out Vector3i _, out TEFeatureCinerarium u) || u != null)
{
if (_world.GetChunkFromWorldPos(p) != null) // чанк не загружен - не снимать
{
- ThreadFrom.Remove(p);
+ RemoveWhere(p, true, false);
gone = true;
}
}
@@ -451,6 +634,7 @@ namespace NecromancerTome
_world.GetChunkFromWorldPos(ThreadTo) != null)
{
HasThreadTo = false;
+ ToVia.Clear();
gone = true;
}
foreach (Vector3i p in ThreadOut.ToArray())
@@ -458,7 +642,7 @@ namespace NecromancerTome
bool box = CinerariumThreads.Resolve(_world, p, out Vector3i _, out TEFeatureCinerarium u3) && u3 == null;
if (!box && CinerariumThreads.StationAt(_world, p) == null && _world.GetChunkFromWorldPos(p) != null)
{
- ThreadOut.Remove(p);
+ RemoveWhere(p, true, false);
gone = true;
}
}
@@ -490,18 +674,19 @@ namespace NecromancerTome
_threadView.AddComponent();
}
Vector3i me = ToWorldPos();
+ AlignVia();
List<(Vector3 a, Vector3 b)> pairs = new List<(Vector3, Vector3)>();
- foreach (Vector3i p in ThreadFrom)
+ for (int i = 0; i < ThreadFrom.Count; i++)
{
- pairs.Add((CinerariumThreads.BoxPoint(p, me), CinerariumThreads.UrnPoint(me)));
+ CinerariumThreads.AddPath(pairs, me, FromVia[i], ThreadFrom[i], true);
}
if (HasThreadTo)
{
- pairs.Add((CinerariumThreads.UrnPoint(me), CinerariumThreads.BoxPoint(ThreadTo, me)));
+ CinerariumThreads.AddPath(pairs, me, ToVia, ThreadTo, false);
}
- foreach (Vector3i p in ThreadOut)
+ for (int i = 0; i < ThreadOut.Count; i++)
{
- pairs.Add((CinerariumThreads.UrnPoint(me), CinerariumThreads.BoxPoint(p, me)));
+ CinerariumThreads.AddPath(pairs, me, OutVia[i], ThreadOut[i], false);
}
_threadView.GetComponent().Build(pairs);
}
@@ -543,9 +728,9 @@ namespace NecromancerTome
_nextWork = Time.time + CinerariumWork.StepSeconds;
return;
}
- if (Time.time < _nextWork)
+ if (Time.time < _nextWork || !CinerariumLoad.TryTakeStep())
{
- return;
+ return; // не время или бюджет кадра на дела духов выбран - в следующем кадре
}
_nextWork = Time.time + CinerariumWork.StepSeconds;
Vector3i? at = CinerariumWork.Step(_world, this, out bool stuck, true);
@@ -691,7 +876,15 @@ namespace NecromancerTome
public void SyncGenie(bool _sound)
{
SyncGlow();
- if (HasSkull && _genie == null)
+ // Прилив (17.10: «думаю всех некротехнологов нужно прятать во время прилива... В прилив работа тоже стоит. Урны светятся
+ // как с останками, но духи исчезают»): плотность некроэнергии в воздухе сравнялась с плотностью духа - вне урны он не
+ // держит форму. Свечение урны - по черепу, как обычно; утром дух появляется сам.
+ bool tide = CinerariumLoad.Tide;
+ if (tide && _genie != null)
+ {
+ RemoveGenie(false);
+ }
+ if (HasSkull && _genie == null && !tide)
{
int logist = 0;
if (IsLogist)
diff --git a/HarmonySrc/CinerariumGenie.cs b/HarmonySrc/CinerariumGenie.cs
index 7c55da7..22197d6 100644
--- a/HarmonySrc/CinerariumGenie.cs
+++ b/HarmonySrc/CinerariumGenie.cs
@@ -540,7 +540,8 @@ namespace NecromancerTome
if (Time.time >= _nextSleepCheck)
{
_nextSleepCheck = Time.time + 0.5f;
- bool asleep = CinerariumGenie.PlayerFar(transform.position);
+ // Уснул - игрок далеко или дух не среди ближайших (CinerariumLoad.AnimateNearest): замирает дома, работа идёт.
+ bool asleep = CinerariumGenie.PlayerFar(transform.position) || !CinerariumLoad.Animated(this);
if (asleep && !_asleep)
{
_t = -1f; // полёт прерван - дело всё равно выполнится
diff --git a/HarmonySrc/CinerariumLoad.cs b/HarmonySrc/CinerariumLoad.cs
new file mode 100644
index 0000000..b57cf8e
--- /dev/null
+++ b/HarmonySrc/CinerariumLoad.cs
@@ -0,0 +1,167 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Scripting;
+
+namespace NecromancerTome
+{
+ ///
+ /// Меры нагрузки урн (решение 17.10: «общий бюджет шагов работы духов за кадр (очередь по кругу - нагрузка постоянна при
+ /// любом числе урн); полная анимация только ближайших ~15-20 духов; замер 100 урн»).
+ /// Бюджет: дел (пробный шаг + настоящий) за кадр - не больше StepsPerFrame на все урны сейва; урна, которой не досталось,
+ /// пробует в следующем кадре. Урна делает дело раз в CinerariumWork.StepSeconds, поэтому очередь сама идёт по кругу.
+ /// Анимация: двигаются (полёт, жесты, покачивание) только AnimateNearest ближайших к игроку духов, остальные замирают дома,
+ /// как уснувшие (CinerariumGenieMotion); работа у всех идёт.
+ /// Прилив (решение 17.10, «Прилив прячет некротехнологов»): ночью кровавой луны духи всех урн уходят в урны и работа стоит -
+ /// признак берётся раз за кадр.
+ ///
+ public static class CinerariumLoad
+ {
+ public static int StepsPerFrame = 3;
+ public static int AnimateNearest = 16;
+
+ static int _frame = -1;
+ static int _used;
+ static bool _tide;
+
+ static void NewFrame()
+ {
+ if (Time.frameCount != _frame)
+ {
+ _frame = Time.frameCount;
+ _used = 0;
+ _tide = SnakeMode.IsBloodTide();
+ }
+ }
+
+ /// Взять одно дело из бюджета кадра.
+ public static bool TryTakeStep()
+ {
+ NewFrame();
+ if (_used >= StepsPerFrame)
+ {
+ return false;
+ }
+ _used++;
+ return true;
+ }
+
+ /// Идёт ли кровавый прилив (раз за кадр).
+ public static bool Tide
+ {
+ get
+ {
+ NewFrame();
+ return _tide;
+ }
+ }
+
+ // ------------------------------------------------------------------
+ // Ближайшие духи.
+ // ------------------------------------------------------------------
+
+ static float _nextRank;
+ static readonly HashSet _animated = new HashSet();
+ static readonly List _sorted = new List();
+
+ /// Двигается ли дух: среди AnimateNearest ближайших к игроку (пересчёт раз в 0.5 с, без выделений памяти).
+ public static bool Animated(CinerariumGenieMotion _m)
+ {
+ if (Time.time >= _nextRank)
+ {
+ _nextRank = Time.time + 0.5f;
+ Rank();
+ }
+ return _animated.Contains(_m);
+ }
+
+ static void Rank()
+ {
+ _animated.Clear();
+ EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer();
+ if (pl == null)
+ {
+ return;
+ }
+ Vector3 me = pl.GetPosition() - Origin.position;
+ _sorted.Clear();
+ _sorted.AddRange(CinerariumGenie.Live);
+ if (_sorted.Count > AnimateNearest)
+ {
+ _sorted.Sort((a, b) => (a.transform.position - me).sqrMagnitude.CompareTo((b.transform.position - me).sqrMagnitude));
+ }
+ for (int i = 0; i < _sorted.Count && i < AnimateNearest; i++)
+ {
+ _animated.Add(_sorted[i]);
+ }
+ }
+ }
+
+ /// necrofps [секунд] - средний и худший кадр за время замера (по умолчанию 5 с), число духов и урн; ответ - строкой
+ /// почтового ящика в лог. Для замера нагрузки урн (17.10: «замер 100 урн»).
+ [Preserve]
+ public class ConsoleCmdNecroFps : ConsoleCmdAbstract
+ {
+ public override string[] getCommands() => new[] { "necrofps" };
+ public override string getDescription() => "NecromancerTome (разработка): средний и худший кадр за N секунд";
+ public override bool AllowedInMainMenu => false;
+
+ public override void Execute(List _params, CommandSenderInfo _senderInfo)
+ {
+ float sec = _params.Count > 0 ? float.Parse(_params[0], System.Globalization.CultureInfo.InvariantCulture) : 5f;
+ bool uncap = _params.Count > 1 && _params[1] == "uncap";
+ SdtdConsole.Instance.Output("necrofps: замер " + sec + " с" + (uncap ? " без ограничения кадров" : ""));
+ ThreadManager.StartCoroutine(Measure(sec, uncap));
+ }
+
+ /// _uncap - на время замера снять вертикальную синхронизацию и предел кадров: при 60 fps по синхронизации
+ /// запас не виден (18.10, замер 100 урн).
+ static IEnumerator Measure(float _sec, bool _uncap)
+ {
+ int vs = QualitySettings.vSyncCount, fr = Application.targetFrameRate;
+ if (_uncap)
+ {
+ QualitySettings.vSyncCount = 0;
+ Application.targetFrameRate = -1;
+ yield return new WaitForSecondsRealtime(0.5f);
+ }
+ float end = Time.realtimeSinceStartup + _sec;
+ int frames = 0;
+ float worst = 0f, sum = 0f;
+ long gc0 = System.GC.CollectionCount(0);
+ while (Time.realtimeSinceStartup < end)
+ {
+ yield return null;
+ frames++;
+ sum += Time.unscaledDeltaTime;
+ worst = Mathf.Max(worst, Time.unscaledDeltaTime);
+ }
+ if (_uncap)
+ {
+ QualitySettings.vSyncCount = vs;
+ Application.targetFrameRate = fr;
+ }
+ float avg = frames > 0 ? sum / frames * 1000f : 0f;
+ Debug.Log("[NecromancerTome] mailbox: necrofps: кадров " + frames + ", средний " + avg.ToString("F1") + " мс (" + (avg > 0 ? 1000f / avg : 0f).ToString("F0") +
+ " fps), худший " + (worst * 1000f).ToString("F1") + " мс, сборок мусора " + (System.GC.CollectionCount(0) - gc0) +
+ ", духов " + CinerariumGenie.Live.Count + ", урн в сейве " + CinerariumRegistry.All().Count);
+ }
+ }
+
+ /// necrotide on|off|auto - прилив для проверок без ожидания ночи кровавой луны (SnakeMode.ForceTide).
+ [Preserve]
+ public class ConsoleCmdNecroTide : ConsoleCmdAbstract
+ {
+ public override string[] getCommands() => new[] { "necrotide" };
+ public override string getDescription() => "NecromancerTome (разработка): прилив on|off|auto";
+ public override bool AllowedInMainMenu => false;
+
+ public override void Execute(List _params, CommandSenderInfo _senderInfo)
+ {
+ string v = _params.Count > 0 ? _params[0] : "";
+ SnakeMode.ForceTide = v == "on" ? true : v == "off" ? (bool?)false : null;
+ SdtdConsole.Instance.Output("necrotide: " + (SnakeMode.ForceTide.HasValue ? (SnakeMode.ForceTide.Value ? "прилив" : "нет прилива") : "по часам") +
+ ", сейчас " + (SnakeMode.IsBloodTide() ? "прилив" : "не прилив"));
+ }
+ }
+}
diff --git a/HarmonySrc/CinerariumThreads.cs b/HarmonySrc/CinerariumThreads.cs
index 1730e26..1953211 100644
--- a/HarmonySrc/CinerariumThreads.cs
+++ b/HarmonySrc/CinerariumThreads.cs
@@ -25,6 +25,10 @@ namespace NecromancerTome
/// Урна рабочего (18.10): нити ящик -> урна - откуда брать ингредиенты и топливо, урна -> станция - где изготавливать,
/// урна -> ящик - куда класть готовое; станций и ящиков сколько угодно (до MaxFrom в каждую сторону). Нить между станцией
/// и урной рабочего - всегда «от урны», в каком бы порядке её ни тянули.
+ ///
+ /// Череп-ретранслятор (18.10): череп-декор (блок necroSkullDecorCenter/Back) в середине нити. Начал нить у ящика или урны,
+ /// ПКМ по черепу - нить проходит через него, дальше - следующий череп или конец; каждый пролёт - до MaxLength. Черепа
+ /// хранятся у нити в урне (TEFeatureCinerarium.FromVia/ToVia/OutVia), ЛКМ по черепу - снять все нити через него.
///
public static class CinerariumThreads
{
@@ -39,6 +43,13 @@ namespace NecromancerTome
public static readonly Color SparkColor = new Color(0.8f, 0.95f, 1f, 1f);
public static bool IsKnife(ItemClass _i) => _i != null && (_i.Name == KnifeName || _i.Name == ThreadKnifeName);
+
+ /// Череп-ретранслятор - череп-декор в мире (оба вида и старый блок-помощник).
+ public static bool IsRelay(Block _b)
+ {
+ string n = _b?.GetBlockName();
+ return n == SkullDecorPlace.CenterBlock || n == SkullDecorPlace.BackBlock || n == "necroSkullDecor";
+ }
public static bool IsThreadKnife(ItemClass _i) => _i != null && _i.Name == ThreadKnifeName;
// ------------------------------------------------------------------
@@ -72,13 +83,19 @@ namespace NecromancerTome
static bool _startUrn;
static bool _startStation;
static GameObject _preview;
+ /// Черепа, через которые уже прошла тянущаяся нить, по порядку от начала.
+ static readonly List _via = new List();
public static Vector3i? Start => _start;
public static bool StartIsUrn => _startUrn;
+ /// Откуда сейчас тянется нить: последний череп или начало.
+ public static Vector3i? LastPoint => _via.Count > 0 ? _via[_via.Count - 1] : _start;
+ public static bool LastIsRelay => _via.Count > 0;
public static void Cancel()
{
_start = null;
+ _via.Clear();
if (_preview != null)
{
Object.Destroy(_preview);
@@ -127,9 +144,20 @@ namespace NecromancerTome
{
return;
}
- bool ok = Resolve(w, hi.hit.blockPos, out Vector3i owner, out TEFeatureCinerarium urn);
+ ClickAt(_pl, w, hi.hit.blockPos, _connect);
+ }
+
+ /// Щелчок ножом для нитей по клетке _pos (луч уже разобран; команда necroclick - напрямую).
+ public static void ClickAt(EntityPlayerLocal _pl, World w, Vector3i _pos, bool _connect)
+ {
+ if (IsRelay(w.GetBlock(_pos).Block))
+ {
+ ClickRelay(_pl, w, _pos, _connect);
+ return;
+ }
+ bool ok = Resolve(w, _pos, out Vector3i owner, out TEFeatureCinerarium urn);
bool station = false;
- if (!ok && StationAt(w, hi.hit.blockPos, out Vector3i stOwner) != null)
+ if (!ok && StationAt(w, _pos, out Vector3i stOwner) != null)
{
ok = true;
station = true;
@@ -174,12 +202,19 @@ namespace NecromancerTome
Vector3i s = _start.Value;
bool sUrn = _startUrn;
bool sStation = _startStation;
+ Vector3i last = LastPoint.Value;
+ // Черепа - по порядку от урны: начали у урны - как шли, начали у ящика или станции - в обратном порядке.
+ List via = new List(_via);
Cancel();
if (s == owner)
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadCancel"));
return;
}
+ if (!sUrn)
+ {
+ via.Reverse();
+ }
// Станция - только с урной рабочего, нить всегда «от урны».
if (sStation || station)
{
@@ -190,12 +225,12 @@ namespace NecromancerTome
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadNeedWorker"));
return;
}
- if (Vector3.Distance(s.ToVector3(), owner.ToVector3()) > MaxLength)
+ if (Vector3.Distance(last.ToVector3(), owner.ToVector3()) > MaxLength)
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadTooFar"));
return;
}
- if (!wu.AddThreadOut(st))
+ if (!wu.AddThreadOut(st, via))
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadLimit"));
return;
@@ -215,7 +250,7 @@ namespace NecromancerTome
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadNeedLogist"));
return;
}
- if (Vector3.Distance(s.ToVector3(), owner.ToVector3()) > MaxLength)
+ if (Vector3.Distance(last.ToVector3(), owner.ToVector3()) > MaxLength)
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadTooFar"));
return;
@@ -230,7 +265,7 @@ namespace NecromancerTome
if (u.IsWorker)
{
// У рабочего ящиков «куда» сколько угодно - туда готовое.
- if (!u.AddThreadOut(owner))
+ if (!u.AddThreadOut(owner, via))
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadLimit"));
return;
@@ -239,13 +274,13 @@ namespace NecromancerTome
}
else
{
- u.SetThreadTo(owner);
+ u.SetThreadTo(owner, via);
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadTo"));
}
}
else
{
- if (!urn.AddThreadFrom(s))
+ if (!urn.AddThreadFrom(s, via))
{
GameManager.ShowTooltip(_pl, Localization.Get("necroThreadLimit"));
return;
@@ -255,6 +290,76 @@ namespace NecromancerTome
_pl.PlayOneShot("wiretool_place");
}
+ /// Щелчок ножом по черепу-ретранслятору: ПКМ при тянущейся нити - провести её через череп; ЛКМ - снять все нити
+ /// через него (или бросить тянущуюся).
+ static void ClickRelay(EntityPlayerLocal _pl, World _w, Vector3i _skull, bool _connect)
+ {
+ if (!_connect)
+ {
+ if (_start.HasValue)
+ {
+ Cancel();
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadCancel"));
+ return;
+ }
+ int n = 0;
+ foreach (Vector3i p in CinerariumRegistry.All())
+ {
+ TEFeatureCinerarium u = UrnAt(_w, p);
+ if (u != null)
+ {
+ n += u.RemoveThreadsVia(_skull);
+ }
+ }
+ if (n > 0)
+ {
+ _pl.PlayOneShot("wiretool_grab");
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadRemoved"));
+ }
+ return;
+ }
+ if (!_start.HasValue)
+ {
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadRelayFirst"));
+ return;
+ }
+ if (_via.Contains(_skull))
+ {
+ return;
+ }
+ if (Vector3.Distance(LastPoint.Value.ToVector3(), _skull.ToVector3()) > MaxLength)
+ {
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadTooFar"));
+ return;
+ }
+ _via.Add(_skull);
+ _pl.PlayOneShot("wiretool_place");
+ GameManager.ShowTooltip(_pl, Localization.Get("necroThreadRelay"));
+ }
+
+ /// Нить урны _urn к _end через черепа _via (по порядку от урны) - пролётами в _pairs, огоньки бегут по направлению
+ /// нити: _toUrn - от конца к урне (нить «откуда»), иначе от урны к концу.
+ public static void AddPath(List<(Vector3 a, Vector3 b)> _pairs, Vector3i _urn, List _via, Vector3i _end, bool _toUrn)
+ {
+ List pts = new List { UrnPoint(_urn) };
+ if (_via != null)
+ {
+ foreach (Vector3i v in _via)
+ {
+ pts.Add(RelayPoint(v));
+ }
+ }
+ Vector3i before = _via != null && _via.Count > 0 ? _via[_via.Count - 1] : _urn;
+ pts.Add(BoxPoint(_end, before));
+ for (int i = 0; i + 1 < pts.Count; i++)
+ {
+ _pairs.Add(_toUrn ? (pts[i + 1], pts[i]) : (pts[i], pts[i + 1]));
+ }
+ }
+
+ /// Точка нити у черепа - над черепом-декором (он лежит на дне клетки). Сцена (без Origin).
+ public static Vector3 RelayPoint(Vector3i _skull) => World.blockToTransformPos(_skull) - Origin.position + Vector3.up * 0.3f;
+
/// Снять все нити урны или все нити, идущие к ящику (у всех урн сейва). Сколько снято.
static int RemoveAll(World _w, Vector3i _owner, TEFeatureCinerarium _urn)
{
@@ -444,8 +549,9 @@ namespace NecromancerTome
{
return;
}
- Vector3i s = CinerariumThreads.Start.Value;
- Vector3 a = World.blockToTransformPos(s) - Origin.position + Vector3.up * (CinerariumThreads.StartIsUrn ? 0.5f : 0.6f);
+ Vector3i s = CinerariumThreads.LastPoint.Value;
+ Vector3 a = CinerariumThreads.LastIsRelay ? CinerariumThreads.RelayPoint(s)
+ : World.blockToTransformPos(s) - Origin.position + Vector3.up * (CinerariumThreads.StartIsUrn ? 0.5f : 0.6f);
Transform cam = pl.playerCamera != null ? pl.playerCamera.transform : null;
Vector3 b = cam != null ? cam.position + cam.forward * 0.6f + cam.right * 0.2f - cam.up * 0.25f : pl.GetPosition() - Origin.position + Vector3.up * 1.2f;
bool far = Vector3.Distance(s.ToVector3(), pl.GetPosition()) > CinerariumThreads.MaxLength;
diff --git a/HarmonySrc/NecroDevCommands.cs b/HarmonySrc/NecroDevCommands.cs
index a46f3c3..2ce55b9 100644
--- a/HarmonySrc/NecroDevCommands.cs
+++ b/HarmonySrc/NecroDevCommands.cs
@@ -46,7 +46,19 @@ namespace NecromancerTome
case "necrohold": Hold(pl, _params); break;
case "necrobox": Box(w, _params); break;
case "necrourn": Urn(w, _params); break;
- case "necroclick": CinerariumThreads.Click(pl, _params.Count > 0 && _params[0] == "1"); Out("necroclick: ok"); break;
+ case "necrogod": God(pl, _params.Count == 0 || _params[0] != "off"); break;
+ case "necroclick":
+ // necroclick 0|1 [x y z] - по блоку под прицелом или по указанной клетке (луч не всегда попадает в низкий череп).
+ if (_params.Count >= 4)
+ {
+ CinerariumThreads.ClickAt(pl, w, P(_params, 1), _params[0] == "1");
+ }
+ else
+ {
+ CinerariumThreads.Click(pl, _params.Count > 0 && _params[0] == "1");
+ }
+ Out("necroclick: ok");
+ break;
}
}
catch (System.Exception e)
@@ -78,6 +90,15 @@ namespace NecromancerTome
Out("necrolook: yaw " + yaw.ToString("F0") + ", pitch " + pitch.ToString("F0"));
}
+ /// Режим бога и невидимость для ИИ: пока ассистент проверяет, персонаж стоит - зомби тестового мира его не трогают
+ /// (18.10: «пока персонаж просто стоит, его скушают»; «Я обычно ставлю режим Бога»).
+ static void God(EntityPlayerLocal _pl, bool _on)
+ {
+ _pl.IsGodMode.Value = _on;
+ _pl.SetIgnoredByAI(_on);
+ Out("necrogod: " + (_on ? "бог, ИИ не видит" : "обычный"));
+ }
+
static void Aim(World _w, EntityPlayerLocal _pl)
{
StringBuilder sb = new StringBuilder("necroaim: игрок ").Append(_pl.position.ToString("F1")).Append(", взгляд ").Append(_pl.rotation.ToString("F0"));
@@ -151,7 +172,20 @@ namespace NecromancerTome
return;
}
string op = _p.Count > 3 ? _p[3] : "list";
- if (op == "clear")
+ if (op == "fill")
+ {
+ // Все пустые ячейки - полной стопкой предмета (ящик «полон» по-честному).
+ ItemValue iv = ItemClass.GetItem(_p[4], true);
+ for (int i = 0; i < s.ItemGrid.Length; i++)
+ {
+ if (s.ItemGrid[i] == null || s.ItemGrid[i].IsEmpty())
+ {
+ s.UpdateSlot(i, new ItemStack(iv.Clone(), iv.ItemClass.Stacknumber.Value));
+ }
+ }
+ s.SetModified();
+ }
+ else if (op == "clear")
{
for (int i = 0; i < s.ItemGrid.Length; i++)
{
@@ -182,6 +216,17 @@ namespace NecromancerTome
Out(sb.ToString());
}
+ /// Черепа на пути нити: тройки координат после конца нити, по порядку от урны.
+ static List Via(List _p, int _i)
+ {
+ List l = new List();
+ for (int k = _i; k + 2 < _p.Count; k += 3)
+ {
+ l.Add(P(_p, k));
+ }
+ return l;
+ }
+
static void Urn(World _w, List _p)
{
Vector3i pos = P(_p, 0);
@@ -195,9 +240,9 @@ namespace NecromancerTome
switch (op)
{
case "skull": u.SetSkull(_p[4] == "1"); break;
- case "from": u.AddThreadFrom(P(_p, 4)); break;
- case "to": u.SetThreadTo(P(_p, 4)); break;
- case "out": u.AddThreadOut(P(_p, 4)); break;
+ case "from": u.AddThreadFrom(P(_p, 4), Via(_p, 7)); break;
+ case "to": u.SetThreadTo(P(_p, 4), Via(_p, 7)); break;
+ case "out": u.AddThreadOut(P(_p, 4), Via(_p, 7)); break;
case "clear": u.ClearThreads(); break;
case "sample":
u.SetSample(_p.Count > 5 ? new ItemStack(ItemClass.GetItem(_p[4], true), int.Parse(_p[5])) : ItemStack.Empty.Clone());
@@ -207,7 +252,15 @@ namespace NecromancerTome
u.SetModified();
break;
}
- Out("necrourn: " + pos + " " + _w.GetBlock(pos).Block?.GetBlockName() + ", череп " + u.HasSkull + ", застрял " + u.Stuck +
+ string blink = "нет";
+ Chunk ch = _w.GetChunkFromWorldPos(pos) as Chunk;
+ BlockEntityData be = ch?.GetBlockEntity(pos);
+ if (be != null && be.bHasTransform)
+ {
+ CinerariumBlink cb = be.transform.GetComponent();
+ blink = cb == null ? "нет" : (cb.enabled ? "мигает" : "выкл") + " (" + cb.Renderers.Count + " рендер.)";
+ }
+ Out("necrourn: " + pos + " " + _w.GetBlock(pos).Block?.GetBlockName() + ", череп " + u.HasSkull + ", застрял " + u.Stuck + ", мигание " + blink +
", откуда " + u.ThreadFrom.Count + ", куда " + (u.HasThreadTo ? u.ThreadTo.ToString() : "нет") + ", от урны " + u.ThreadOut.Count +
", образец " + (u.Sample == null || u.Sample.IsEmpty() ? "нет" : u.Sample.itemValue.ItemClass?.GetItemName() + "x" + u.Sample.count));
}
@@ -275,4 +328,13 @@ namespace NecromancerTome
public override bool AllowedInMainMenu => false;
public override void Execute(List _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necroclick", _params);
}
+
+ [Preserve]
+ public class ConsoleCmdNecroGod : ConsoleCmdAbstract
+ {
+ public override string[] getCommands() => new[] { "necrogod" };
+ public override string getDescription() => "NecromancerTome (разработка): режим бога и невидимость для ИИ [off]";
+ public override bool AllowedInMainMenu => false;
+ public override void Execute(List _params, CommandSenderInfo _senderInfo) => NecroDev.Run("necrogod", _params);
+ }
}
diff --git a/HarmonySrc/NecroMailbox.cs b/HarmonySrc/NecroMailbox.cs
index e24ef74..a1bad00 100644
--- a/HarmonySrc/NecroMailbox.cs
+++ b/HarmonySrc/NecroMailbox.cs
@@ -83,10 +83,28 @@ namespace NecromancerTome
string dir = Path.Combine(NecroMailbox.Dir, "shots");
Directory.CreateDirectory(dir);
string name = _params.Count > 0 ? _params[0] : System.DateTime.Now.ToString("HHmmss");
+ // necroshot имя N интервал - серия из N кадров (имя1..имяN) через интервал секунд (18.10: мигание, полёт духа).
+ if (_params.Count >= 3 && int.TryParse(_params[1], out int n) &&
+ float.TryParse(_params[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out float dt))
+ {
+ ThreadManager.StartCoroutine(Burst(dir, name, n, dt));
+ SdtdConsole.Instance.Output("серия: " + n + " кадров через " + dt + " с");
+ return;
+ }
string path = Path.Combine(dir, name + ".png");
ScreenCapture.CaptureScreenshot(path);
SdtdConsole.Instance.Output("снимок: " + path);
}
+
+ static System.Collections.IEnumerator Burst(string _dir, string _name, int _n, float _dt)
+ {
+ for (int i = 1; i <= _n; i++)
+ {
+ ScreenCapture.CaptureScreenshot(Path.Combine(_dir, _name + i + ".png"));
+ yield return new WaitForSecondsRealtime(_dt);
+ }
+ Debug.Log("[NecromancerTome] mailbox: серия " + _name + " готова");
+ }
}
/// necrospawn - нажать «Появиться» в окне появления (18.10: ассистент сам запускает игру с сейвом
diff --git a/HarmonySrc/SnakeMode.cs b/HarmonySrc/SnakeMode.cs
index a0e60fb..981236d 100644
--- a/HarmonySrc/SnakeMode.cs
+++ b/HarmonySrc/SnakeMode.cs
@@ -75,8 +75,15 @@ namespace NecromancerTome
/// Время - ванильное GameUtils.IsBloodMoonTime (от заката дня луны до рассвета), оно считается по часам
/// мира и одинаково у хоста и клиента; AIDirector с его BloodMoonActive есть только у сервера.
///
+ /// Прилив для проверок (necrotide on|off|auto): null - по часам мира.
+ public static bool? ForceTide;
+
public static bool IsBloodTide()
{
+ if (ForceTide.HasValue)
+ {
+ return ForceTide.Value;
+ }
World world = GameManager.Instance?.World;
return world != null && GameUtils.IsBloodMoonTime(world.worldTime, (world.DuskHour, world.DawnHour),
GameStats.GetInt(EnumGameStats.BloodMoonDay));
diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll
index a95a609..8304254 100644
Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ
diff --git a/NecromancerHarmony.pdb b/NecromancerHarmony.pdb
index 88c1ea5..4874e94 100644
Binary files a/NecromancerHarmony.pdb and b/NecromancerHarmony.pdb differ