1.3.0: шкала 20 убийств за уровень, два индикатора, мир между подчинёнными
Уровень навыка игра хранит ОДНИМ БАЙТОМ (ProgressionValue.Write/Read), поэтому старая шкала "одно убийство - один уровень" при max_level=5000 на каждом сохранении откатывала уровень на 256 назад. Снаружи это выглядело как самопроизвольно закрывающиеся рецепты (жалоба со стрима: Слёзы мертвеца открыты, Пир падальщика под замком при 250+ убитых), а тиры 500/2000/3000/5000 были недостижимы в принципе. Подтверждено на двух живых сейвах: sezon8 - 384 убийства при уровне 129, test8 - 303 при уровне 48. Шкала переведена на 20 убийств = 1 уровень, max_level=250 - влезает в байт с запасом. Уровень больше не накапливается, а вычисляется из necroZombieKillsCVar (float, сохраняется честно) и на каждом убийстве, и постфиксом на PlayerDataFile.ToPlayer - последнее чинит старые сейвы само, без команд и новой игры. Открытое при этом не теряется: в старой шкале уровень всегда был не больше счётчика, так что пересчёт может только вернуть украденное переполнением. Отдельно закрыт случай "счётчик пуст, а уровень есть" - счётчик восстанавливается из уровня по старой шкале. Все пороги пересчитаны в уровни, числа убийств не тронуты, кроме воды: 30 на сетку шагом 20 не ложится, по указанию пользователя мод переехал на 20 - туда же, где браслет и Кровавая сфера. Тег necroNecromancyLvl30 удалён. Сходимость всех 18 рецептов (тег -> RecipeTagUnlocked -> unlock_tier) проверена скриптом. Два индикатора: череп в статус-баре показывает уровень (раньше - общее число убийств), фиолетовая шкала над полосой опыта - продвижение внутри уровня, 0..20. Шкала сделана вёрсткой, а не баффом (бафф умеет число, но не полосу), заполнение привязано через XUi-выражение cvar(). Закрывающая скобка у выражения - одна "}", а не "%}": лишний "%" NCalc читает как остаток от деления и ждёт правый операнд, на чём первая проверка в игре и споткнулась. Третья правка: подчинённые зомби больше не дерутся между собой. Девиация выдаёт приказ "бей зомби", а подчинённый сам EntityZombie, и в targetClasses выражается только тип. Постфикс на EAITarget.check вычёркивает подчинённого из кандидатов (зомби выбирает следующего, настоящего врага), префикс на EntityAlive.SetAttackTarget гасит цель на путях мимо выбора - прежде всего месть, когда подчиняют уже дерущихся. Тексты на 13 языках, README (RU+EN), описания для сайта и Nexus приведены к новой шкале. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
fbd58ad018
commit
ed5fea5192
@@ -1,10 +1,10 @@
|
||||
Key,File,Type,UsedInMainMenu,NoTranslate,KeepLoaded,english,Context / Alternate Text,german,spanish,french,italian,japanese,koreana,polish,brazilian,russian,turkish,schinese,tchinese
|
||||
buffNecroZombieKillTrackerDisplay,buffs,Buff,,,,Zombie Kill Tracker,,Zähler getöteter Zombies,Contador de zombis eliminados,Compteur de zombies tués,Contatore di zombie uccisi,ゾンビ討伐カウンター,좀비 처치 기록기,Licznik zabitych zombie,Contador de zumbis mortos,Счётчик убитых зомби,Öldürülen Zombi Sayacı,僵尸击杀计数器,殭屍擊殺計數器
|
||||
buffNecroZombieKillTrackerDisplayName,buffs,Buff,,,,Total Zombie Kills,,Getötete Zombies insgesamt,Total de zombis eliminados,Total de zombies tués,Zombie uccisi in totale,ゾンビ討伐総数,총 좀비 처치 수,Łącznie zabitych zombie,Total de zumbis mortos,Всего убито зомби,Toplam Öldürülen Zombi,僵尸击杀总数,殭屍擊殺總數
|
||||
buffNecroZombieKillTrackerDisplayDesc,buffs,Buff,,,,Tracks the total number of zombies you have killed. Never resets.,,"Zählt, wie viele Zombies du insgesamt getötet hast. Wird nie zurückgesetzt.",Cuenta el número total de zombis que has eliminado. Nunca se reinicia.,Compte le nombre total de zombies que tu as tués. Ne se réinitialise jamais.,Conta il numero totale di zombie che hai ucciso. Non si azzera mai.,あなたが倒したゾンビの総数を数える。リセットされることはない。,당신이 처치한 좀비의 총수를 셉니다. 절대 초기화되지 않습니다.,Liczy łączną liczbę zabitych przez ciebie zombie. Nigdy się nie zeruje.,Conta o número total de zumbis que você matou. Nunca é reiniciado.,Считает общее количество убитых вами зомби. Никогда не сбрасывается.,Öldürdüğün toplam zombi sayısını takip eder. Asla sıfırlanmaz.,统计你击杀的僵尸总数。永不重置。,統計你擊殺的殭屍總數。永不重置。
|
||||
buffNecroZombieKillTrackerDisplay,buffs,Buff,,,,Necromancy Level,,Nekromantie-Stufe,Nivel de Nigromancia,Niveau de Nécromancie,Livello di Negromanzia,降霊術レベル,강령술 레벨,Poziom Nekromancji,Nível de Necromancia,Уровень некромантии,Nekromansi Seviyesi,亡灵法术等级,亡靈法術等級
|
||||
buffNecroZombieKillTrackerDisplayName,buffs,Buff,,,,Necromancy Level,,Nekromantie-Stufe,Nivel de Nigromancia,Niveau de Nécromancie,Livello di Negromanzia,降霊術レベル,강령술 레벨,Poziom Nekromancji,Nível de Necromancia,Уровень некромантии,Nekromansi Seviyesi,亡灵法术等级,亡靈法術等級
|
||||
buffNecroZombieKillTrackerDisplayDesc,buffs,Buff,,,,Your Necromancy level. Every 20 zombies you put to rest raise it by one; the purple bar beside the experience bar shows how far you are into the current level.,,Deine Nekromantie-Stufe. Je 20 zur Ruhe gebettete Zombies bringen eine Stufe; der violette Balken neben der Erfahrungsleiste zeigt den Fortschritt innerhalb der aktuellen Stufe.,Tu nivel de Nigromancia. Cada 20 zombis que devuelves al descanso suben un nivel; la barra morada junto a la de experiencia muestra tu progreso dentro del nivel actual.,Ton niveau de Nécromancie. Chaque tranche de 20 zombies mis au repos donne un niveau ; la barre violette près de la barre d'expérience indique ta progression dans le niveau en cours.,Il tuo livello di Negromanzia. Ogni 20 zombie messi a riposo valgono un livello; la barra viola accanto a quella dell'esperienza mostra i tuoi progressi nel livello attuale.,降霊術のレベル。ゾンビを20体葬るごとに1レベル上がる。経験値バーの隣にある紫のバーは、現在のレベル内での進み具合を示す。,"당신의 강령술 레벨입니다. 좀비 20마리를 잠재울 때마다 1레벨씩 오르며, 경험치 막대 옆의 보라색 막대가 현재 레벨의 진행도를 보여줍니다.","Twój poziom Nekromancji. Każde 20 uśpionych zombie daje jeden poziom, a fioletowy pasek obok paska doświadczenia pokazuje postęp w obecnym poziomie.",Seu nível de Necromancia. A cada 20 zumbis levados ao descanso você sobe um nível; a barra roxa ao lado da barra de experiência mostra o progresso dentro do nível atual.,"Твой уровень некромантии. Каждые 20 упокоенных зомби поднимают его на единицу, а фиолетовая шкала рядом с полосой опыта показывает продвижение внутри текущего уровня.",Nekromansi seviyen. Huzura kavuşturduğun her 20 zombi bir seviye kazandırır; deneyim çubuğunun yanındaki mor çubuk mevcut seviyedeki ilerlemeni gösterir.,你的亡灵法术等级。每安息 20 只僵尸提升一级,经验条旁边的紫色进度条显示当前等级内的进度。,你的亡靈法術等級。每安息 20 隻殭屍提升一級,經驗條旁邊的紫色進度條顯示目前等級內的進度。
|
||||
craftingNecroNecromancyName,progression,Attribute,,,,Necromancy,,Nekromantie,Nigromancia,Nécromancie,Negromanzia,降霊術,강령술,Nekromancja,Necromancia,Некромантия,Nekromansi,亡灵法术,亡靈法術
|
||||
craftingNecroNecromancyDesc,progression,Attribute,,,,Levels up as you kill zombies.,,"Steigt, während du Zombies tötest.",Sube de nivel a medida que matas zombis.,Progresse à mesure que tu tues des zombies.,Sale di livello man mano che uccidi zombie.,ゾンビを倒すほどレベルが上がる。,좀비를 처치할수록 레벨이 오릅니다.,Rośnie w miarę zabijania zombie.,Sobe de nível conforme você mata zumbis.,Растёт по мере убийства зомби.,Zombi öldürdükçe seviye kazanır.,随着击杀僵尸而提升。,隨著擊殺殭屍而提升。
|
||||
craftingNecroNecromancyLongDesc,progression,Attribute,,,,"Every zombie you kill adds a level to this skill, up to 5000. Its recipes unlock in 5 groups by total zombies killed: Adept from the start, Journeyman at 500, Apprentice at 2000, Necromancer at 3000, Master at 5000.",,"Jeder getötete Zombie bringt dieser Fertigkeit eine Stufe, bis zu 5000. Ihre Rezepte schalten sich in 5 Gruppen frei, nach der Gesamtzahl getöteter Zombies: Adept von Anfang an, Geselle bei 500, Lehrling bei 2000, Nekromant bei 3000, Meister bei 5000.","Cada zombi que matas añade un nivel a esta habilidad, hasta 5000. Sus recetas se desbloquean en 5 grupos según el total de zombis eliminados: Adepto desde el principio, Oficial a los 500, Aprendiz a los 2000, Nigromante a los 3000, Maestro a los 5000.","Chaque zombie tué ajoute un niveau à cette compétence, jusqu'à 5000. Ses recettes se débloquent en 5 groupes selon le total de zombies tués : Adepte dès le début, Compagnon à 500, Apprenti à 2000, Nécromancien à 3000, Maître à 5000.","Ogni zombie che uccidi aggiunge un livello a questa abilità, fino a 5000. Le sue ricette si sbloccano in 5 gruppi in base al totale di zombie uccisi: Adepto fin dall'inizio, Artigiano a 500, Apprendista a 2000, Negromante a 3000, Maestro a 5000.",ゾンビを1体倒すごとに、このスキルのレベルが1上がる(上限5000)。レシピは討伐総数に応じて5つのグループで解放される。アデプトは最初から、ジャーニーマンは500、見習いは2000、ネクロマンサーは3000、マスターは5000。,"좀비를 하나 처치할 때마다 이 기술의 레벨이 1씩 오릅니다(최대 5000). 제작법은 누적 처치 수에 따라 5개 그룹으로 해금됩니다. 숙련자는 처음부터, 직인은 500, 도제는 2000, 강령술사는 3000, 명인은 5000.","Każdy zabity zombie dodaje poziom tej umiejętności, aż do 5000. Jej receptury odblokowują się w 5 grupach według łącznej liczby zabitych zombie: Adept od początku, Czeladnik przy 500, Uczeń przy 2000, Nekromanta przy 3000, Mistrz przy 5000.","Cada zumbi que você mata adiciona um nível a esta habilidade, até 5000. Suas receitas são desbloqueadas em 5 grupos conforme o total de zumbis mortos: Adepto desde o início, Oficial aos 500, Aprendiz aos 2000, Necromante aos 3000, Mestre aos 5000.","Каждый убитый зомби добавляет уровень этому навыку, максимум 5000. Рецепты открываются 5 группами по общему числу убитых зомби: Адепт — с самого начала, Подмастерье — 500, Ученик — 2000, Некромант — 3000, Мастер — 5000.","Öldürdüğün her zombi bu yeteneğe bir seviye ekler, en fazla 5000'e kadar. Tarifleri, toplam öldürülen zombi sayısına göre 5 grup hâlinde açılır: Ehil en baştan, Kalfa 500'de, Çırak 2000'de, Nekromant 3000'de, Usta 5000'de.",每击杀一只僵尸,此技能便提升一级,上限 5000。其配方按击杀总数分 5 组解锁:修习者一开始即可用,熟手 500,学徒 2000,亡灵法师 3000,宗师 5000。,每擊殺一隻殭屍,此技能便提升一級,上限 5000。其配方按擊殺總數分 5 組解鎖:修習者一開始即可用,熟手 500,學徒 2000,亡靈法師 3000,宗師 5000。
|
||||
craftingNecroNecromancyLongDesc,progression,Attribute,,,,"Every 20 zombies you kill add a level to this skill, up to level 250 (5000 zombies). Its recipes unlock in 5 groups by level: Adept from the start, Journeyman at 25, Apprentice at 100, Necromancer at 150, Master at 250.",,"Je 20 getötete Zombies bringen dieser Fertigkeit eine Stufe, bis zu Stufe 250 (5000 Zombies). Ihre Rezepte schalten sich in 5 Gruppen nach Stufe frei: Adept von Anfang an, Geselle bei 25, Lehrling bei 100, Nekromant bei 150, Meister bei 250.","Cada 20 zombis que matas añaden un nivel a esta habilidad, hasta el nivel 250 (5000 zombis). Sus recetas se desbloquean en 5 grupos según el nivel: Adepto desde el principio, Oficial a los 25, Aprendiz a los 100, Nigromante a los 150, Maestro a los 250.","Chaque tranche de 20 zombies tués ajoute un niveau à cette compétence, jusqu'au niveau 250 (5000 zombies). Ses recettes se débloquent en 5 groupes selon le niveau : Adepte dès le début, Compagnon à 25, Apprenti à 100, Nécromancien à 150, Maître à 250.","Ogni 20 zombie uccisi aggiungono un livello a questa abilità, fino al livello 250 (5000 zombie). Le sue ricette si sbloccano in 5 gruppi in base al livello: Adepto fin dall'inizio, Artigiano a 25, Apprendista a 100, Negromante a 150, Maestro a 250.",ゾンビを20体倒すごとに、このスキルのレベルが1上がる(上限250、ゾンビ5000体)。レシピはレベルに応じて5つのグループで解放される。アデプトは最初から、ジャーニーマンは25、見習いは100、ネクロマンサーは150、マスターは250。,"좀비 20마리를 처치할 때마다 이 기술의 레벨이 1씩 오릅니다(최대 250, 좀비 5000마리). 제작법은 레벨에 따라 5개 그룹으로 해금됩니다. 숙련자는 처음부터, 직인은 25, 도제는 100, 강령술사는 150, 명인은 250.","Każde 20 zabitych zombie dodaje poziom tej umiejętności, aż do poziomu 250 (5000 zombie). Jej receptury odblokowują się w 5 grupach według poziomu: Adept od początku, Czeladnik przy 25, Uczeń przy 100, Nekromanta przy 150, Mistrz przy 250.","A cada 20 zumbis mortos você ganha um nível nesta habilidade, até o nível 250 (5000 zumbis). Suas receitas são desbloqueadas em 5 grupos conforme o nível: Adepto desde o início, Oficial aos 25, Aprendiz aos 100, Necromante aos 150, Mestre aos 250.","Каждые 20 убитых зомби добавляют уровень этому навыку, максимум 250 (5000 зомби). Рецепты открываются 5 группами по уровню: Адепт — с самого начала, Подмастерье — 25, Ученик — 100, Некромант — 150, Мастер — 250.","Öldürdüğün her 20 zombi bu yeteneğe bir seviye ekler, en fazla 250. seviyeye kadar (5000 zombi). Tarifleri, seviyeye göre 5 grup hâlinde açılır: Ehil en baştan, Kalfa 25'te, Çırak 100'de, Nekromant 150'de, Usta 250'de.",每击杀 20 只僵尸,此技能便提升一级,上限 250 级(5000 只僵尸)。其配方按等级分 5 组解锁:修习者一开始即可用,熟手 25 级,学徒 100 级,亡灵法师 150 级,宗师 250 级。,每擊殺 20 隻殭屍,此技能便提升一級,上限 250 級(5000 隻殭屍)。其配方按等級分 5 組解鎖:修習者一開始即可用,熟手 25 級,學徒 100 級,亡靈法師 150 級,宗師 250 級。
|
||||
craftingNecroNecromancyTier1Name,progression,Attribute,,,,Adept,,Adept,Adepto,Adepte,Adepto,アデプト,숙련자,Adept,Adepto,Адепт,Ehil,修习者,修習者
|
||||
craftingNecroNecromancyTier2Name,progression,Attribute,,,,Journeyman,,Geselle,Oficial,Compagnon,Artigiano,ジャーニーマン,직인,Czeladnik,Oficial,Подмастерье,Kalfa,熟手,熟手
|
||||
craftingNecroNecromancyTier3Name,progression,Attribute,,,,Apprentice,,Lehrling,Aprendiz,Apprenti,Apprendista,見習い,도제,Uczeń,Aprendiz,Ученик,Çırak,学徒,學徒
|
||||
|
||||
|
@@ -116,4 +116,50 @@
|
||||
<sprite name="blackout" depth="0" sprite="menu_empty" type="sliced" color="[black]" anchor_left="#cam,0,-10" anchor_right="#cam,1,10" anchor_bottom="#cam,0,-10" anchor_top="#cam,1,10" globalopacitymod="0"/>
|
||||
</window>
|
||||
</append>
|
||||
<!-- ФИОЛЕТОВАЯ ШКАЛА НЕКРОМАНТИИ, 2026-09-17. Продиктовано: "Есть индикатор опыта. Это шкала
|
||||
до уровня. А мы сделаем ещё одну шкалу, которая заполняется каждые 20 зомби... Каждое
|
||||
заполнение индикатора пусть добавляет уровень некромантии, а индикатор обнуляет."
|
||||
|
||||
Заполнение считает не вёрстка: necroNecromancyProgressCVar (0..19) пишет
|
||||
HarmonySrc/NecromancyKillCreditPatch.cs на каждом убийстве и при загрузке игрока, деля
|
||||
общее число упокоенных зомби на 20 с остатком. Шкала обнуляется сама собой - вместе с
|
||||
переходом остатка через двадцатку растёт уровень Некромантии (череп в статус-баре).
|
||||
|
||||
ПОЧЕМУ ЭТО ВЁРСТКА, А НЕ ЕЩЁ ОДИН БАФФ. Бафф умеет показать ЧИСЛО (display_value), но не
|
||||
полосу. Полоса - это sprite type="filled" с атрибутом fill 0..1, и живёт она в окне.
|
||||
Взято ровно то окно и ровно тот приём, которым нарисована ванильная полоса опыта:
|
||||
windowToolbelt, три спрайта друг на друге (серая подложка, чёрная рамка fillcenter="false",
|
||||
заливка) - см. Data/Config/XUi_InGame/windows.xml, строки с fill="{xp}". Наша полоса
|
||||
стоит на 12 пикселей выше опыта (pos 0,20 против 0,8) и той же ширины 750.
|
||||
|
||||
ПРИВЯЗКА. fill читает CVar через функцию выражений cvar() - она есть в самой игре
|
||||
(BindingNcalcFunctions.cvar, регистрирует BindingInfoNcalc.VariableStateCVar, который
|
||||
сам перечитывает значение, а не застывает на первом).
|
||||
|
||||
ЗАКРЫВАЮЩАЯ СКОБКА - ОДНА "}", А НЕ "%}". Это не стилистика, а единственная рабочая форма,
|
||||
и первая же проверка в игре (17.09, лог 22-36-46) на этом и споткнулась:
|
||||
|
||||
ERR [XUi] Binding expression can not be evaluated. Binding fill="{% cvar(...) / 20 %}"
|
||||
EXC no viable alternative at input '<EOF>' at line 1:44
|
||||
|
||||
Открывается выражение как "{%", а закрывается просто "}" - так во всех ванильных
|
||||
примерах (Data/Config/XUi_InGame/windows.xml: visible="{% int(windowWidth) >= 300 }",
|
||||
text="{% dictvalue(sandboxvalues, '1') }"). Лишний "%" остаётся ВНУТРИ выражения, а в
|
||||
NCalc это оператор остатка от деления, поэтому парсер честно ждёт после него правый
|
||||
операнд и упирается в конец строки - позиция 44 в сообщении указывает ровно на него.
|
||||
Ошибка разовая, не в каждый кадр: привязка, не сумев вычислиться, гаснет насовсем, то
|
||||
есть полоса просто не работает молча.
|
||||
|
||||
Если полоса когда-нибудь опять не появится или застынет - запасной путь такой: писать из
|
||||
C# готовую долю 0..1 в отдельный CVar и подставлять её без арифметики в вёрстке. Своего XUi-контроллера тут сознательно
|
||||
нет: находит ли движок контроллер из сборки мода, в этом моде так и не проверено (см.
|
||||
комментарий к финальным слайдам выше), а окно с контроллером было бы риском без нужды.
|
||||
|
||||
Цвет 150,60,220 - фиолетовый, как просили; альфа 200, чтобы полоса читалась поверх
|
||||
тёмного HUD, но не спорила с опытом яркостью. -->
|
||||
<append xpath="/windows/window[@name='windowToolbelt']/rect">
|
||||
<sprite depth="1" pos="0,20" height="8" color="[mediumGrey]" sprite="menu_empty2px" globalopacitymod="0" type="sliced" />
|
||||
<sprite depth="9" pos="0,20" height="8" color="[black]" sprite="menu_empty2px" globalopacitymod="0" type="sliced" fillcenter="false" />
|
||||
<sprite depth="4" pos="0,20" height="8" width="750" color="150,60,220,200" globalopacitymod="0" type="filled" fill="{% cvar('necroNecromancyProgressCVar') / 20 }" />
|
||||
</append>
|
||||
</windows>
|
||||
|
||||
+18
-2
@@ -10,12 +10,28 @@
|
||||
</append>
|
||||
|
||||
<append xpath="/buffs">
|
||||
<!-- Never expires (duration 0): a persistent lifetime total, not a per-day/session counter. -->
|
||||
<!-- Never expires (duration 0): a persistent lifetime total, not a per-day/session counter.
|
||||
|
||||
ЧТО ПОКАЗЫВАЕТ, ИЗМЕНЕНО 2026-09-17. Раньше бафф показывал общее число убитых зомби
|
||||
(necroZombieKillsCVar). Теперь - УРОВЕНЬ НЕКРОМАНТИИ (necroNecromancyLevelCVar), по
|
||||
указанию пользователя: "череп - уровень некромантии... 20 зомби за уровень". Само
|
||||
число убийств никуда не делось, оно по-прежнему копится в necroZombieKillsCVar (и
|
||||
по-прежнему задаёт урон ножа ниже) - просто на экране его место занял уровень, а
|
||||
продвижение внутри уровня показывает отдельная фиолетовая шкала в HUD рядом с полосой
|
||||
опыта (Config/XUi_InGame/windows.xml, CVar necroNecromancyProgressCVar).
|
||||
|
||||
Оба CVar'а пишет HarmonySrc/NecromancyKillCreditPatch.cs - и на каждом убийстве, и при
|
||||
загрузке игрока. В XML их считать нельзя: уровень обязан совпадать с
|
||||
ProgressionValue.Level бит в бит, а деление в ModifyCVar дало бы дробь (19.2).
|
||||
|
||||
Ключ имени/описания (buffNecroZombieKillTrackerDisplayName/Desc) переписан в
|
||||
Localization.csv на всех 13 языках той же правкой. Имя самого баффа НЕ трогалось
|
||||
намеренно: по нему бафф лежит в сейвах у всех, кто уже играет. -->
|
||||
<buff name="buffNecroZombieKillTrackerDisplay" icon="ui_game_symbol_skull" icon_color="150,0,0" name_key="buffNecroZombieKillTrackerDisplayName" description_key="buffNecroZombieKillTrackerDisplayDesc">
|
||||
<stack_type value="ignore"/>
|
||||
<duration value="0"/>
|
||||
<update_rate value=".1"/>
|
||||
<display_value value="necroZombieKillsCVar"/>
|
||||
<display_value value="necroNecromancyLevelCVar"/>
|
||||
|
||||
<!-- Нож некроманта (BACKLOG.md item 5, user request 2026-08-28): "урон умножается на
|
||||
скилл некроманта ... и делится на 10". Computed here (this buff already ticks
|
||||
|
||||
+112
-61
@@ -18,16 +18,33 @@
|
||||
zombieTemplateMale that already drives necroZombieKillsCVar (see
|
||||
entityclasses.xml) - one kill, one level, capped at max_level.
|
||||
|
||||
max_level=5000, with 5 recipe groups gated at fixed total-zombie-kills
|
||||
thresholds (proportional to the original 1000-max version: 0.1% / 10% / 40%
|
||||
/ 60% / 100%):
|
||||
Group 1 "Адепт" - available from the start (level 1), but not all
|
||||
of it - individual recipes within the group still
|
||||
unlock at their own level as usual.
|
||||
Group 2 "Подмастерье" - level 500
|
||||
Group 3 "Ученик" - level 2000
|
||||
Group 4 "Некромант" - level 3000
|
||||
Group 5 "Мастер" - level 5000
|
||||
ШКАЛА ПЕРЕДЕЛАНА 2026-09-17: 20 УБИЙСТВ = 1 УРОВЕНЬ, max_level=250.
|
||||
Было "одно убийство - один уровень" при max_level=5000, и это молча ломалось на КАЖДОМ
|
||||
СОХРАНЕНИИ, потому что ванильный ProgressionValue хранит уровень ОДНИМ БАЙТОМ:
|
||||
_writer.Write((byte)level); // ProgressionValue.Write
|
||||
level = _reader.ReadByte(); // ProgressionValue.Read
|
||||
Проверено не только декомпиляцией, но и на живом сейве (New Xisema Mountains/sezon8,
|
||||
17.09.2026): necroZombieKillsCVar = 384, а уровень в файле игрока = 129, то есть 384-256.
|
||||
Всё выше 255 откатывалось по модулю 256: панель скилла заново закрывала уже открытые
|
||||
рецепты (именно это было видно на стриме - Слёзы мертвеца открыты, Пир падальщика под
|
||||
замком), а группы 500/2000/3000/5000 были недостижимы в принципе. В ванили этот предел
|
||||
не всплывает: атрибуты идут до 10, перки до 5, крафтовые скиллы до 100.
|
||||
|
||||
5000 убийств / 20 = 250 уровней - влезает в байт с запасом, поэтому баг чинится самой
|
||||
шкалой, а не костылём поверх сериализации. Счёт убийств по-прежнему живёт в
|
||||
necroZombieKillsCVar (float, сохраняется честно) и остаётся ЕДИНСТВЕННЫМ источником
|
||||
правды: уровень пересчитывается из него в HarmonySrc/NecromancyKillCreditPatch.cs и на
|
||||
каждом убийстве, и при загрузке игрока - последнее заодно чинит сейвы, испорченные старой
|
||||
шкалой (тот же sezon8: 384 убийства -> уровень 19 вместо сломанных 129).
|
||||
|
||||
ВСЕ ПОРОГИ НИЖЕ - В УРОВНЯХ. Умножь на 20, чтобы получить убийства:
|
||||
Group 1 "Адепт" - с нулевого уровня, но не вся: рецепты внутри группы
|
||||
открываются каждый на своей ступени: 0 / 1 / 3 / 5 / 15,
|
||||
то есть 0 / 20 / 60 / 100 / 300 убийств.
|
||||
Group 2 "Подмастерье" - уровень 25 (500 убийств)
|
||||
Group 3 "Ученик" - уровень 100 (2000)
|
||||
Group 4 "Некромант" - уровень 150 (3000)
|
||||
Group 5 "Мастер" - уровень 250 (5000)
|
||||
|
||||
Recipe unlocks: give a recipe Tags="necroNecromancyAdept" / "necroNecromancyJourneyman"
|
||||
/ "necroNecromancyApprentice" / "necroNecromancyNecromancer" / "necroNecromancyMaster"
|
||||
@@ -37,12 +54,14 @@
|
||||
"Адепт" is unlocked from level 1 anyway - a recipe with no unlock tag is just always
|
||||
available, same effect, no need to spend a tag on it.
|
||||
|
||||
One genuine one-off exception: necroNecromancyLvl20 (level 20) - the Пространственный
|
||||
браслет, per direct instruction 2026-08-30 ("нож, камень духов и хранилище - это база...
|
||||
хранилище, когда убито минимум 20 зомби") - it belongs in the Group 1 "Адепт" display
|
||||
bucket (see below) but needs its own slightly-later unlock level within that same group,
|
||||
which is what unlock_tier is for (see display_entry below), not a reason to invent a
|
||||
whole separate group.
|
||||
One genuine one-off exception: necroNecromancyLvl20 - the Пространственный браслет, per
|
||||
direct instruction 2026-08-30 ("нож, камень духов и хранилище - это база... хранилище,
|
||||
когда убито минимум 20 зомби") - it belongs in the Group 1 "Адепт" display bucket (see
|
||||
below) but needs its own slightly-later unlock level within that same group, which is
|
||||
what unlock_tier is for (see display_entry below), not a reason to invent a whole
|
||||
separate group. Имя тега - в УБИЙСТВАХ (20), а RecipeTagUnlocked у него теперь стоит на
|
||||
УРОВНЕ 1: это те же самые 20 убийств в новой шкале. С 2026-09-17 на этом же теге сидят
|
||||
Кровавая сфера и мод ножа на воду (Слёзы мертвеца) - три рецепта одной ступени.
|
||||
|
||||
UPDATED 2026-08-29: display_entry blocks added below now that real necromancer items/
|
||||
recipes exist to point them at - per the user's own direct report ("до сих пор нету ни
|
||||
@@ -73,21 +92,25 @@
|
||||
range. Fixed by actually spreading the non-base items across all 5 real tiers
|
||||
instead of clustering them all near the bottom - see the effect_group tags below and
|
||||
recipes.xml for the final per-item distribution:
|
||||
Group 1 "Адепт" (level 1, +20 for the bracelet) - Spirit Stone, Knife,
|
||||
Blue Portal Stone, Spatial Vault, Pyramid of Spirits,
|
||||
and (since 2026-09-09) the four survival-flavoured knife
|
||||
mods at +30 / +60 / +100 / +300
|
||||
Group 2 "Подмастерье" (level 500) - Grimoire of Deviation, plus the two combat
|
||||
knife mods at 1400 / 1700
|
||||
Group 3 "Ученик" (level 2000) - Zombie Dog, Insect Swarm, Zombie Griffin
|
||||
Group 4 "Некромант" (level 3000) - Zombie Bear, Zombie Wolf, Banshee's Scroll
|
||||
Group 5 "Мастер" (level 5000) - Black Portal Stone
|
||||
Group 1 "Адепт" (ур. 0 = 0 убийств) - Spirit Stone, Knife, Blue Portal
|
||||
Stone, Pyramid of Spirits; на ур. 1 (20 убийств) -
|
||||
Spatial Vault, Blood Sphere и мод на воду; дальше три
|
||||
выживальческих мода ножа на ур. 3 / 5 / 15
|
||||
(60 / 100 / 300 убийств)
|
||||
Group 2 "Подмастерье" (ур. 25 = 500) - Grimoire of Deviation, plus the two
|
||||
combat knife mods на ур. 70 / 85 (1400 / 1700 убийств)
|
||||
Group 3 "Ученик" (ур. 100 = 2000) - Zombie Dog, Insect Swarm, Zombie Griffin
|
||||
Group 4 "Некромант" (ур. 150 = 3000) - Zombie Bear, Zombie Wolf, Banshee Scroll
|
||||
Group 5 "Мастер" (ур. 250 = 5000) - Black Portal Stone
|
||||
necroNecromancyLvl50/Lvl200 tags removed (no longer used by anything - Grimoire and
|
||||
the summon books now use the real necroNecromancyJourneyman/Apprentice/Necromancer
|
||||
tags instead). necroNecromancyLvl20 stays - still the one legitimate one-off (see
|
||||
tags instead). necroNecromancyLvl30 убран 2026-09-17 вместе с переходом на шкалу
|
||||
20-за-уровень: 30 убийств на сетке с шагом 20 не выражается, и мод на воду переехал
|
||||
на necroNecromancyLvl20 - тот самый тег браслета, по прямому указанию ("20
|
||||
убийств"). necroNecromancyLvl20 stays - still the one legitimate one-off (see
|
||||
above). -->
|
||||
<append xpath="/progression/crafting_skills">
|
||||
<crafting_skill name="craftingNecroNecromancy" max_level="5000" parent="attCrafting" name_key="craftingNecroNecromancyName" desc_key="craftingNecroNecromancyDesc" long_desc_key="craftingNecroNecromancyLongDesc" icon="ui_game_symbol_skull">
|
||||
<crafting_skill name="craftingNecroNecromancy" max_level="250" parent="attCrafting" name_key="craftingNecroNecromancyName" desc_key="craftingNecroNecromancyDesc" long_desc_key="craftingNecroNecromancyLongDesc" icon="ui_game_symbol_skull">
|
||||
|
||||
<!-- display_entry block kept in the SAME append as the crafting_skill itself (unlike
|
||||
an earlier draft of this edit, which tried appending display_entry via a second,
|
||||
@@ -96,7 +119,7 @@
|
||||
loot.xml once, see that file's own load-order comment. Nesting it here avoids the
|
||||
ordering question entirely, and matches how vanilla itself writes display_entry -
|
||||
directly inside the crafting_skill tag, not as a separate append). -->
|
||||
<display_entry icon="SpiritStone" name_key="craftingNecroNecromancyTier1Name" has_quality="false" unlock_level="1,20,30,60,100,300">
|
||||
<display_entry icon="SpiritStone" name_key="craftingNecroNecromancyTier1Name" has_quality="false" unlock_level="0,1,3,5,15">
|
||||
<!-- necroHeresyPyramid added here 2026-08-31 (user request: "добавь рецепт блока в
|
||||
скиллы") - unlock_tier="1" alongside the other always-available Tier-1 items,
|
||||
matching its recipe's own necroNecromancyAdept tag in recipes.xml (see that
|
||||
@@ -111,10 +134,14 @@
|
||||
туда, где предмет впервые нужен, - здесь это момент появления браслета.
|
||||
Парная правка в recipes.xml: рецепту добавлены теги learnable и
|
||||
necroNecromancyLvl20. Оба уровня ОБЯЗАНЫ совпадать: RecipeTagUnlocked для
|
||||
necroNecromancyLvl20 стоит на level="20,5000" ниже, а tier 2 в
|
||||
unlock_level="1,20,30,60,100,300" - это те же 20. Разойдись они, замок на
|
||||
панели скилла разошёлся бы с реальной доступностью рецепта. -->
|
||||
<unlock_entry item="braceletSpatialVault,resourceBloodSphere" unlock_tier="2"/>
|
||||
necroNecromancyLvl20 стоит на level="1,250" ниже, а tier 2 в
|
||||
unlock_level="0,1,3,5,15" - это тот же уровень 1. Разойдись они, замок на
|
||||
панели скилла разошёлся бы с реальной доступностью рецепта.
|
||||
|
||||
2026-09-17, СМЕНА ШКАЛЫ (20 убийств = 1 уровень, см. шапку файла): «уровень
|
||||
20» превратился в «уровень 1», убийств за ним по-прежнему 20. Сюда же, на
|
||||
эту ступень, переехал мод ножа на воду - см. следующий комментарий. -->
|
||||
<unlock_entry item="braceletSpatialVault,resourceBloodSphere,necroModKnifeTearsOfTheDead" unlock_tier="2"/>
|
||||
<!-- ЧЕТЫРЕ МОДА НОЖА ПЕРЕЕХАЛИ СЮДА ИЗ ГРУППЫ 2, 2026-09-09. Продиктовано:
|
||||
"Питьё важно в тот же день. Оно должно быть доступно после 30 убитых зомби.
|
||||
Еда - 60. Это самые важные для начала выживания модификации. Модификация на
|
||||
@@ -138,11 +165,23 @@
|
||||
так принципиально").
|
||||
|
||||
Порядок вода -> еда не случаен и задан пользователем прямо: пить хочется в
|
||||
тот же день, есть - позже. -->
|
||||
<unlock_entry item="necroModKnifeTearsOfTheDead" unlock_tier="3"/>
|
||||
<unlock_entry item="necroModKnifeScavengersFeast" unlock_tier="4"/>
|
||||
<unlock_entry item="necroModKnifeGravesRepose" unlock_tier="5"/>
|
||||
<unlock_entry item="necroModKnifeDarkSense" unlock_tier="6"/>
|
||||
тот же день, есть - позже.
|
||||
|
||||
ПЕРЕСЧИТАНО 2026-09-17 ПОД ШКАЛУ 20-ЗА-УРОВЕНЬ (см. шапку файла). Сами
|
||||
пороги в убийствах не тронуты, кроме воды: 30 убийств на сетке с шагом 20 не
|
||||
выражается, и по прямому указанию вода уехала ВНИЗ, на 20 - то есть на одну
|
||||
ступень с браслетом и Кровавой сферой, а не вверх на 40. Ступеней в группе
|
||||
теперь пять, а не шесть, и мод на воду стоит в строке tier 2 выше:
|
||||
ур. 0 (0 убийств) - Камень духов, Нож, Синий портал, Пирамида
|
||||
ур. 1 (20 убийств) - Браслет, Кровавая сфера, ВОДА
|
||||
ур. 3 (60 убийств) - еда
|
||||
ур. 5 (100 убийств) - покой
|
||||
ур. 15 (300 убийств) - чутьё
|
||||
Тег necroNecromancyLvl30 вместе с этим удалён - им больше никто не
|
||||
пользуется, вода сидит на necroNecromancyLvl20. -->
|
||||
<unlock_entry item="necroModKnifeScavengersFeast" unlock_tier="3"/>
|
||||
<unlock_entry item="necroModKnifeGravesRepose" unlock_tier="4"/>
|
||||
<unlock_entry item="necroModKnifeDarkSense" unlock_tier="5"/>
|
||||
</display_entry>
|
||||
<!-- Ступенчатая разблокировка внутри группы. ПЕРЕРАСПРЕДЕЛЕНО 2026-09-09: четыре из
|
||||
шести модов ножа (вода/еда/покой/чутьё) уехали отсюда в группу 1 - см. большой
|
||||
@@ -156,61 +195,73 @@
|
||||
где GetQualityLevel возвращает индекс первого порога, который БОЛЬШЕ текущего
|
||||
уровня. В сумме это даёт простое правило: запись с unlock_tier="N" выходит
|
||||
из-под замка ровно на N-м значении unlock_level, считая с единицы. Поэтому здесь
|
||||
tier 1 -> 500, tier 2 -> 1400, tier 3 -> 1700, а в группе 1 выше -
|
||||
tier 1 -> 1, tier 2 -> 20, tier 3 -> 30, tier 4 -> 60, tier 5 -> 100,
|
||||
tier 6 -> 300.
|
||||
tier 1 -> ур. 25, tier 2 -> ур. 70, tier 3 -> ур. 85 (500 / 1400 / 1700
|
||||
убийств), а в группе 1 выше - tier 1 -> ур. 0, tier 2 -> ур. 1, tier 3 -> ур. 3,
|
||||
tier 4 -> ур. 5, tier 5 -> ур. 15 (0 / 20 / 60 / 100 / 300 убийств).
|
||||
|
||||
Нижняя граница ноль - законна и проверена по коду: у группы 1 unlock_level
|
||||
начинается с 0, и GetQualityLevel(0) возвращает 1 (первый порог БОЛЬШЕ нуля -
|
||||
это единица), поэтому tier 1 (после -1 это 0) из-под замка выходит сразу. Точно
|
||||
так же законен level="0,250" у RecipeTagUnlocked ниже: PassiveEffect.InLevelRange
|
||||
это ровно "_level >= _min && _level <= _max".
|
||||
|
||||
Заблокированная запись рисуется греем из АТЛАСА ItemIconAtlasGreyscale плюс
|
||||
спрайт-замок ui_game_symbol_unlock поверх (XUi_InGame/windows.xml ~2523-2524,
|
||||
привязки unlock_icon_atlasN / unlock_icon_lockedN). Именно поэтому у мода теперь
|
||||
есть вторая папка UIAtlases/ItemIconAtlasGreyscale - без неё под замком у иконки
|
||||
не было бы картинки вообще. -->
|
||||
<display_entry icon="ScrollOfDeviation" name_key="craftingNecroNecromancyTier2Name" has_quality="false" unlock_level="500,1400,1700">
|
||||
<display_entry icon="ScrollOfDeviation" name_key="craftingNecroNecromancyTier2Name" has_quality="false" unlock_level="25,70,85">
|
||||
<unlock_entry item="thrownBookGrimoireDeviation" unlock_tier="1"/>
|
||||
<unlock_entry item="necroModKnifeDeadMansGrip" unlock_tier="2"/>
|
||||
<unlock_entry item="necroModKnifeDeadStorm" unlock_tier="3"/>
|
||||
</display_entry>
|
||||
<display_entry icon="SummonZombieDog" name_key="craftingNecroNecromancyTier3Name" has_quality="false" unlock_level="2000">
|
||||
<display_entry icon="SummonZombieDog" name_key="craftingNecroNecromancyTier3Name" has_quality="false" unlock_level="100">
|
||||
<!-- resourceBloodStone добавлен 2026-09-16 (указание «доступен на третьем грейде
|
||||
некромантии, в самом его начале»). Тир 3 - это и есть третий грейд, группа
|
||||
«Ученик», а его единственный unlock_level равен 2000, то есть unlock_tier="1"
|
||||
здесь и означает «в самом начале грейда, без своего смещения».
|
||||
«Ученик», а его единственный unlock_level равен 100 уровням (это те же 2000
|
||||
убийств в шкале 20-за-уровень), то есть unlock_tier="1" здесь и означает «в
|
||||
самом начале грейда, без своего смещения».
|
||||
|
||||
ЭТА СТРОКА - ТОЛЬКО ОТОБРАЖЕНИЕ. Открытие рецепта делает тег
|
||||
necroNecromancyApprentice в recipes.xml вместе с RecipeTagUnlocked
|
||||
level="2000,5000" ниже; display_entry о тегах не знает и рисует замок сам по
|
||||
себе, по unlock_tier. Поэтому 2000 здесь и 2000 там ОБЯЗАНЫ совпадать -
|
||||
level="100,250" ниже; display_entry о тегах не знает и рисует замок сам по
|
||||
себе, по unlock_tier. Поэтому 100 здесь и 100 там ОБЯЗАНЫ совпадать -
|
||||
иначе замок на панели разойдётся с реальной доступностью рецепта. Совпадают:
|
||||
один порог, одно значение. -->
|
||||
<unlock_entry item="bookSummonZombieDog,bookSummonInsectSwarm,bookSummonZombieGriffin,resourceBloodStone" unlock_tier="1"/>
|
||||
</display_entry>
|
||||
<display_entry icon="SummonZombieBear" name_key="craftingNecroNecromancyTier4Name" has_quality="false" unlock_level="3000">
|
||||
<display_entry icon="SummonZombieBear" name_key="craftingNecroNecromancyTier4Name" has_quality="false" unlock_level="150">
|
||||
<unlock_entry item="bookSummonZombieBear,bookSummonZombieWolf,bookBanshee" unlock_tier="1"/>
|
||||
</display_entry>
|
||||
<display_entry icon="BlackPortalStone" name_key="craftingNecroNecromancyTier5Name" has_quality="false" unlock_level="5000">
|
||||
<display_entry icon="BlackPortalStone" name_key="craftingNecroNecromancyTier5Name" has_quality="false" unlock_level="250">
|
||||
<unlock_entry item="thrownStonePortalBlack" unlock_tier="1"/>
|
||||
</display_entry>
|
||||
|
||||
<effect_group>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1,5000" value="1" tags="necroNecromancyAdept"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="20,5000" value="1" tags="necroNecromancyLvl20"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="0,250" value="1" tags="necroNecromancyAdept"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1,250" value="1" tags="necroNecromancyLvl20"/>
|
||||
<!-- Пороги модов ножа, 2026-09-09 (см. комментарий в recipes.xml и в группе 1
|
||||
выше). Каждый уровень тут ОБЯЗАН совпадать с соответствующим значением в
|
||||
unlock_level того display_entry, где лежит мод, иначе замок на панели скилла
|
||||
разойдётся с реальной доступностью рецепта: display_entry рисует замок сам по
|
||||
себе, по unlock_tier, и о тегах не знает.
|
||||
Lvl800 и Lvl1100 удалены вместе с этой правкой - ими больше никто не
|
||||
пользуется (Тёмное чутьё уехало на 300, Могильный покой на 100). -->
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="30,5000" value="1" tags="necroNecromancyLvl30"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="60,5000" value="1" tags="necroNecromancyLvl60"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="100,5000" value="1" tags="necroNecromancyLvl100"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="300,5000" value="1" tags="necroNecromancyLvl300"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="500,5000" value="1" tags="necroNecromancyJourneyman"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1400,5000" value="1" tags="necroNecromancyLvl1400"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="1700,5000" value="1" tags="necroNecromancyLvl1700"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="2000,5000" value="1" tags="necroNecromancyApprentice"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="3000,5000" value="1" tags="necroNecromancyNecromancer"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="5000,5000" value="1" tags="necroNecromancyMaster"/>
|
||||
пользуется (Тёмное чутьё уехало на 300, Могильный покой на 100).
|
||||
|
||||
ЗНАЧЕНИЯ level= ПЕРЕСЧИТАНЫ 2026-09-17 В УРОВНИ (шкала 20 убийств = 1
|
||||
уровень, см. шапку файла). ИМЕНА ТЕГОВ ОСТАЛИСЬ В УБИЙСТВАХ и менять их не
|
||||
надо: necroNecromancyLvl60 - это «60 убийств», а стоит он на level="3,250".
|
||||
Верхняя граница у всех теперь 250, а не 5000 - это max_level скилла, выше
|
||||
него уровень не поднимется, и диапазон обязан его накрывать. -->
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="3,250" value="1" tags="necroNecromancyLvl60"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="5,250" value="1" tags="necroNecromancyLvl100"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="15,250" value="1" tags="necroNecromancyLvl300"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="25,250" value="1" tags="necroNecromancyJourneyman"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="70,250" value="1" tags="necroNecromancyLvl1400"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="85,250" value="1" tags="necroNecromancyLvl1700"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="100,250" value="1" tags="necroNecromancyApprentice"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="150,250" value="1" tags="necroNecromancyNecromancer"/>
|
||||
<passive_effect name="RecipeTagUnlocked" operation="base_set" level="250,250" value="1" tags="necroNecromancyMaster"/>
|
||||
</effect_group>
|
||||
</crafting_skill>
|
||||
</append>
|
||||
|
||||
+17
-10
@@ -296,16 +296,23 @@
|
||||
трупа, к этому моменту бесполезен. Теперь порог у мода стоит там, где мод реально нужен,
|
||||
а не там, где он "по силе" смотрится ровно.
|
||||
|
||||
Итоговая раскладка:
|
||||
30 - Слёзы мертвеца (вода) группа 1 "Адепт"
|
||||
60 - Пир падальщика (еда) группа 1
|
||||
100 - Могильный покой (тепло/холод) группа 1
|
||||
300 - Тёмное чутьё (радар) группа 1
|
||||
1400 - Хватка мертвеца (замедление) группа 2 "Подмастерье"
|
||||
1700 - Мёртвая буря (силовая) группа 2
|
||||
Итоговая раскладка (убийства; в скобках уровень скилла в шкале 20-за-уровень,
|
||||
введённой 2026-09-17 - см. шапку progression.xml):
|
||||
20 - Слёзы мертвеца (вода) группа 1 "Адепт" ур. 1
|
||||
60 - Пир падальщика (еда) группа 1 ур. 3
|
||||
100 - Могильный покой (тепло/холод) группа 1 ур. 5
|
||||
300 - Тёмное чутьё (радар) группа 1 ур. 15
|
||||
1400 - Хватка мертвеца (замедление) группа 2 "Подмастерье" ур. 70
|
||||
1700 - Мёртвая буря (силовая) группа 2 ур. 85
|
||||
Первые четыре - выживание и информация, они переехали в группу 1 к самому ножу (он там и
|
||||
доступен с уровня 1). Последние два - чистый бой, остались в группе 2 на прежних порогах:
|
||||
пользователь про них сказал "дальше уже не так принципиально".
|
||||
доступен с нулевого уровня). Последние два - чистый бой, остались в группе 2 на прежних
|
||||
порогах: пользователь про них сказал "дальше уже не так принципиально".
|
||||
|
||||
ВОДА ПЕРЕЕХАЛА С 30 УБИЙСТВ НА 20, 2026-09-17. Причина не балансовая, а арифметическая:
|
||||
новая шкала идёт шагом в 20 убийств, и 30 на неё не ложится. Из двух соседних узлов (20
|
||||
или 40) пользователь выбрал 20 - "мод на воду нужен на самом начальном этапе". Тега
|
||||
necroNecromancyLvl30 больше нет, рецепт сидит на necroNecromancyLvl20 - том же теге, что
|
||||
браслет и Кровавая сфера.
|
||||
|
||||
Двигать - тройка "тег в рецепте + RecipeTagUnlocked в progression.xml + unlock_tier в
|
||||
display_entry", все три должны совпадать, иначе замок на панели соврёт. -->
|
||||
@@ -325,7 +332,7 @@
|
||||
призывов и не должны требовать верстак. Тег learnable, как у остальных гейтованных
|
||||
рецептов мода, чтобы рецепт не светился в меню до открытия группы. -->
|
||||
<append xpath="/recipes">
|
||||
<recipe name="necroModKnifeTearsOfTheDead" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl30">
|
||||
<recipe name="necroModKnifeTearsOfTheDead" count="1" tags="learnable,packMuleCrafting,necroNecromancyLvl20">
|
||||
<ingredient name="resourceZombieAsh" count="10"/>
|
||||
<ingredient name="resourceVictimSkin" count="1"/>
|
||||
<ingredient name="drinkJarEmpty" count="2"/>
|
||||
|
||||
@@ -131,4 +131,103 @@ namespace NecromancerTome
|
||||
Debug.Log("[NecromancerTome] CharmZombie: done, attack target cleared for " + zombie.EntityName);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// ПОДЧИНЁННЫЕ НЕ ДЕРУТСЯ МЕЖДУ СОБОЙ, 2026-09-17. Баг-репорт пользователя: "Камень духов и
|
||||
/// прочие вешают на зомби девиацию. С этим есть баг. Зомби под девиацией не должны бить других
|
||||
/// зомби под девиацией."
|
||||
///
|
||||
/// ОТКУДА БАГ. CharmZombie() выше переписывает обе задачи ИИ на targetClasses =
|
||||
/// typeof(EntityZombie) - "бей зомби". Подчинённый зомби сам остаётся EntityZombie, и никакого
|
||||
/// признака "свой" в этом списке классов выразить нельзя: targetClasses оперирует ТИПАМИ, а
|
||||
/// подчинение - это бафф на конкретной особи. Поэтому два подчинённых видели друг в друге
|
||||
/// законную цель, и чем больше игрок подчинял, тем чаще они дрались между собой вместо
|
||||
/// настоящих врагов.
|
||||
///
|
||||
/// ПОЧЕМУ ЗАПЛАТКИ ДВЕ, А НЕ ОДНА. Цель у зомби появляется двумя разными путями, и закрыть
|
||||
/// надо оба, иначе починится половина:
|
||||
///
|
||||
/// 1. ВЫБОР цели. EAISetNearestEntityAsTarget.FindTarget() собирает всех подходящих по типу
|
||||
/// через GetEntitiesInBounds, сортирует и берёт ПЕРВОГО, кто прошёл EAITarget.check(_e).
|
||||
/// Постфикс на check - самое точное место: подчинённый просто не считается кандидатом, и
|
||||
/// цикл идёт дальше по списку, то есть зомби выбирает СЛЕДУЮЩЕГО, настоящего врага, а не
|
||||
/// остаётся без цели. Фильтровать позже, на присвоении, так не получится: там уже некуда
|
||||
/// "идти дальше", кандидат один.
|
||||
///
|
||||
/// 2. ПРИСВОЕНИЕ цели мимо выбора. Главный такой путь - месть: EntityAlive.DamageEntity на
|
||||
/// получателе урона зовёт SetRevengeTarget(бивший) и aiManager.DamagedByEntity(), после
|
||||
/// чего задача мести ставит обидчика целью. Сюда же любые внешние вызовы. Все они
|
||||
/// сходятся в одну точку - EntityAlive.SetAttackTarget, - и префикс на ней гасит цель,
|
||||
/// если и бьющий, и цель подчинены.
|
||||
///
|
||||
/// ЗАЧЕМ ВТОРАЯ, ЕСЛИ ПЕРВАЯ УЖЕ НЕ ДАЁТ ИМ СЦЕПИТЬСЯ. Затем, что подчинить можно зомби,
|
||||
/// которые УЖЕ дерутся друг с другом (Пирамида духов подчиняет пачкой, Рой кусает по одному).
|
||||
/// CharmZombie() сбрасывает цель тому, кого подчинили прямо сейчас, но не второму участнику
|
||||
/// драки - его цель погасит именно префикс.
|
||||
///
|
||||
/// ЧЕГО ЗДЕСЬ НАМЕРЕННО НЕТ. Урон между подчинёнными не блокируется отдельно: если они друг
|
||||
/// друга не выбирают и не получают целью, бить им друг друга нечем. Блокировка урона поверх
|
||||
/// этого спрятала бы будущие дыры в прицеливании вместо того, чтобы их показать.
|
||||
///
|
||||
/// ЦЕНА НА ГОРЯЧЕМ ПУТИ. check() зовётся для каждого кандидата каждого ищущего зомби в мире,
|
||||
/// поэтому порядок проверок в постфиксе - от самой дешёвой к самой дорогой: сначала отсев по
|
||||
/// типу (кандидат вообще не зомби - выходим, а для обычного зомби, который ищет игрока, это
|
||||
/// как раз общий случай), только потом два обращения к баффам.
|
||||
/// </summary>
|
||||
public static class NecroCharmSide
|
||||
{
|
||||
public static bool IsCharmed(EntityAlive _entity)
|
||||
{
|
||||
return _entity != null && _entity.Buffs != null &&
|
||||
_entity.Buffs.HasBuff(Patch_EntityBuffs_AddBuff_DeviatorCharm.CharmBuffName);
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(EAITarget), "check")]
|
||||
public static class Patch_EAITarget_check_CharmedIgnoresCharmed
|
||||
{
|
||||
public static void Postfix(EAITarget __instance, EntityAlive _e, ref bool __result)
|
||||
{
|
||||
if (!__result || __instance == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// Дешёвый отсев первым: подчиняется (и, значит, может оказаться "своим") только
|
||||
// EntityZombie - зомби-звери на другой ветке иерархии и под девиацию не попадают,
|
||||
// см. большой комментарий о humanoid-only выше.
|
||||
if (!(_e is EntityZombie))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!NecroCharmSide.IsCharmed(__instance.theEntity))
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!NecroCharmSide.IsCharmed(_e))
|
||||
{
|
||||
return;
|
||||
}
|
||||
__result = false;
|
||||
}
|
||||
}
|
||||
|
||||
[HarmonyPatch(typeof(EntityAlive), "SetAttackTarget", new System.Type[] { typeof(EntityAlive), typeof(int) })]
|
||||
public static class Patch_EntityAlive_SetAttackTarget_CharmedIgnoresCharmed
|
||||
{
|
||||
public static void Prefix(EntityAlive __instance, ref EntityAlive _attackTarget)
|
||||
{
|
||||
if (__instance == null || _attackTarget == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!NecroCharmSide.IsCharmed(__instance) || !NecroCharmSide.IsCharmed(_attackTarget))
|
||||
{
|
||||
return;
|
||||
}
|
||||
// null, а не "оставить как было": цель именно гасится, чтобы задача выбора на
|
||||
// следующем тике пошла искать настоящего врага. Вторая заплатка на этом же методе
|
||||
// (SwarmTargetPatch, перенацеливание Роя с игрока на зомби) с этой не пересекается:
|
||||
// Рой сам никогда не подчинён, так что до этой строки он не доходит.
|
||||
_attackTarget = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,31 @@ namespace NecromancerTome
|
||||
// another in-game death.
|
||||
VerifyPrefixAttached(typeof(EntityAlive), "dropItemOnDeath");
|
||||
VerifyPrefixAttached(typeof(Entity), "DropBagServer");
|
||||
|
||||
// Добавлено 2026-09-17 вместе с правкой "подчинённые не дерутся между собой"
|
||||
// (CharmPatch.cs). Метод EAITarget.check в исходнике protected и назван со строчной
|
||||
// буквы - если он когда-нибудь переименуется или сменит сигнатуру, PatchAll упадёт
|
||||
// ещё на загрузке, но эта строка отвечает на тот же вопрос в логе явно и без
|
||||
// раскопок: резолвится ли метод и висит ли на нём наш постфикс.
|
||||
VerifyPatchAttached(typeof(EAITarget), "check");
|
||||
}
|
||||
|
||||
/// <summary>То же, что VerifyPrefixAttached, но печатает и префиксы, и постфиксы - для
|
||||
/// заплаток, которые стоят постфиксом (у VerifyPrefixAttached постфикс всегда выглядел бы
|
||||
/// как "0 prefix patch(es)", то есть как ненайденная заплатка).</summary>
|
||||
public static void VerifyPatchAttached(System.Type type, string methodName)
|
||||
{
|
||||
MethodBase method = AccessTools.Method(type, methodName);
|
||||
if (method == null)
|
||||
{
|
||||
Debug.LogWarning("[NecromancerTome] ModEntry: could not resolve " + type.Name + "." + methodName + " via AccessTools - method not found");
|
||||
return;
|
||||
}
|
||||
Patches info = Harmony.GetPatchInfo(method);
|
||||
int prefixCount = info != null && info.Prefixes != null ? info.Prefixes.Count : 0;
|
||||
int postfixCount = info != null && info.Postfixes != null ? info.Postfixes.Count : 0;
|
||||
Debug.Log("[NecromancerTome] ModEntry: " + type.Name + "." + methodName + " resolved, has " +
|
||||
prefixCount + " prefix and " + postfixCount + " postfix patch(es) attached after PatchAll");
|
||||
}
|
||||
|
||||
public static void VerifyPrefixAttached(System.Type type, string methodName)
|
||||
|
||||
@@ -61,6 +61,52 @@ namespace NecromancerTome
|
||||
/// follows vanilla's decision, it does not make it. Whether it does is NOT verified and is the
|
||||
/// specific thing to watch for in game; if pets turn out not to be credited, that is a separate
|
||||
/// piece of work (giving the pet's DamageSource an owner), not a bug in this file.
|
||||
///
|
||||
///
|
||||
/// ============================================================================================
|
||||
/// ШКАЛА ПЕРЕДЕЛАНА 2026-09-17: 20 УБИЙСТВ = 1 УРОВЕНЬ, И УРОВЕНЬ БОЛЬШЕ НЕ ХРАНИТСЯ
|
||||
/// ============================================================================================
|
||||
///
|
||||
/// Баг, найденный на стриме: "Рецепты отображались в скилле серым и с замком, хотя при этом
|
||||
/// должен был бы быть доступным" - при 250+ убитых зомби Слёзы мертвеца (30) были открыты, а
|
||||
/// Пир падальщика (60) стоял под замком.
|
||||
///
|
||||
/// ПРИЧИНА - ВАНИЛЬНАЯ СЕРИАЛИЗАЦИЯ, А НЕ НАША РАСКЛАДКА. ProgressionValue пишет и читает
|
||||
/// уровень ОДНИМ БАЙТОМ:
|
||||
///
|
||||
/// public void Write(BinaryWriter _writer, bool _IsNetwork) { ... _writer.Write((byte)level); ... }
|
||||
/// public void Read(BinaryReader _reader) { ... level = _reader.ReadByte(); ... }
|
||||
///
|
||||
/// Всё выше 255 при сохранении обрезается по модулю 256. Подтверждено не только декомпиляцией,
|
||||
/// но и на живом сейве пользователя (New Xisema Mountains/sezon8, 17.09.2026): в файле игрока
|
||||
/// necroZombieKillsCVar = 384, а уровень craftingNecroNecromancy = 129, то есть ровно 384-256.
|
||||
/// Со старой шкалой "одно убийство - один уровень" (max_level 5000) это означало, что уровень
|
||||
/// откатывался назад на каждом переходе через 256, панель скилла заново вешала замки на уже
|
||||
/// открытые рецепты, а группы 500/2000/3000/5000 были недостижимы в принципе. В ванили предел
|
||||
/// не всплывает: атрибуты идут до 10, перки до 5, крафтовые скиллы до 100.
|
||||
///
|
||||
/// РЕШЕНИЕ (продиктовано пользователем): "пусть уровень навыка будет 1/20 от количества убитых
|
||||
/// зомби", то есть 20 убийств = 1 уровень, максимум 250 - влезает в байт с запасом. Чинится
|
||||
/// сама шкала, а не сериализация поверх неё.
|
||||
///
|
||||
/// ЕДИНСТВЕННЫЙ ИСТОЧНИК ПРАВДЫ - necroZombieKillsCVar. Это float, он сохраняется честно (те
|
||||
/// самые 384 в сейве) и переполнению не подвержен. Уровень из него ВЫЧИСЛЯЕТСЯ, а не
|
||||
/// накапливается: и на каждом убийстве (ниже), и при загрузке игрока
|
||||
/// (Patch_PlayerDataFile_ToPlayer_NecromancyLevel). Второе важнее, чем кажется: оно чинит уже
|
||||
/// испорченные сейвы без ручного вмешательства - тот же sezon8 при первой же загрузке получит
|
||||
/// уровень 19 вместо сломанных 129. Именно поэтому здесь не "+1 к уровню", а "уровень =
|
||||
/// убийства / 20": прибавка к испорченному значению оставила бы его испорченным навсегда.
|
||||
///
|
||||
/// ДВА ИНДИКАТОРА (указание пользователя от 2026-09-17). Оба значения пишутся здесь же, в
|
||||
/// CVar'ы, а рисуются данными:
|
||||
/// necroNecromancyLevelCVar - уровень Некромантии, показывает бафф с черепом
|
||||
/// (buffs.xml, buffNecroZombieKillTrackerDisplay).
|
||||
/// necroNecromancyProgressCVar - сколько зомби упокоено внутри текущего уровня, 0..19.
|
||||
/// Это фиолетовая шкала в HUD рядом с полосой опыта
|
||||
/// (Config/XUi_InGame/windows.xml), она заполняется каждые
|
||||
/// 20 зомби и обнуляется вместе с повышением уровня.
|
||||
/// Оба пишутся ВСЕГДА, в том числе когда уровень не изменился - иначе шкала стояла бы на
|
||||
/// месте девятнадцать убийств подряд и дёргалась раз в двадцатое.
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(EntityPlayer), "AddKillXP")]
|
||||
public static class Patch_EntityPlayer_AddKillXP_NecromancyCount
|
||||
@@ -68,6 +114,22 @@ namespace NecromancerTome
|
||||
public const string NecromancySkillName = "craftingNecroNecromancy";
|
||||
public const string KillsCVarName = "necroZombieKillsCVar";
|
||||
|
||||
/// <summary>Сколько упокоенных зомби стоит один уровень Некромантии. Менять это число в
|
||||
/// одиночку НЕЛЬЗЯ: на нём завязаны и max_level="250" скилла, и все пороги
|
||||
/// RecipeTagUnlocked/unlock_level в Config/progression.xml (они записаны в уровнях), и
|
||||
/// делитель фиолетовой шкалы в Config/XUi_InGame/windows.xml. Двадцатка выбрана не на
|
||||
/// глаз: 5000 убийств / 20 = 250 уровней, а 250 - это максимум, который переживает
|
||||
/// однобайтовую сериализацию уровня (см. большой комментарий выше).</summary>
|
||||
public const int KillsPerLevel = 20;
|
||||
|
||||
/// <summary>Значения для двух индикаторов. Держатся в CVar'ах игрока, а не вычисляются в
|
||||
/// XML, по двум причинам: (1) уровень обязан совпадать с ProgressionValue.Level бит в бит,
|
||||
/// иначе череп и панель скилла разойдутся; (2) деление в ModifyCVar дало бы дробь (19.2), а
|
||||
/// display_value показывает значение как есть.</summary>
|
||||
public const string LevelCVarName = "necroNecromancyLevelCVar";
|
||||
|
||||
public const string ProgressCVarName = "necroNecromancyProgressCVar";
|
||||
|
||||
/// <summary>The tag every zombie carries, humanoid and animal alike. Checked against the
|
||||
/// real data rather than assumed: zombieBiker/zombieArlene/zombieBoe/zombieSpider all
|
||||
/// declare "entity,zombie,..." and the five zombie animals declare
|
||||
@@ -92,31 +154,34 @@ namespace NecromancerTome
|
||||
return;
|
||||
}
|
||||
|
||||
AddKillsCVar(__instance);
|
||||
AddNecromancyLevel(__instance);
|
||||
float kills = AddKillsCVar(__instance);
|
||||
SyncNecromancyLevel(__instance, kills);
|
||||
}
|
||||
|
||||
/// <summary>necroZombieKillsCVar += 1 - the same thing the removed ModifyCVar action did,
|
||||
/// and the reason it is here rather than left in XML is that it shared the broken
|
||||
/// requirement with the progression effect. GetCVar/SetCVar are public on EntityAlive and
|
||||
/// are the same storage the buffs.xml formula reads.</summary>
|
||||
private static void AddKillsCVar(EntityPlayer _player)
|
||||
/// are the same storage the buffs.xml formula reads. Возвращает новое значение, чтобы
|
||||
/// уровень считался ровно от него, а не от повторного чтения.</summary>
|
||||
private static float AddKillsCVar(EntityPlayer _player)
|
||||
{
|
||||
_player.SetCVar(KillsCVarName, _player.GetCVar(KillsCVarName) + 1f);
|
||||
float kills = _player.GetCVar(KillsCVarName) + 1f;
|
||||
_player.SetCVar(KillsCVarName, kills);
|
||||
return kills;
|
||||
}
|
||||
|
||||
/// <summary>+1 level of Necromancy, replicating MinEventActionAddProgressionLevel.Execute
|
||||
/// step for step rather than inventing a shorter version of it - its IL was read for this:
|
||||
/// GetProgressionValue, Level + amount, clamp to ProgressionClass.MaxLevel, then (for a
|
||||
/// crafting skill) the level-up toast and HandleCheckCrafting, then the two dirty flags.
|
||||
/// <summary>Приводит уровень Некромантии и оба индикатора в соответствие числу убийств.
|
||||
/// Идемпотентна: вызывай сколько угодно раз, результат зависит только от _kills.
|
||||
///
|
||||
/// HandleCheckCrafting is the part that would be easy to drop and expensive to miss: it is
|
||||
/// what the game calls on a crafting-skill level change, and skipping it risks recipes not
|
||||
/// noticing they became available. Both it and AddCraftingSkillNotification are public.
|
||||
/// Тело повторяет MinEventActionAddProgressionLevel.Execute шаг в шаг (его IL для этого
|
||||
/// читался): GetProgressionValue, новое значение, кламп по ProgressionClass.MaxLevel,
|
||||
/// затем - для крафтового скилла - тост о повышении и HandleCheckCrafting, затем два
|
||||
/// флага "изменилось".
|
||||
///
|
||||
/// The clamp matters for a different reason than it looks: max_level is 5000, and without
|
||||
/// the clamp Level would keep climbing past it forever, because nothing else limits it.</summary>
|
||||
private static void AddNecromancyLevel(EntityPlayer _player)
|
||||
/// HandleCheckCrafting - та часть, которую легко выкинуть и дорого не заметить: именно её
|
||||
/// игра зовёт при смене уровня крафтового скилла, и без неё рецепты рискуют не заметить,
|
||||
/// что стали доступны. И она, и AddCraftingSkillNotification публичные.</summary>
|
||||
public static void SyncNecromancyLevel(EntityPlayer _player, float _kills)
|
||||
{
|
||||
Progression progression = _player.Progression;
|
||||
if (progression == null)
|
||||
@@ -135,18 +200,31 @@ namespace NecromancerTome
|
||||
return;
|
||||
}
|
||||
|
||||
int oldLevel = pv.Level;
|
||||
int maxLevel = pv.ProgressionClass.MaxLevel;
|
||||
int newLevel = oldLevel + 1;
|
||||
if (newLevel > maxLevel)
|
||||
int kills = (int)_kills;
|
||||
if (kills < 0)
|
||||
{
|
||||
newLevel = maxLevel;
|
||||
kills = 0;
|
||||
}
|
||||
|
||||
int maxLevel = pv.ProgressionClass.MaxLevel;
|
||||
int newLevel = kills / KillsPerLevel;
|
||||
int progressInLevel = kills - newLevel * KillsPerLevel;
|
||||
if (newLevel >= maxLevel)
|
||||
{
|
||||
// На потолке шкала остаётся залитой доверху, а не сбрасывается в ноль: уровней
|
||||
// больше не будет, и пустая полоса читалась бы как "вот-вот повысишься".
|
||||
newLevel = maxLevel;
|
||||
progressInLevel = KillsPerLevel;
|
||||
}
|
||||
|
||||
// Оба индикатора обновляются независимо от того, сменился уровень или нет - шкала
|
||||
// должна ползти на каждом убийстве.
|
||||
SetCVarSafe(_player, LevelCVarName, newLevel);
|
||||
SetCVarSafe(_player, ProgressCVarName, progressInLevel);
|
||||
|
||||
int oldLevel = pv.Level;
|
||||
if (newLevel == oldLevel)
|
||||
{
|
||||
// Already at 5000. The CVar above still went up on purpose - the knife's damage is
|
||||
// not capped by the skill's max_level, and the player who is past the cap should
|
||||
// keep getting stronger knives.
|
||||
return;
|
||||
}
|
||||
pv.Level = newLevel;
|
||||
@@ -154,9 +232,14 @@ namespace NecromancerTome
|
||||
EntityPlayerLocal local = _player as EntityPlayerLocal;
|
||||
if (pv.ProgressionClass.IsCrafting && local != null)
|
||||
{
|
||||
// true = add the notification only if one is not already up, so a horde night does
|
||||
// not stack a fresh toast per corpse.
|
||||
local.PlayerUI?.xui?.CollectedItemList?.AddCraftingSkillNotification(pv, true);
|
||||
if (newLevel > oldLevel)
|
||||
{
|
||||
// true = add the notification only if one is not already up, so a horde night
|
||||
// does not stack a fresh toast per corpse. Только на РОСТЕ уровня: при
|
||||
// загрузке испорченного сейва уровень может поехать вниз (129 -> 19), и
|
||||
// поздравлять с этим игрока не за что.
|
||||
local.PlayerUI?.xui?.CollectedItemList?.AddCraftingSkillNotification(pv, true);
|
||||
}
|
||||
pv.ProgressionClass.HandleCheckCrafting(local, oldLevel, newLevel);
|
||||
}
|
||||
|
||||
@@ -168,5 +251,87 @@ namespace NecromancerTome
|
||||
_player.bPlayerStatsChanged = true;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>SetCVar идёт через EntityBuffs, а он на момент загрузки игрока может быть ещё
|
||||
/// не создан - в ToPlayer буфы читаются отдельным блоком и только если они в файле есть.
|
||||
/// Ронять из-за индикатора загрузку персонажа нельзя, поэтому проверка явная.</summary>
|
||||
private static void SetCVarSafe(EntityPlayer _player, string _name, float _value)
|
||||
{
|
||||
if (_player.Buffs == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
_player.SetCVar(_name, _value);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Пересчёт уровня Некромантии при загрузке игрока - вторая половина фикса однобайтового
|
||||
/// уровня (см. большой комментарий в Patch_EntityPlayer_AddKillXP_NecromancyCount).
|
||||
///
|
||||
/// ПОЧЕМУ ИМЕННО PlayerDataFile.ToPlayer И ИМЕННО POSTFIX. Уровень восстанавливается из
|
||||
/// necroZombieKillsCVar, а CVar'ы лежат в EntityBuffs. В теле ToPlayer порядок жёсткий:
|
||||
/// сначала Progression.Read, следом Buffs.Read. Postfix - единственная точка, где уже готовы
|
||||
/// ОБА, и заодно это уже проверенный в этом моде хук: на том же методе висит
|
||||
/// SpatialVaultPersistence (две разные заплатки на один метод Harmony складывает без
|
||||
/// конфликта).
|
||||
///
|
||||
/// ЧТО ЭТО ДАЁТ. Сейв, испорченный старой шкалой, чинится сам при первом входе: было 384
|
||||
/// убийства и уровень 129 - станет уровень 19 и все четыре мода ножа снова открыты. Ручных
|
||||
/// команд, сброса скилла или новой игры не требуется. Проверено на двух реальных сейвах
|
||||
/// пользователя (17.09): sezon8 - 384 убийства при уровне 129, test8 - 303 при уровне 48.
|
||||
/// Ни в одном из них счётчик убийств не пострадал, потому что он float и переполняться ему
|
||||
/// нечем; портился только уровень.
|
||||
///
|
||||
/// СТАРЫЙ СЕЙВ НИКОГДА НЕ ТЕРЯЕТ ОТКРЫТОЕ. В прежней шкале уровень был равен числу убийств
|
||||
/// (с поправкой на переполнение), то есть уровень ВСЕГДА был не больше счётчика. Пересчёт из
|
||||
/// счётчика поэтому может только вернуть украденное переполнением, но не отнять: тот же test8
|
||||
/// на 303 убийствах получает Тёмное чутьё (порог 300), которое сломанный уровень 48 держал
|
||||
/// под замком.
|
||||
///
|
||||
/// ЕДИНСТВЕННЫЙ СЛУЧАЙ, КОГДА ПЕРЕСЧЁТ МОГ БЫ НАВРЕДИТЬ, - счётчик пуст, а уровень есть.
|
||||
/// Тогда "уровень = убийства / 20" дало бы ноль и стёрло прогресс. Живьём такого сейва не
|
||||
/// видели (счётчик и уровень всегда росли одной и той же строкой кода, а CVar'ы при смерти не
|
||||
/// чистятся - в EntityBuffs нет ни одного сброса словаря CVars), но цена ошибки тут - чужой
|
||||
/// прогресс, поэтому случай обработан явно: счётчик восстанавливается из старого уровня по
|
||||
/// прежнему правилу "1 убийство = 1 уровень" и дальше всё идёт обычным путём. Оценка выйдет
|
||||
/// заниженной (переполнение из уровня уже не вытащить), но это лучше, чем ноль.
|
||||
/// </summary>
|
||||
[HarmonyPatch(typeof(PlayerDataFile), "ToPlayer")]
|
||||
public static class Patch_PlayerDataFile_ToPlayer_NecromancyLevel
|
||||
{
|
||||
public static void Postfix(EntityPlayer _player)
|
||||
{
|
||||
if (_player == null || _player.Buffs == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
float kills = _player.GetCVar(Patch_EntityPlayer_AddKillXP_NecromancyCount.KillsCVarName);
|
||||
ProgressionValue pv = _player.Progression != null
|
||||
? _player.Progression.GetProgressionValue(Patch_EntityPlayer_AddKillXP_NecromancyCount.NecromancySkillName)
|
||||
: null;
|
||||
int oldLevel = pv != null ? pv.Level : 0;
|
||||
|
||||
if (kills < 1f && oldLevel > 0)
|
||||
{
|
||||
kills = oldLevel;
|
||||
_player.SetCVar(Patch_EntityPlayer_AddKillXP_NecromancyCount.KillsCVarName, kills);
|
||||
Debug.LogWarning("[NecromancerTome] NecromancyLevel: счётчик убийств пуст при уровне " +
|
||||
oldLevel + " - восстановлен из уровня по старой шкале");
|
||||
}
|
||||
|
||||
Patch_EntityPlayer_AddKillXP_NecromancyCount.SyncNecromancyLevel(_player, kills);
|
||||
|
||||
// Одна строка в лог на загрузку игрока - по ней видно, что конверсия старого сейва
|
||||
// произошла и во что именно (вопрос пользователя 2026-09-17: "не сломают ли новые
|
||||
// правки старые сейвы").
|
||||
int newLevel = pv != null ? pv.Level : 0;
|
||||
if (newLevel != oldLevel)
|
||||
{
|
||||
Debug.Log("[NecromancerTome] NecromancyLevel: уровень пересчитан из счётчика убийств " +
|
||||
(int)kills + ": было " + oldLevel + ", стало " + newLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -4,6 +4,6 @@
|
||||
<DisplayName value="Necromancer's Tome" />
|
||||
<Description value="A dark necromancy progression for 7 Days to Die 3.2: a kill-count-driven skill tree with cursed weapons, charm/deviation magic, summonable undead pets, base-defence wards, and a story-ending Black Portal ritual. Fully localized into 13 languages. Single-player; requires EAC off." />
|
||||
<Author value="Alex Cube" />
|
||||
<Version value="1.2.0" />
|
||||
<Version value="1.3.0" />
|
||||
<Website value="https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/" />
|
||||
</xml>
|
||||
|
||||
@@ -17,11 +17,11 @@ To uninstall, delete the folder. The mod adds items and one block, so a save tha
|
||||
|
||||
[size=5][b]Main features[/b][/size]
|
||||
|
||||
[b]A skill that levels from kills, not perk points.[/b] Necromancy counts every zombie you put down. Five tiers, 5000 kills to the top, each threshold opening part of the arsenal:
|
||||
[b]A skill that levels from kills, not perk points.[/b] Necromancy counts every zombie you put down: twenty of them make one level, up to level 250 (5000 zombies). The skull in the status bar shows the level, the purple bar beside the experience bar shows the progress inside it. Five tiers, each threshold opening part of the arsenal (zombie counts, level in brackets):
|
||||
|
||||
[list]
|
||||
[*][b]Adept[/b] (from the start) - Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits, Blood Sphere
|
||||
[*][b]Adept[/b] (20 / 30 / 60 / 100 / 300) - Spatial Bracelet, then four knife mods: Tears of the Dead, Scavenger's Feast, Grave's Repose, Dark Sense
|
||||
[*][b]Adept[/b] (from the start, level 0) - Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits
|
||||
[*][b]Adept[/b] (20 / 60 / 100 / 300, levels 1 / 3 / 5 / 15) - Spatial Bracelet and Blood Sphere, then four knife mods: Tears of the Dead, Scavenger's Feast, Grave's Repose, Dark Sense
|
||||
[*][b]Journeyman[/b] (500 / 1400 / 1700) - Scroll of Deviation, knife mods Dead Man's Grip and Dead Storm
|
||||
[*][b]Apprentice[/b] (2000) - Summon Zombie Dog, Beetles of the Lord, Summon Zombie Griffin, Blood Stone
|
||||
[*][b]Necromancer[/b] (3000) - Summon Zombie Bear, Summon Zombie Wolf, Banshee's Scroll
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -2,7 +2,7 @@
|
||||
|
||||
*English version below — scroll past the Russian half.*
|
||||
|
||||
**Версия 1.2.0** — для 7 Days to Die 3.2. Автор: Alex Cube.
|
||||
**Версия 1.3.0** — для 7 Days to Die 3.2. Автор: Alex Cube.
|
||||
|
||||
- Страница мода: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
||||
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
||||
@@ -26,18 +26,25 @@
|
||||
Отдельный скилл **"Некромантия"** растёт не от опыта, а от счётчика упокоенных зомби — свой
|
||||
счётчик, своя механика. Засчитывается любое убийство, за которое игра начисляет вам опыт: добитые
|
||||
ловушкой, сгоревшие, умершие от наложенного вами кровотечения, и зомби-звери наравне с
|
||||
человекоподобными. Пять тиров, каждый открывает часть арсенала:
|
||||
человекоподобными.
|
||||
|
||||
| Тир | Порог | Что открывается |
|
||||
|---|---|---|
|
||||
| Адепт | сразу | Камень духов, Нож некроманта, Синий портальный камень, Пирамида духов, Кровавая сфера |
|
||||
| Адепт (доп.) | 20 зомби | Пространственный браслет |
|
||||
| Адепт (доп.) | 30 / 60 / 100 / 300 зомби | Моды ножа: Слёзы мертвеца, Пир падальщика, Могильный покой, Тёмное чутьё |
|
||||
| Подмастерье | 500 зомби | Свиток девиации |
|
||||
| Подмастерье (доп.) | 1400 / 1700 зомби | Моды ножа: Хватка мертвеца, Мёртвая буря |
|
||||
| Ученик | 2000 зомби | Призыв зомбособаки, Жуки Властелина, Призыв зомбогрифа, Кровавый камень |
|
||||
| Некромант | 3000 зомби | Призыв зомбомедведя, Призыв зомбоволка, Свиток банши |
|
||||
| Мастер | 5000 зомби | Чёрный портальный камень |
|
||||
**Двадцать упокоенных зомби — один уровень Некромантии**, максимум 250-й уровень (5000 зомби). В
|
||||
HUD за этим следят два индикатора: череп в статус-баре показывает текущий уровень, а фиолетовая
|
||||
шкала рядом с полосой опыта — сколько зомби набрано внутри уровня; заполнилась — уровень вырос, и
|
||||
шкала обнулилась.
|
||||
|
||||
Пять тиров, каждый открывает часть арсенала (в таблице и порог в зомби, и уровень скилла):
|
||||
|
||||
| Тир | Порог | Уровень | Что открывается |
|
||||
|---|---|---|---|
|
||||
| Адепт | сразу | 0 | Камень духов, Нож некроманта, Синий портальный камень, Пирамида духов |
|
||||
| Адепт (доп.) | 20 зомби | 1 | Пространственный браслет, Кровавая сфера, мод ножа «Слёзы мертвеца» |
|
||||
| Адепт (доп.) | 60 / 100 / 300 зомби | 3 / 5 / 15 | Моды ножа: Пир падальщика, Могильный покой, Тёмное чутьё |
|
||||
| Подмастерье | 500 зомби | 25 | Свиток девиации |
|
||||
| Подмастерье (доп.) | 1400 / 1700 зомби | 70 / 85 | Моды ножа: Хватка мертвеца, Мёртвая буря |
|
||||
| Ученик | 2000 зомби | 100 | Призыв зомбособаки, Жуки Властелина, Призыв зомбогрифа, Кровавый камень |
|
||||
| Некромант | 3000 зомби | 150 | Призыв зомбомедведя, Призыв зомбоволка, Свиток банши |
|
||||
| Мастер | 5000 зомби | 250 | Чёрный портальный камень |
|
||||
|
||||
## Арсенал
|
||||
|
||||
@@ -75,7 +82,7 @@
|
||||
единицу; опустевшая сфера рассыпается. Доступна с самого начала и делается без верстака, по две
|
||||
за раз, из крови некроманта и праха зомби.
|
||||
- **Кровавый камень** — тот же слот, но не тратится вовсе: эндгейм-замена сфере. Открывается на
|
||||
2000 упокоенных и варится на химической станции из праха зомби, костей, обычной крови и крови
|
||||
2000 упокоенных (уровень 100) и варится на химической станции из праха зомби, костей, обычной крови и крови
|
||||
некроманта.
|
||||
- **Консервные банки** (пустая / с речной водой / с кипячёной) — расходный цикл вместо
|
||||
одноразовых банок: наполняются водой, кипятятся прямо на костре без кастрюли, выпиваются, банка
|
||||
@@ -139,6 +146,25 @@
|
||||
|
||||
## Статус
|
||||
|
||||
Версия 1.3.0 — **шкала Некромантии переведена на 20 упокоенных зомби за уровень** (максимум 250-й
|
||||
уровень, те же 5000 зомби). Это не косметика, а починка: игра хранит уровень любого навыка одним
|
||||
байтом, поэтому старая шкала «одно убийство — один уровень» при каждом сохранении откатывала
|
||||
уровень назад на 256. Внешне это выглядело как самопроизвольно закрывающиеся рецепты — на панели
|
||||
скилла снова появлялся замок на том, что уже было открыто, — а тиры 500 / 2000 / 3000 / 5000 были
|
||||
недостижимы вовсе. Число упокоенных зомби никогда не портилось, и уровень теперь считается из него,
|
||||
в том числе при загрузке: **старые сейвы чинятся сами**, без команд и без новой игры.
|
||||
|
||||
Заодно в HUD появились два индикатора: череп в статус-баре показывает уровень Некромантии (раньше
|
||||
он показывал общее число убийств), а новая фиолетовая шкала рядом с полосой опыта — продвижение
|
||||
внутри уровня, от 0 до 20. Мод ножа на воду (Слёзы мертвеца) переехал с 30 упокоенных на 20 — на
|
||||
новой шкале 30 не выражается, и порог опущен, а не поднят.
|
||||
|
||||
И третья правка этой версии: **подчинённые зомби больше не дерутся между собой**. Раньше зомби под
|
||||
девиацией получал приказ «бей зомби» и видел законную цель в таком же подчинённом — чем больше вы
|
||||
подчиняли, тем чаще ваша свита выясняла отношения вместо того, чтобы драться за вас. Теперь
|
||||
подчинённый не считает подчинённого целью и выбирает следующего, настоящего врага; это же правило
|
||||
гасит и месть, если драка началась до подчинения.
|
||||
|
||||
Версия 1.2.0 — у Пространственного браслета появился расходник. Забор блоков теперь питается
|
||||
зарядом в слоте модификаций: **Кровавая сфера** тратит единицу прочности за секунду поглощения и,
|
||||
опустев, рассыпается; **Кровавый камень** с третьего грейда занимает тот же слот и не тратится
|
||||
@@ -166,10 +192,13 @@
|
||||
торговцев, крик при создании Крови некроманта.
|
||||
|
||||
> **Эта сборка проверена не полностью.** Вкладка испытаний, оба первых испытания и счёт убийств
|
||||
> в игре подтверждены. Ещё не проверены: **Кровавый камень** (нужен уровень Некромантии 2000 и
|
||||
> химстанция), **новый порог Кровавой сферы** (переехала с уровня 1 на 20, туда же, где открывается
|
||||
> Пространственный браслет), а также **награды испытаний и два новых испытания** — на Камень духов
|
||||
> и Синий портальный камень. Если что-то поведёт себя не так, это ожидаемые места для сюрприза. Из запланированного не
|
||||
> в игре подтверждены. Ещё не проверены: **новая шкала уровней и оба индикатора** (череп с уровнем
|
||||
> и фиолетовая шкала прогресса), **починка старых сейвов на загрузке**, **мир между подчинёнными
|
||||
> зомби**, **Кровавый камень** (нужен
|
||||
> уровень Некромантии 100, он же 2000 упокоенных, и химстанция), **новый порог Кровавой сферы**
|
||||
> (переехала на уровень 1, туда же, где открывается Пространственный браслет), а также **награды
|
||||
> испытаний и два новых испытания** — на Камень духов и Синий портальный камень. Если что-то
|
||||
> поведёт себя не так, это ожидаемые места для сюрприза. Из запланированного не
|
||||
сделана только часть фирменных звуков. Текст описания для сайта (RU + EN) — в
|
||||
`SITE_DESCRIPTION.html` (разметка блоков WordPress). Полная техническая история разработки и текст финала лежат рядом с модом
|
||||
в `BACKLOG.md` и `FINAL_TEXT.md` — в репозиторий они не входят (спойлеры и внутренняя кухня).
|
||||
@@ -178,7 +207,7 @@
|
||||
|
||||
# Necromancer's Tome (English)
|
||||
|
||||
**Version 1.2.0** - for 7 Days to Die 3.2. By Alex Cube.
|
||||
**Version 1.3.0** - for 7 Days to Die 3.2. By Alex Cube.
|
||||
|
||||
- Mod page: https://www.alexcube.ru/7-days-to-die-moi-mody/kniga-nekromanta-necromancer-s-tome/
|
||||
- Nexus Mods: https://www.nexusmods.com/7daystodie/mods/12547
|
||||
@@ -201,18 +230,25 @@ survival in spite of death, but power over it.
|
||||
|
||||
A dedicated **"Necromancy"** skill grows not from experience but from a count of zombies put to
|
||||
rest - its own counter, its own mechanic. Anything the game gives you XP for counts: kills finished
|
||||
by a trap, by fire, by a bleed you applied, and zombie animals alongside the humanoids. Five tiers, each opening part of the arsenal:
|
||||
by a trap, by fire, by a bleed you applied, and zombie animals alongside the humanoids.
|
||||
|
||||
| Tier | Threshold | What unlocks |
|
||||
|---|---|---|
|
||||
| Adept | from the start | Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits, Blood Sphere |
|
||||
| Adept (extra) | 20 zombies | Spatial Bracelet |
|
||||
| Adept (extra) | 30 / 60 / 100 / 300 zombies | Knife mods: Tears of the Dead, Scavenger's Feast, Grave's Repose, Dark Sense |
|
||||
| Journeyman | 500 zombies | Scroll of Deviation |
|
||||
| Journeyman (extra) | 1400 / 1700 zombies | Knife mods: Dead Man's Grip, Dead Storm |
|
||||
| Apprentice | 2000 zombies | Summon Zombie Dog, Beetles of the Lord, Summon Zombie Griffin, Blood Stone |
|
||||
| Necromancer | 3000 zombies | Summon Zombie Bear, Summon Zombie Wolf, Banshee's Scroll |
|
||||
| Master | 5000 zombies | Black Portal Stone |
|
||||
**Twenty zombies put to rest make one Necromancy level**, up to level 250 (5000 zombies). Two
|
||||
indicators track it on the HUD: the skull in the status bar shows the current level, and the purple
|
||||
bar next to the experience bar shows how many zombies you have gathered inside the level - it fills,
|
||||
the level goes up, the bar resets.
|
||||
|
||||
Five tiers, each opening part of the arsenal (the table gives both the zombie count and the level):
|
||||
|
||||
| Tier | Threshold | Level | What unlocks |
|
||||
|---|---|---|---|
|
||||
| Adept | from the start | 0 | Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits |
|
||||
| Adept (extra) | 20 zombies | 1 | Spatial Bracelet, Blood Sphere, the Tears of the Dead knife mod |
|
||||
| Adept (extra) | 60 / 100 / 300 zombies | 3 / 5 / 15 | Knife mods: Scavenger's Feast, Grave's Repose, Dark Sense |
|
||||
| Journeyman | 500 zombies | 25 | Scroll of Deviation |
|
||||
| Journeyman (extra) | 1400 / 1700 zombies | 70 / 85 | Knife mods: Dead Man's Grip, Dead Storm |
|
||||
| Apprentice | 2000 zombies | 100 | Summon Zombie Dog, Beetles of the Lord, Summon Zombie Griffin, Blood Stone |
|
||||
| Necromancer | 3000 zombies | 150 | Summon Zombie Bear, Summon Zombie Wolf, Banshee's Scroll |
|
||||
| Master | 5000 zombies | 250 | Black Portal Stone |
|
||||
|
||||
## Arsenal
|
||||
|
||||
@@ -250,7 +286,7 @@ by a trap, by fire, by a bleed you applied, and zombie animals alongside the hum
|
||||
pull; emptied, the sphere crumbles. Available from the very start and hand-crafted without a
|
||||
workbench, two at a time, from Necromancer's Blood and Zombie Ash.
|
||||
- **Blood Stone** - the same slot, but never spent at all: the endgame replacement for the sphere.
|
||||
Opens at 2000 zombies put to rest and is brewed at a chemistry station from zombie ash, bones,
|
||||
Opens at 2000 zombies put to rest (level 100) and is brewed at a chemistry station from zombie ash, bones,
|
||||
ordinary blood and Necromancer's Blood.
|
||||
- **Tin cans** (empty / with river water / with boiled water) - a reusable cycle instead of
|
||||
single-use jars: fill them with water, boil it right on a campfire without a pot, drink, and the
|
||||
@@ -315,6 +351,27 @@ story scenes play without stopping time.
|
||||
|
||||
## Status
|
||||
|
||||
Version 1.3.0 - **Necromancy now scales at 20 zombies put to rest per level** (up to level 250,
|
||||
the same 5000 zombies). This is a fix, not a facelift: the game stores any skill's level in a
|
||||
single byte, so the old "one kill, one level" scale rolled the level back by 256 on every save.
|
||||
From the outside it looked like recipes closing on their own - the skill panel would put the lock
|
||||
back on something already unlocked - and the 500 / 2000 / 3000 / 5000 tiers were unreachable
|
||||
altogether. The count of zombies put to rest was never damaged, and the level is now derived from
|
||||
it, including on load: **old saves repair themselves**, with no commands and no new game.
|
||||
|
||||
Two HUD indicators come with it: the skull in the status bar now shows the Necromancy level (it
|
||||
used to show the total kill count), and a new purple bar next to the experience bar shows the
|
||||
progress inside the level, from 0 to 20. The water knife mod (Tears of the Dead) moved from 30
|
||||
zombies to 20 - 30 does not land on the new scale, and the threshold was lowered rather than
|
||||
raised.
|
||||
|
||||
A third fix ships with this version: **charmed zombies no longer fight each other**. A zombie under
|
||||
deviation used to be told "attack zombies" and saw a perfectly valid target in another charmed one -
|
||||
the more of them you charmed, the more of your retinue settled scores among themselves instead of
|
||||
fighting for you. Now a charmed zombie does not count another charmed zombie as a target and picks
|
||||
the next, real enemy instead; the same rule cancels revenge if the fight started before the
|
||||
charming.
|
||||
|
||||
Version 1.2.0 - the Spatial Bracelet now runs on a charge. Pulling blocks draws on whatever sits
|
||||
in its mod slot: the **Blood Sphere** spends a point of durability per second of the pull and
|
||||
crumbles once empty, while the **Blood Stone** from the third grade takes the same slot and is never
|
||||
@@ -343,10 +400,12 @@ charge and the Blood Sphere's spending, Necromancy's kill count (zombie animals,
|
||||
included), the traders' ghostly look, and the cry when Necromancer's Blood is made.
|
||||
|
||||
> **This build has not been fully tested.** The challenges tab, its first two challenges and the
|
||||
> kill count are confirmed in game. Not yet checked: the **Blood Stone** (it needs Necromancy level
|
||||
> 2000 and a chemistry station), the **Blood Sphere's new threshold** (it moved from level 1 to 20,
|
||||
> where the Spatial Bracelet itself unlocks), and the **challenge rewards plus two new challenges**
|
||||
> for the Spirit Stone and the Blue Portal Stone. If anything misbehaves, that is where to look. Of what was planned, only part of the mod's own sound effects is missing. The description text for the website
|
||||
> kill count are confirmed in game. Not yet checked: the **new level scale and both indicators**
|
||||
> (the skull showing the level and the purple progress bar), the **self-repair of old saves on
|
||||
> load**, the **truce between charmed zombies**, the **Blood Stone** (it needs Necromancy level 100, i.e. 2000 zombies put to rest, and a
|
||||
> chemistry station), the **Blood Sphere's new threshold** (it moved to level 1, where the Spatial
|
||||
> Bracelet itself unlocks), and the **challenge rewards plus two new challenges** for the Spirit
|
||||
> Stone and the Blue Portal Stone. If anything misbehaves, that is where to look. Of what was planned, only part of the mod's own sound effects is missing. The description text for the website
|
||||
(RU + EN) is in `SITE_DESCRIPTION.html` (WordPress block markup). The full technical history of
|
||||
development and the text of the finale sit next to the mod in `BACKLOG.md` and `FINAL_TEXT.md` -
|
||||
they are not part of the repository (spoilers and back-of-house).
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
|
||||
<h2>Прогрессия, которая растёт от убийств</h2>
|
||||
|
||||
Отдельный навык <strong>«Некромантия»</strong> качается не за очки перков и не за книги, а по счётчику упокоенных зомби. Пять тиров, 5000 убийств до вершины, каждый порог открывает часть арсенала:
|
||||
Отдельный навык <strong>«Некромантия»</strong> качается не за очки перков и не за книги, а по счётчику упокоенных зомби: двадцать упокоенных — один уровень, до 250-го (5000 зомби). Уровень показывает череп в статус-баре, а фиолетовая шкала рядом с полосой опыта — сколько набрано внутри уровня. Пять тиров, каждый порог открывает часть арсенала (в таблице — зомби, в скобках уровень):
|
||||
|
||||
<table><thead><tr><th>Тир</th><th>Порог</th><th>Что открывается</th></tr></thead><tbody><tr><td>Адепт</td><td>сразу</td><td>Камень духов, Нож некроманта, Синий портальный камень, Пирамида духов, Кровавая сфера</td></tr><tr><td>Адепт</td><td>20 / 30 / 60 / 100 / 300</td><td>Пространственный браслет, затем моды ножа: Слёзы мертвеца, Пир падальщика, Могильный покой, Тёмное чутьё</td></tr><tr><td>Подмастерье</td><td>500 / 1400 / 1700</td><td>Свиток девиации, моды ножа Хватка мертвеца и Мёртвая буря</td></tr><tr><td>Ученик</td><td>2000</td><td>Призыв зомбособаки, Жуки Властелина, Призыв зомбогрифа, Кровавый камень</td></tr><tr><td>Некромант</td><td>3000</td><td>Призыв зомбомедведя, Призыв зомбоволка, Свиток банши</td></tr><tr><td>Мастер</td><td>5000</td><td>Чёрный портальный камень</td></tr></tbody></table>
|
||||
<table><thead><tr><th>Тир</th><th>Порог</th><th>Что открывается</th></tr></thead><tbody><tr><td>Адепт</td><td>сразу (0)</td><td>Камень духов, Нож некроманта, Синий портальный камень, Пирамида духов</td></tr><tr><td>Адепт</td><td>20 (1)</td><td>Пространственный браслет, Кровавая сфера, мод ножа «Слёзы мертвеца»</td></tr><tr><td>Адепт</td><td>60 / 100 / 300 (3 / 5 / 15)</td><td>Моды ножа: Пир падальщика, Могильный покой, Тёмное чутьё</td></tr><tr><td>Подмастерье</td><td>500 / 1400 / 1700 (25 / 70 / 85)</td><td>Свиток девиации, моды ножа Хватка мертвеца и Мёртвая буря</td></tr><tr><td>Ученик</td><td>2000 (100)</td><td>Призыв зомбособаки, Жуки Властелина, Призыв зомбогрифа, Кровавый камень</td></tr><tr><td>Некромант</td><td>3000 (150)</td><td>Призыв зомбомедведя, Призыв зомбоволка, Свиток банши</td></tr><tr><td>Мастер</td><td>5000 (250)</td><td>Чёрный портальный камень</td></tr></tbody></table>
|
||||
|
||||
<h2>Арсенал</h2>
|
||||
|
||||
@@ -84,9 +84,9 @@ Necromancy here is an answer to a curse, not a side branch of crafting. Instead
|
||||
|
||||
<h3>Progression driven by kills</h3>
|
||||
|
||||
A dedicated <strong>Necromancy</strong> skill levels not from perk points and not from books, but from your zombie kill count. Five tiers, 5000 kills to the top, each threshold opening part of the arsenal:
|
||||
A dedicated <strong>Necromancy</strong> skill levels not from perk points and not from books, but from your zombie kill count: twenty zombies put to rest make one level, up to level 250 (5000 zombies). The skull in the status bar shows the level, and the purple bar beside the experience bar shows how far you are into it. Five tiers, each threshold opening part of the arsenal (the table gives zombies, with the level in brackets):
|
||||
|
||||
<table><thead><tr><th>Tier</th><th>Threshold</th><th>What unlocks</th></tr></thead><tbody><tr><td>Adept</td><td>from the start</td><td>Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits, Blood Sphere</td></tr><tr><td>Adept</td><td>20 / 30 / 60 / 100 / 300</td><td>Spatial Bracelet, then the knife mods: Tears of the Dead, Scavenger's Feast, Grave's Repose, Dark Sense</td></tr><tr><td>Journeyman</td><td>500 / 1400 / 1700</td><td>Scroll of Deviation, knife mods Dead Man's Grip and Dead Storm</td></tr><tr><td>Apprentice</td><td>2000</td><td>Summon Zombie Dog, Beetles of the Lord, Summon Zombie Griffin, Blood Stone</td></tr><tr><td>Necromancer</td><td>3000</td><td>Summon Zombie Bear, Summon Zombie Wolf, Banshee's Scroll</td></tr><tr><td>Master</td><td>5000</td><td>Black Portal Stone</td></tr></tbody></table>
|
||||
<table><thead><tr><th>Tier</th><th>Threshold</th><th>What unlocks</th></tr></thead><tbody><tr><td>Adept</td><td>from the start (0)</td><td>Spirit Stone, Necromancer's Knife, Blue Portal Stone, Pyramid of Spirits</td></tr><tr><td>Adept</td><td>20 (1)</td><td>Spatial Bracelet, Blood Sphere, the Tears of the Dead knife mod</td></tr><tr><td>Adept</td><td>60 / 100 / 300 (3 / 5 / 15)</td><td>Knife mods: Scavenger's Feast, Grave's Repose, Dark Sense</td></tr><tr><td>Journeyman</td><td>500 / 1400 / 1700 (25 / 70 / 85)</td><td>Scroll of Deviation, knife mods Dead Man's Grip and Dead Storm</td></tr><tr><td>Apprentice</td><td>2000 (100)</td><td>Summon Zombie Dog, Beetles of the Lord, Summon Zombie Griffin, Blood Stone</td></tr><tr><td>Necromancer</td><td>3000 (150)</td><td>Summon Zombie Bear, Summon Zombie Wolf, Banshee's Scroll</td></tr><tr><td>Master</td><td>5000 (250)</td><td>Black Portal Stone</td></tr></tbody></table>
|
||||
|
||||
<h3>Arsenal</h3>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user