diff --git a/Config/Localization.csv b/Config/Localization.csv index 852f23d..db29c9f 100644 --- a/Config/Localization.csv +++ b/Config/Localization.csv @@ -33,7 +33,7 @@ necroInsectSwarm,entityclasses,Entity,,,,Pharaoh's Swarm,,Schwarm des Pharao,Enj necroWpnBladeNecroKnife,items,Item,,,,Necromancer's Knife,,Messer des Nekromanten,Cuchillo del nigromante,Couteau du nécromancien,Coltello del negromante,ネクロマンサーのナイフ,강령술사의 단검,Nóż nekromanty,Faca do necromante,Нож некроманта,Nekromantın Bıçağı,亡灵法师之刃,亡靈法師之刃 necroWpnBladeNecroKnifeDesc,items,Item,,,,"A blackened bone knife bound to your necromantic power. Its damage scales with your Necromancy skill - worthless in untrained hands, deadly in an experienced necromancer's. Its ordinary swing heals you for half the damage it deals, and any zombie it wounds is marked as a Victim, and its corpse can be searched for special loot. Its power attack deals no extra damage and returns nothing to you - instead it always knocks its target off its feet, and takes 20 health from you as the price. Without that much health to spare, it strikes like an ordinary swing. Press R to change the grip: the thread grip links a cinerarium with chests.",,"Ein geschwärztes Knochenmesser, an deine nekromantische Macht gebunden. Sein Schaden wächst mit deiner Nekromantie-Fertigkeit – in ungeübten Händen wertlos, in denen eines erfahrenen Nekromanten tödlich. Der normale Hieb heilt dich um die Hälfte des angerichteten Schadens, und jeder verwundete Zombie wird als Opfer markiert, und seine Leiche lässt sich nach besonderer Beute durchsuchen. Der Powerangriff richtet keinen zusätzlichen Schaden an und gibt dir nichts zurück – stattdessen reißt er sein Ziel immer von den Beinen und nimmt dir dafür 20 Lebenspunkte. Reicht deine Gesundheit dafür nicht, schlägt es wie ein normaler Hieb zu. R wechselt den Griff: Mit dem Fadengriff verbindest du ein Cinerarium mit Truhen.","Un cuchillo de hueso ennegrecido, ligado a tu poder nigromántico. Su daño crece con tu habilidad de Nigromancia: inútil en manos inexpertas, letal en las de un nigromante veterano. Su golpe normal te cura la mitad del daño infligido, y todo zombi al que hiera queda marcado como Víctima, y su cadáver se puede registrar en busca de botín especial. Su ataque potente no hace daño adicional ni te devuelve nada: en cambio, siempre derriba a su objetivo y te cobra 20 puntos de salud. Si no tienes tanta salud, golpea como un ataque normal. R cambia el agarre: el agarre de hilos une un cinerario con cofres.","Un couteau en os noirci, lié à ton pouvoir nécromantique. Ses dégâts croissent avec ta compétence de Nécromancie : dérisoire en main inexpérimentée, mortel dans celle d'un nécromancien aguerri. Son coup normal te soigne de la moitié des dégâts infligés, et tout zombie qu'il blesse est marqué comme Victime, et son cadavre peut être fouillé pour un butin spécial. Son attaque puissante n'inflige aucun dégât supplémentaire et ne te rend rien : en revanche, elle met toujours sa cible à terre et te prend 20 points de vie en paiement. S'il ne te reste pas assez de vie, il frappe comme un coup normal. R change de prise : la prise des fils relie un cinéraire à des coffres.","Un coltello d'osso annerito, legato al tuo potere negromantico. Il suo danno cresce con la tua abilità di Negromanzia: inutile in mani inesperte, letale in quelle di un negromante navigato. Il colpo normale ti cura per metà del danno inflitto, e ogni zombie che ferisce viene marchiato come Vittima, e il suo cadavere può essere perquisito per un bottino speciale. L'attacco potente non infligge danno extra e non ti restituisce nulla: in compenso atterra sempre il bersaglio e ti costa 20 punti salute. Se non hai abbastanza salute, colpisce come un colpo normale. R cambia la presa: la presa dei fili collega un cinerario ai forzieri.",あなたの降霊術の力に結びついた、黒ずんだ骨のナイフ。その威力は降霊術スキルとともに伸びる。未熟な手では役に立たず、熟練したネクロマンサーの手では致命的だ。通常の一撃は与えたダメージの半分をあなたに回復させ、傷を負ったゾンビは「犠牲者」として刻まれ、その死体を漁れば特別な戦利品が手に入る。強攻撃は追加ダメージを与えず、あなたに何も返さない。その代わり、必ず相手を打ち倒し、代償としてあなたの体力を20奪う。体力が足りなければ、通常の一撃になる。Rで握りを変える。糸の握りで骨壺と箱をつなぐ。,"당신의 강령술 힘에 묶인 검게 그을린 뼈 단검. 위력은 강령술 기술에 따라 커집니다. 미숙한 손에서는 쓸모없고, 숙련된 강령술사의 손에서는 치명적입니다. 평범한 일격은 입힌 피해의 절반만큼 당신을 치유하고, 상처 입은 좀비는 '희생자'로 표시되어 그 시체를 뒤져 특별한 전리품을 얻을 수 있습니다. 강공격은 추가 피해를 주지 않고 당신에게 아무것도 돌려주지 않습니다. 대신 언제나 대상을 넘어뜨리며, 그 대가로 당신의 체력 20을 가져갑니다. 체력이 부족하면 평범한 일격이 됩니다. R로 쥐는 법을 바꿉니다. 실 쥐기로 유골함과 상자를 잇습니다.","Poczerniały kościany nóż związany z twoją nekromancką mocą. Jego obrażenia rosną wraz z umiejętnością Nekromancji – bezużyteczny w niewprawnych rękach, śmiercionośny w dłoni doświadczonego nekromanty. Zwykłe cięcie leczy cię o połowę zadanych obrażeń, a każde zranione zombie zostaje oznaczone jako Ofiara, a jego zwłoki można przeszukać w poszukiwaniu specjalnego łupu. Atak specjalny nie zadaje dodatkowych obrażeń i niczego ci nie zwraca – za to zawsze zwala cel z nóg, a w zamian zabiera ci 20 punktów zdrowia. Gdy brakuje ci zdrowia, uderza jak zwykłe cięcie. R zmienia chwyt: chwyt do nici łączy cinerarium ze skrzyniami.","Uma faca de osso enegrecida, ligada ao seu poder necromântico. Seu dano cresce com a habilidade de Necromancia: inútil em mãos inexperientes, letal nas de um necromante experiente. O golpe comum cura você em metade do dano causado, e todo zumbi ferido é marcado como Vítima, e seu cadáver pode ser revistado em busca de espólio especial. O ataque forte não causa dano extra e não devolve nada a você: em vez disso, sempre derruba o alvo e cobra 20 pontos da sua vida. Se não houver vida suficiente, golpeia como um ataque comum. R troca a pegada: a pegada de fios liga um cinerário a baús.","Почерневший костяной нож, подчинённый вашей некромантской силе. Его урон растёт вместе с навыком Некромантии - бесполезен в неопытных руках, смертоносен в руках опытного некроманта. Обычный удар лечит вас на половину нанесённого урона, а любой раненый им зомби помечен как Жертва, и его труп можно обыскать ради особой добычи. Силовая атака не бьёт сильнее и ничего вам не возвращает - вместо этого она всегда сбивает цель с ног, забирая у вас 20 единиц здоровья как плату. Если столько здоровья нет, нож бьёт обычным ударом. R - сменить хват: хватом для нитей цинерарий связывается с ящиками.","Nekromansi gücüne bağlanmış, kararmış bir kemik bıçak. Verdiği hasar Nekromansi yeteneğinle birlikte büyür: acemi ellerde işe yaramaz, deneyimli bir nekromantın elinde ölümcül. Sıradan darbesi verdiği hasarın yarısı kadar seni iyileştirir ve yaraladığı her zombi Kurban olarak işaretlenir; cesedi özel ganimet için aranabilir. Güçlü saldırı ek hasar vermez ve sana hiçbir şey döndürmez; bunun yerine hedefi daima yere serer ve bedel olarak senden 20 can alır. Yeterli canın yoksa sıradan bir darbe gibi vurur. R tutuşu değiştirir: iplik tutuşu bir küllüğü sandıklara bağlar.",一把与你的亡灵之力相连的漆黑骨刃。其伤害随亡灵法术技能增长——在生手手中一文不值,在老练的亡灵法师手中则致命。普通挥击可为你回复所造成伤害的一半,被它所伤的僵尸都会被标记为「祭品」,其尸体可被搜刮以获得特殊战利品。强力攻击不会造成额外伤害,也不会回报给你任何东西——但它必定将目标掀翻在地,并以你 20 点生命为代价。生命不足时,它只会像普通挥击一样出手。按R换握法:牵线握法可将骨灰瓮与箱子相连。,一把與你的亡靈之力相連的漆黑骨刃。其傷害隨亡靈法術技能增長——在生手手中一文不值,在老練的亡靈法師手中則致命。普通揮擊可為你回復所造成傷害的一半,被它所傷的殭屍都會被標記為「祭品」,其屍體可被搜刮以獲得特殊戰利品。強力攻擊不會造成額外傷害,也不會回報給你任何東西——但它必定將目標掀翻在地,並以你 20 點生命為代價。生命不足時,它只會像普通揮擊一樣出手。按R換握法:牽線握法可將骨灰甕與箱子相連。 necroWpnBladeNecroKnifeThread,items,Item,,,,Necromancer's Knife (thread grip),,Messer des Nekromanten (Fadengriff),Cuchillo del nigromante (agarre de hilos),Couteau du nécromancien (prise des fils),Coltello del negromante (presa dei fili),ネクロマンサーのナイフ(糸の握り),강령술사의 단검 (실 쥐기),Nóż nekromanty (chwyt do nici),Faca do necromante (pegada de fios),Нож некроманта (хват для нитей),Nekromantın Bıçağı (iplik tutuşu),亡灵法师之刃(牵线握法),亡靈法師之刃(牽線握法) -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 - only what that chest already holds. 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 - nur das, was schon darin liegt. 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í, solo lo que ese cofre ya guarda. 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, seulement ce que ce coffre contient déjà. 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, solo ciò che quel forziere già contiene. 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 - tylko to, co już w niej leży. 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á, só o que esse baú já guarda. 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 - yalnızca o sandıkta zaten olanı. 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換握法。 +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),丝线已起头——右键另一端(骨灰瓮或箱子),絲線已起頭——右鍵另一端(骨灰甕或箱子) @@ -44,6 +44,31 @@ necroThreadTo,UI,Tooltip,,,,Thread: urn to chest - the spirit will bring things necroThreadRemoved,UI,Tooltip,,,,Threads cut,,Fäden getrennt,Hilos cortados,Fils coupés,Fili tagliati,糸を断った,실을 끊었다,Nici przecięte,Fios cortados,Нити обрезаны,İplikler kesildi,丝线已剪断,絲線已剪斷 necroThreadLimit,UI,Tooltip,,,,This urn already has 8 incoming threads,,Diese Urne hat schon 8 eingehende Fäden,Esta urna ya tiene 8 hilos de entrada,Cette urne a déjà 8 fils entrants,Quest'urna ha già 8 fili in entrata,この骨壺にはすでに入りの糸が8本ある,이 유골함에는 이미 들어오는 실이 8개 있다,Ta urna ma już 8 nici wejściowych,Esta urna já tem 8 fios de entrada,У этой урны уже 8 нитей «откуда»,Bu küllüğün zaten 8 gelen ipliği var,这个骨灰瓮已有8根来源丝线,這個骨灰甕已有8根來源絲線 necroThreadCancel,UI,Tooltip,,,,Thread dropped,,Faden fallen gelassen,Hilo soltado,Fil lâché,Filo lasciato,糸を手放した,실을 놓았다,Nić porzucona,Fio solto,Нить брошена,İplik bırakıldı,丝线已放下,絲線已放下 +necroGroup0,UI,Tooltip,,,,Cooked food,,Gekochtes Essen,Comida cocinada,Plats cuisinés,Cibo cucinato,料理,요리된 음식,Gotowe jedzenie,Comida pronta,Готовая еда,Pişmiş yemek,熟食,熟食 +necroGroup1,UI,Tooltip,,,,Canned food,,Konserven,Conservas,Conserves,Cibo in scatola,缶詰,통조림,Konserwy,Enlatados,Консервы,Konserveler,罐头,罐頭 +necroGroup2,UI,Tooltip,,,,Raw food,,Rohe Lebensmittel,Alimentos crudos,Aliments crus,Cibo crudo,生の食材,날것 식재료,Surowe produkty,Alimentos crus,Сырые продукты,Çiğ gıdalar,生食材,生食材 +necroGroup3,UI,Tooltip,,,,Harvest,,Ernte,Cosecha,Récoltes,Raccolto,収穫物,수확물,Plony,Colheita,Урожай,Hasat,收成,收成 +necroGroup4,UI,Tooltip,,,,Flowers and herbs,,Blumen und Kräuter,Flores y hierbas,Fleurs et herbes,Fiori ed erbe,花とハーブ,꽃과 약초,Kwiaty i zioła,Flores e ervas,Цветы и травы,Çiçekler ve otlar,花草,花草 +necroGroup5,UI,Tooltip,,,,Seeds,,Samen,Semillas,Graines,Semi,種,씨앗,Nasiona,Sementes,Семена,Tohumlar,种子,種子 +necroGroup6,UI,Tooltip,,,,Drinks,,Getränke,Bebidas,Boissons,Bevande,飲み物,음료,Napoje,Bebidas,Напитки,İçecekler,饮品,飲品 +necroGroup7,UI,Tooltip,,,,Medicine,,Medizin,Medicina,Médecine,Medicine,医薬品,의약품,Leki,Remédios,Лекарства,İlaçlar,药品,藥品 +necroGroup8,UI,Tooltip,,,,Ore and stone,,Erz und Stein,Mineral y piedra,Minerai et pierre,Minerale e pietra,鉱石と石,광석과 돌,Ruda i kamień,Minério e pedra,Руда и камень,Cevher ve taş,矿石与石料,礦石與石料 +necroGroup9,UI,Tooltip,,,,Ingots,,Barren,Lingotes,Lingots,Lingotti,インゴット,주괴,Sztabki,Lingotes,Слитки,Külçeler,锭,錠 +necroGroup10,UI,Tooltip,,,,Parts and junk,,Teile und Schrott,Piezas y chatarra,Pièces et ferraille,Parti e rottami,部品とがらくた,부품과 고철,Części i złom,Peças e sucata,Детали и хлам,Parçalar ve hurda,零件与废料,零件與廢料 +necroGroup11,UI,Tooltip,,,,Materials,,Materialien,Materiales,Matériaux,Materiali,素材,재료,Materiały,Materiais,Материалы,Malzemeler,材料,材料 +necroGroup12,UI,Tooltip,,,,Chemicals,,Chemikalien,Químicos,Produits chimiques,Sostanze chimiche,化学品,화학품,Chemikalia,Químicos,Химия,Kimyasallar,化学品,化學品 +necroGroup13,UI,Tooltip,,,,Tools,,Werkzeuge,Herramientas,Outils,Attrezzi,道具,도구,Narzędzia,Ferramentas,Инструменты,Aletler,工具,工具 +necroGroup14,UI,Tooltip,,,,Weapons,,Waffen,Armas,Armes,Armi,武器,무기,Broń,Armas,Оружие,Silahlar,武器,武器 +necroGroup15,UI,Tooltip,,,,Ammo,,Munition,Munición,Munitions,Munizioni,弾薬,탄약,Amunicja,Munição,Боеприпасы,Mühimmat,弹药,彈藥 +necroGroup16,UI,Tooltip,,,,Armor and clothing,,Rüstung und Kleidung,Armadura y ropa,Armure et vêtements,Armature e vestiti,防具と衣服,방어구와 옷,Pancerz i odzież,Armadura e roupas,Броня и одежда,Zırh ve giysi,护甲与衣物,護甲與衣物 +necroGroup17,UI,Tooltip,,,,Mods,,Mods,Modificaciones,Modifications,Modifiche,MOD,모드,Modyfikacje,Modificações,Модификации,Modlar,改装件,改裝件 +necroGroup18,UI,Tooltip,,,,Books and schematics,,Bücher und Baupläne,Libros y esquemas,Livres et schémas,Libri e schemi,本と設計図,책과 설계도,Książki i schematy,Livros e esquemas,Книги и схемы,Kitaplar ve şemalar,书籍与图纸,書籍與圖紙 +necroGroup19,UI,Tooltip,,,,Blocks,,Blöcke,Bloques,Blocs,Blocchi,ブロック,블록,Bloki,Blocos,Блоки,Bloklar,方块,方塊 +necroGroup20,UI,Tooltip,,,,Necromancy,,Nekromantie,Nigromancia,Nécromancie,Negromanzia,降霊術,강령술,Nekromancja,Necromancia,Некромантия,Nekromansi,亡灵法术,亡靈法術 +necroGroup21,UI,Tooltip,,,,Other,,Sonstiges,Otros,Divers,Altro,その他,기타,Inne,Outros,Прочее,Diğer,其他,其他 +necroGroupOn,UI,Tooltip,,,,carried,,wird getragen,se transporta,transporté,si trasporta,運ぶ,옮김,przenoszone,transportado,носит,taşınır,搬运,搬運 +necroGroupOff,UI,Tooltip,,,,not carried,,wird nicht getragen,no se transporta,pas transporté,non si trasporta,運ばない,옮기지 않음,nieprzenoszone,não transportado,не носит,taşınmaz,不搬运,不搬運 +necroUrnFilterTitle,UI,Tooltip,,,,What to carry,,Was tragen,Qué llevar,Quoi porter,Cosa portare,運ぶもの,옮길 것,Co nosić,O que levar,Что носить,Ne taşınsın,搬运什么,搬運什麼 necroKnifeNoHealth,items,Item,,,,Not enough health,,Nicht genug Gesundheit,Salud insuficiente,Pas assez de vie,Salute insufficiente,体力が足りない,체력이 부족합니다,Za mało zdrowia,Vida insuficiente,Недостаточно здоровья,Yetersiz can,生命不足,生命不足 resourceVictimSkin,items,Item,,,,Victim's Skin,,Haut des Opfers,Piel de la víctima,Peau de la victime,Pelle della vittima,犠牲者の皮,희생자의 가죽,Skóra ofiary,Pele da vítima,Кожа жертвы,Kurbanın Derisi,祭品之皮,祭品之皮 resourceVictimSkinDesc,items,Item,,,,Skin taken from a zombie marked as a Victim by the Necromancer's Knife. An ingredient for necromantic summoning tomes.,,"Haut, abgezogen von einem Zombie, den das Messer des Nekromanten als Opfer markiert hat. Eine Zutat für nekromantische Beschwörungsbücher.",Piel tomada de un zombi marcado como Víctima por el Cuchillo del nigromante. Ingrediente para los tomos de invocación nigrománticos.,Peau prélevée sur un zombie marqué comme Victime par le Couteau du nécromancien. Ingrédient des ouvrages d'invocation nécromantiques.,Pelle presa da uno zombie marchiato come Vittima dal Coltello del negromante. Ingrediente per i tomi di evocazione negromantici.,ネクロマンサーのナイフに「犠牲者」として刻まれたゾンビから剥いだ皮。降霊術の召喚書の材料。,강령술사의 단검이 '희생자'로 표시한 좀비에게서 벗겨낸 가죽. 강령술 소환 서적의 재료입니다.,Skóra zdjęta z zombie oznaczonego jako Ofiara przez Nóż nekromanty. Składnik nekromanckich ksiąg przyzwania.,Pele retirada de um zumbi marcado como Vítima pela Faca do necromante. Ingrediente para os tomos de invocação necromânticos.,"Кожа, снятая с зомби, помеченного Ножом некроманта как Жертва. Ингредиент для некромантских книг призыва.",Nekromantın Bıçağı tarafından Kurban olarak işaretlenmiş bir zombiden yüzülmüş deri. Nekromansi çağırma kitaplarının malzemesi.,从被亡灵法师之刃标记为「祭品」的僵尸身上剥下的皮。亡灵召唤典籍的材料。,從被亡靈法師之刃標記為「祭品」的殭屍身上剝下的皮。亡靈召喚典籍的材料。 diff --git a/Config/XUi_InGame/windows.xml b/Config/XUi_InGame/windows.xml index 1f688c4..013ffdb 100644 --- a/Config/XUi_InGame/windows.xml +++ b/Config/XUi_InGame/windows.xml @@ -208,4 +208,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Config/XUi_InGame/xui.xml b/Config/XUi_InGame/xui.xml index e6ac8a7..be12d3c 100644 --- a/Config/XUi_InGame/xui.xml +++ b/Config/XUi_InGame/xui.xml @@ -59,4 +59,8 @@ + + + + diff --git a/HarmonySrc/Cinerarium.cs b/HarmonySrc/Cinerarium.cs index 1291d6b..772b8b2 100644 --- a/HarmonySrc/Cinerarium.cs +++ b/HarmonySrc/Cinerarium.cs @@ -36,7 +36,7 @@ namespace NecromancerTome public const int Below = 1; public const int Above = 4; public const float KillsPerUrn = 500f; - const byte SaveVersion = 2; // 2 - нити (16.10) + const byte SaveVersion = 3; // 2 - нити, 3 - фильтр логиста (16.10) public bool HasSkull; public bool ZoneShown; @@ -45,6 +45,17 @@ namespace NecromancerTome public bool HasThreadTo; public Vector3i ThreadTo; public bool IsLogist => HasThreadTo || ThreadFrom.Count > 0; + /// Фильтр логиста: бит на группу CinerariumGroups; по умолчанию все включены. + public uint GroupMask = CinerariumGroups.All; + + public bool GroupOn(int _g) => (GroupMask & (1u << _g)) != 0; + + public void ToggleGroup(int _g) + { + GroupMask ^= 1u << _g; + SetModified(); + Debug.Log("[NecromancerTome] Cinerarium: фильтр урны " + ToWorldPos() + " - группа " + _g + (GroupOn(_g) ? " включена" : " выключена")); + } public override void CopyFromInternal(TileEntityComposite _other) { @@ -56,6 +67,7 @@ namespace NecromancerTome ThreadFrom.AddRange(other.ThreadFrom); HasThreadTo = other.HasThreadTo; ThreadTo = other.ThreadTo; + GroupMask = other.GroupMask; _threadsDirty = true; } } @@ -124,6 +136,7 @@ namespace NecromancerTome t.Add(HasThreadTo ? 1 : 0); t.Add(ThreadTo.x); t.Add(ThreadTo.y); t.Add(ThreadTo.z); CinerariumWriteHelper.WriteInts(_bw, t.ToArray()); + CinerariumWriteHelper.WriteInts(_bw, new[] { unchecked((int)GroupMask) }); } public override void Read(PooledBinaryReader _br, StreamModeRead _eStreamMode) @@ -154,6 +167,19 @@ namespace NecromancerTome ThreadTo = new Vector3i(v[k + 1], v[k + 2], v[k + 3]); } } + GroupMask = CinerariumGroups.All; + if (version >= 3) + { + int n = _br.ReadInt32(); + for (int i = 0; i < n; i++) + { + int v = _br.ReadInt32(); + if (i == 0) + { + GroupMask = unchecked((uint)v); + } + } + } _threadsDirty = true; if (version > SaveVersion) { diff --git a/HarmonySrc/CinerariumFilterWindow.cs b/HarmonySrc/CinerariumFilterWindow.cs new file mode 100644 index 0000000..d443b3c --- /dev/null +++ b/HarmonySrc/CinerariumFilterWindow.cs @@ -0,0 +1,84 @@ +using UnityEngine; +using UnityEngine.Scripting; + +namespace NecromancerTome +{ + /// + /// Фильтр урны-логиста (16.10.2026): панель значков групп (CinerariumGroups) в окне «Содержимое» - окно necroUrnFilter + /// добавлено в группу окон игры bagStorage рядом с ячейкой черепа (Config/XUi_InGame). Видна только у урны с нитями; + /// у сумок транспорта и волка (та же группа окон) скрыта. Щелчок по значку включает/выключает группу; по умолчанию все + /// включены. Выключенный значок - тёмный. + /// + [Preserve] + public class XUiC_NecroUrnFilter : XUiController + { + readonly XUiController[] _icons = new XUiController[CinerariumGroups.Count]; + readonly XUiController[] _frames = new XUiController[CinerariumGroups.Count]; + static readonly Color On = Color.white; + static readonly Color Off = new Color(0.25f, 0.25f, 0.25f, 0.6f); + static readonly Color FrameOn = new Color(0.45f, 0.85f, 0.55f, 1f); + static readonly Color FrameOff = new Color(0.2f, 0.2f, 0.2f, 1f); + + public override void Init() + { + base.Init(); + for (int i = 0; i < CinerariumGroups.Count; i++) + { + int g = i; + _icons[i] = GetChildById("g" + i); + _frames[i] = GetChildById("f" + i); + if (_icons[i] == null) + { + continue; + } + _icons[i].OnPress += (_s, _m) => Toggle(g); + if (_icons[i].ViewComponent is XUiV_Sprite sp) + { + sp.UIAtlas = "ItemIconAtlas"; + sp.SpriteName = CinerariumGroups.Icons[g]; + } + } + } + + public override void OnOpen() + { + base.OnOpen(); + Refresh(); + } + + void Toggle(int _g) + { + TEFeatureCinerarium urn = CinerariumContents.Urn; + if (urn == null) + { + return; + } + urn.ToggleGroup(_g); + Refresh(); + } + + void Refresh() + { + TEFeatureCinerarium urn = CinerariumContents.Urn; + bool show = urn != null && urn.IsLogist; + ViewComponent.IsVisible = show; + if (!show) + { + return; + } + for (int i = 0; i < CinerariumGroups.Count; i++) + { + bool on = urn.GroupOn(i); + if (_icons[i]?.ViewComponent is XUiV_Sprite sp) + { + sp.Color = on ? On : Off; + sp.ToolTip = Localization.Get(CinerariumGroups.NameKey(i)) + " - " + Localization.Get(on ? "necroGroupOn" : "necroGroupOff"); + } + if (_frames[i]?.ViewComponent is XUiV_Sprite fr) + { + fr.Color = on ? FrameOn : FrameOff; + } + } + } + } +} diff --git a/HarmonySrc/CinerariumGenie.cs b/HarmonySrc/CinerariumGenie.cs index 1ef0d70..d64100f 100644 --- a/HarmonySrc/CinerariumGenie.cs +++ b/HarmonySrc/CinerariumGenie.cs @@ -35,6 +35,20 @@ namespace NecromancerTome public static float BobHeight = 0.04f; public static float BobPeriod = 4f; public static float Alpha = 0.3f; + /// Засыпание (16.10): игрок дальше SleepDistance - дух замирает дома, огоньки нитей стоят. Работа идёт. + public static float SleepDistance = 40f; + public static bool Hidden; + + /// Далеко ли игрок от точки сцены (без Origin). Для засыпания духа и нитей. + public static bool PlayerFar(Vector3 _scenePos) + { + EntityPlayerLocal pl = GameManager.Instance?.World?.GetPrimaryPlayer(); + if (pl == null) + { + return true; + } + return (pl.GetPosition() - Origin.position - _scenePos).sqrMagnitude > SleepDistance * SleepDistance; + } /// Руки (16.10: «Т-поза бесит»): плечо от вертикали вбок и вперёд, локоть согнут вперёд, градусы. /// Модель в позе покоя, аниматора нет - кости ставятся один раз при появлении. public static float ArmOut = 12f; @@ -72,7 +86,7 @@ namespace NecromancerTome r.receiveShadows = false; if (r is SkinnedMeshRenderer smr) { - smr.updateWhenOffscreen = true; // скелет свой и неподвижный - границы не пересчитываются, не пропадать с краю экрана + smr.updateWhenOffscreen = false; // 16.10: вне экрана скелет не считать (экономия); границы - от сетки } if (r.name.Contains("eye")) { @@ -421,9 +435,28 @@ namespace NecromancerTome CinerariumGenie.Live.Remove(this); } + float _nextSleepCheck; + bool _asleep; + void Update() { - if (_stuck) + if (Time.time >= _nextSleepCheck) + { + _nextSleepCheck = Time.time + 0.5f; + bool asleep = CinerariumGenie.PlayerFar(transform.position); + if (asleep && !_asleep) + { + _t = -1f; // полёт прерван - дело всё равно выполнится + Gesture(0f); + transform.localPosition = Home(); + } + _asleep = asleep; + foreach (Renderer r in GetComponentsInChildren(true)) + { + r.enabled = !CinerariumGenie.Hidden; + } + } + if (_stuck || _asleep) { return; // замер как был } @@ -505,12 +538,18 @@ namespace NecromancerTome "necrogenie alpha <0-1> - body brightness (the body adds light, it is not alpha-blended)\n" + "necrogenie glow <0-1> - body's own glow (visible at night)\n" + "necrogenie tint - body colour\n" + - "necrogenie arms - arm pose, degrees: upper arm from vertical sideways and forward, elbow bend"; + "necrogenie arms - arm pose, degrees: upper arm from vertical sideways and forward, elbow bend\n" + + "necrogenie sleep - spirits and threads freeze when the player is farther (work goes on)\n" + + "necrogenie hide|show - hide all spirits (weak PCs, video), work goes on"; } public override void Execute(List _params, CommandSenderInfo _senderInfo) { SdtdConsole con = SingletonMonoBehaviour.Instance; + if (_params.Count == 1 && (_params[0] == "hide" || _params[0] == "show")) + { + CinerariumGenie.Hidden = _params[0] == "hide"; + } if (_params.Count >= 2 && float.TryParse(_params[1], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out float v)) { switch (_params[0].ToLowerInvariant()) @@ -539,6 +578,9 @@ namespace NecromancerTome CinerariumGenie.Glow = Mathf.Clamp01(v); CinerariumGenie.ApplyAlpha(); break; + case "sleep": + CinerariumGenie.SleepDistance = Mathf.Max(5f, v); + break; case "arms": CinerariumGenie.ArmOut = v; if (_params.Count >= 3 && float.TryParse(_params[2], System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, out float af)) @@ -572,7 +614,7 @@ namespace NecromancerTome ", bob " + CinerariumGenie.BobHeight.ToString("F2") + " / " + CinerariumGenie.BobPeriod.ToString("F1") + " s, alpha " + CinerariumGenie.Alpha.ToString("F2") + ", glow " + CinerariumGenie.Glow.ToString("F2") + ", tint " + CinerariumGenie.Tint.r.ToString("F2") + " " + CinerariumGenie.Tint.g.ToString("F2") + " " + CinerariumGenie.Tint.b.ToString("F2") + ", arms " + CinerariumGenie.ArmOut.ToString("F0") + " " + - CinerariumGenie.ArmFwd.ToString("F0") + " " + CinerariumGenie.Elbow.ToString("F0") + "; spirits on screen: " + CinerariumGenie.Live.Count); + CinerariumGenie.ArmFwd.ToString("F0") + " " + CinerariumGenie.Elbow.ToString("F0") + ", sleep " + CinerariumGenie.SleepDistance.ToString("F0") + " m" + (CinerariumGenie.Hidden ? ", HIDDEN" : "") + "; spirits on screen: " + CinerariumGenie.Live.Count); } } } diff --git a/HarmonySrc/CinerariumGroups.cs b/HarmonySrc/CinerariumGroups.cs new file mode 100644 index 0000000..9e8dd50 --- /dev/null +++ b/HarmonySrc/CinerariumGroups.cs @@ -0,0 +1,175 @@ +using System; +using System.Collections.Generic; + +namespace NecromancerTome +{ + /// + /// Группы предметов для фильтра урны-логиста (16.10.2026): «пиктограммы, которые по умолчанию выбраны и активны... + /// изображения предмета, символизирующего группу предметов... Дух-логист будет переносить только те предметы, которые + /// активированы в его урне. Это же прямой путь к автоматизации сортировки». Деление игры (свойство Group) грубое - + /// «Ресурсы» смешивают руду, слитки, детали и кур, - поэтому группы свои, а предмет относится к группе по классу, тегам и + /// имени. Предметы других модов разойдутся по тем же правилам; что не подошло никуда - «Прочее». + /// Номер группы = номер бита в TEFeatureCinerarium.GroupMask - порядок НЕ менять (сейвы), новые - только в конец. + /// + public static class CinerariumGroups + { + public const int Cooked = 0, Canned = 1, Raw = 2, Harvest = 3, Flowers = 4, Seeds = 5, Drinks = 6, Medicine = 7, Ore = 8, + Ingots = 9, Parts = 10, Materials = 11, Chemicals = 12, Tools = 13, Weapons = 14, Ammo = 15, Armor = 16, Mods = 17, + Books = 18, Blocks = 19, Necro = 20, Other = 21; + public const int Count = 22; + public const uint All = (1u << Count) - 1; + + /// Значок группы - иконка типичного предмета (ItemIconAtlas). + public static readonly string[] Icons = + { + "foodMeatStew", "foodCanChili", "foodRawMeat", "foodCropCorn", "plantedChrysanthemum3Harvest", "plantedCorn1", + "drinkJarBoiledWater", "medicalFirstAidKit", "resourceRockSmall", "resourceForgedSteel", "resourceMechanicalParts", + "resourceWood", "resourceGunPowder", "meleeToolPickT1IronPickaxe", "gunHandgunT1Pistol", "ammo9mmBulletBall", + "armorMinerHelmet", "modGunLaserSight", "bookArtOfMiningLuckyStrike", "cobblestoneMaster", "necroSkull", "oldCash" + }; + + /// Ключ названия группы в Localization.csv: necroGroup0..necroGroup21. + public static string NameKey(int _g) => "necroGroup" + _g; + + static readonly HashSet OreNames = new HashSet + { + "resourceRockSmall", "resourceRockSmallBundle", "resourceScrapIron", "resourceScrapIronBundle", "resourceScrapLead", + "resourceLeadBundle", "resourceCoal", "resourceCoalBundle", "resourcePotassiumNitratePowder", + "resourcePotassiumNitratePowderBundle", "resourceOilShale", "resourceOilShaleBundle", "resourceClayLump", + "resourceCrushedSand", "resourceCobblestones", "resourceGoldNugget", "resourceSilverNugget", "resourceRawDiamond", + "resourceSnowBall" + }; + static readonly HashSet IngotNames = new HashSet { "resourceForgedIron", "resourceForgedSteel" }; + static readonly HashSet ChemNames = new HashSet + { + "resourceGunPowder", "resourceGunPowderBundle", "resourceOil", "ammoGasCan", "ammoGasCanBundle", "resourceAcid", + "resourceGlue", "resourcePaint", "resourceTestosteroneExtract" + }; + static readonly HashSet MaterialNames = new HashSet + { + "resourceWood", "resourceWoodBundle", "resourceCloth", "resourceLeather", "resourceBone", "resourceFeather", + "resourceYuccaFibers", "resourcePaper", "resourceCement", "resourceConcreteMix", "resourceBeeswax", "resourceCandleStick" + }; + static readonly HashSet AmmoParts = new HashSet + { + "resourceArrowHeadIron", "resourceArrowHeadSteelAP", "resourceBuckshot", "resourceBulletCasing", "resourceBulletTip", + "resourceRocketCasing", "resourceRocketTip" + }; + static readonly HashSet RawNames = new HashSet + { + "foodRawMeat", "foodRawMeatBundle", "foodEgg", "foodHoney", "foodRottingFlesh" + }; + + static readonly Dictionary _cache = new Dictionary(); + + public static int Of(ItemValue _iv) + { + ItemClass ic = _iv?.ItemClass; + if (ic == null) + { + return Other; + } + if (!_cache.TryGetValue(ic.Id, out int g)) + { + g = Classify(ic, _iv); + _cache[ic.Id] = g; + } + return g; + } + + static bool Tag(ItemClass _ic, string _t) + { + return _ic.ItemTags.Test_AnySet(FastTags.Parse(_t)); + } + + static int Classify(ItemClass _ic, ItemValue _iv) + { + string n = _ic.GetItemName() ?? ""; + if (n.IndexOf("necro", StringComparison.OrdinalIgnoreCase) >= 0) + { + return Necro; + } + if (_ic is ItemClassModifier) + { + return Mods; + } + if (_ic.IsBlock()) + { + return new ItemValue(_ic.Id).ToBlockValue().Block is BlockPlantGrowing ? Seeds : Blocks; + } + if (_ic is ItemClassArmor || n.StartsWith("armor") || n.StartsWith("clothing")) + { + return Armor; + } + if (n.StartsWith("book") || n.Contains("Schematic") || n.Contains("Magazine") || Tag(_ic, "books")) + { + return Books; + } + if (OreNames.Contains(n)) + { + return Ore; + } + if (IngotNames.Contains(n) || n.StartsWith("unit_")) + { + return Ingots; + } + if (ChemNames.Contains(n)) + { + return Chemicals; + } + if (MaterialNames.Contains(n)) + { + return Materials; + } + if (AmmoParts.Contains(n) || n.StartsWith("ammo") || n.StartsWith("thrown") || Tag(_ic, "ammo")) + { + return Ammo; + } + if (n.EndsWith("Parts") || n == "partsMaster" || n.StartsWith("vehicle") && !n.EndsWith("Placeable")) + { + return Parts; + } + if (n.StartsWith("gun") || n.StartsWith("meleeWpn") || Tag(_ic, "weapon")) + { + return Weapons; + } + if (n.StartsWith("meleeTool") || n.StartsWith("tool") || n.StartsWith("bucket") || Tag(_ic, "tool")) + { + return Tools; + } + if (n.StartsWith("foodCan")) + { + return Canned; + } + if (n.StartsWith("foodCrop")) + { + return Harvest; + } + if (n.StartsWith("resourceCrop")) + { + return Flowers; + } + if (RawNames.Contains(n) || n.StartsWith("foodRaw")) + { + return Raw; + } + if (n.StartsWith("drink")) + { + return Drinks; + } + if (n.StartsWith("medical") || n.StartsWith("drug") || Tag(_ic, "medical")) + { + return Medicine; + } + if (n.StartsWith("food") || Tag(_ic, "food")) + { + return Cooked; + } + if (n.StartsWith("resource") || n == "carBattery" || n == "smallEngine" || n == "solarCell") + { + return Parts; + } + return Other; + } + } +} diff --git a/HarmonySrc/CinerariumThreads.cs b/HarmonySrc/CinerariumThreads.cs index 928d826..77e2179 100644 --- a/HarmonySrc/CinerariumThreads.cs +++ b/HarmonySrc/CinerariumThreads.cs @@ -329,8 +329,20 @@ namespace NecromancerTome } } + float _nextSleepCheck; + bool _asleep; + void Update() { + if (Time.time >= _nextSleepCheck) + { + _nextSleepCheck = Time.time + 0.5f; + _asleep = CinerariumGenie.PlayerFar(transform.position); // засыпание (16.10): огоньки стоят + } + if (_asleep) + { + return; + } foreach (Thread th in _threads) { float len = Mathf.Max(0.5f, Vector3.Distance(th.A, th.B)); diff --git a/HarmonySrc/CinerariumTrunk.cs b/HarmonySrc/CinerariumTrunk.cs index eaa0136..dcae0bb 100644 --- a/HarmonySrc/CinerariumTrunk.cs +++ b/HarmonySrc/CinerariumTrunk.cs @@ -15,6 +15,8 @@ namespace NecromancerTome public const string LootTemplate = "roboticDrone"; // звуки и время открытия, как у сумки волка static TEFeatureCinerarium _urn; + /// Урна, чьё «Содержимое» сейчас открыто (окно фильтра логиста), или null. + public static TEFeatureCinerarium Urn => _urn; static Bag _bag; static EntityPlayerLocal _player; diff --git a/HarmonySrc/CinerariumWork.cs b/HarmonySrc/CinerariumWork.cs index 29f16a8..9701bfd 100644 --- a/HarmonySrc/CinerariumWork.cs +++ b/HarmonySrc/CinerariumWork.cs @@ -131,8 +131,8 @@ namespace NecromancerTome return null; } - /// Перевозка по нитям: одна стопка из ящика «откуда» в ящик «куда». По образцу - только то, что в «куда» уже - /// есть (пустой «куда» - что угодно); «куда» полон - ждём (дух не чернеет). Открытые у игрока ящики и закреплённые + /// Перевозка по нитям: одна стопка из ящика «откуда» в ящик «куда». Только предметы включённых в урне групп + /// (фильтр логиста, CinerariumGroups; 16.10 заменил прежнее правило «по образцу»); «куда» полон - ждём (дух не чернеет). Открытые у игрока ящики и закреплённые /// ячейки не трогаются. Возвращает ящик «куда», LastFrom - откуда взято. static Vector3i? Ferry(World _world, TEFeatureCinerarium _urn) { @@ -145,7 +145,6 @@ namespace NecromancerTome { return null; } - bool any = dst.IsEmpty(); foreach (Vector3i f in _urn.ThreadFrom) { if (f == _urn.ThreadTo) @@ -160,7 +159,7 @@ namespace NecromancerTome for (int k = 0; k < src.ItemGrid.Length; k++) { ItemStack s = src.ItemGrid[k]; - if (s == null || s.IsEmpty() || Locked(src, k) || (!any && !Holds(dst, s.itemValue.type)) || !Fits(dst, s)) + if (s == null || s.IsEmpty() || Locked(src, k) || !_urn.GroupOn(CinerariumGroups.Of(s.itemValue)) || !Fits(dst, s)) { continue; } @@ -192,19 +191,6 @@ namespace NecromancerTome c.TryGetSelfOrFeature(out TEFeatureStorage s) ? s : null; } - static bool Holds(TEFeatureStorage _t, int _type) - { - for (int i = 0; i < _t.ItemGrid.Length; i++) - { - ItemStack x = _t.ItemGrid[i]; - if (x != null && !x.IsEmpty() && x.itemValue.type == _type) - { - return true; - } - } - return false; - } - static bool IsRipe(Block _b) { return _b != null && !(_b is BlockPlantGrowing) && _b.HasAnyFastTags(CropTag) && diff --git a/NecromancerHarmony.dll b/NecromancerHarmony.dll index ed18dde..3e006bb 100644 Binary files a/NecromancerHarmony.dll and b/NecromancerHarmony.dll differ