Кровавый прилив: в ночь кровавой луны дух не выходит из тела

Нет змеи, чертогов, одержимости зомби и питомцев; кто вне тела - выброшен
в тело; «коза» без эффекта. Подмешивание Стирателей в орду отключено.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-10 12:56:52 +03:00
co-authored by Claude Opus 5.5
parent 555d9c9b48
commit 8541c7abdf
8 changed files with 85 additions and 2 deletions
+5
View File
@@ -97,6 +97,10 @@ namespace NecromancerTome
}
}
// ОТКЛЮЧЕНО 10.10 (новая концепция кровавой луны - «кровавый прилив», SnakeMode.IsBloodTide): в эту ночь
// дух не выходит из тела, а кто был змеёй - выброшен в тело. Игрока-змеи в орде больше не бывает, и
// античит не нужен. Сущность и её вид (выше и ниже) оставлены - вернуть подмешивание можно, сняв комментарий.
/*
/// <summary>
/// Подмешивание в орду. Ванильный образец - AIDirectorBloodMoonParty.SpawnZombie: игрок в
/// транспорте получает в орду стервятников с шансом 0.5. Класс зомби там берётся из
@@ -139,6 +143,7 @@ namespace NecromancerTome
}
}
}
*/
/// <summary>
/// Вид Стирателя (02.10): тело - ванильная модель толстого гавайца (скелет, физика, теги,
+6
View File
@@ -157,6 +157,12 @@ namespace NecromancerTome
HandPose.Jab(); // толчок к прицелу, как у «пиф-пафа» (05.10)
_player.PlayOneShot(DenySound);
World world = _player.world;
if (SnakeMode.IsBloodTide())
{
// Кровавый прилив (10.10): леденящий ужас тонет в насыщенном воздухе - жест и звук есть, бегства нет.
SnakeMode.BloodTideHint(_player);
return;
}
if (world.IsRemote())
{
return; // ИИ живёт на сервере; клиент в мультиплеере - решать отдельно
+13
View File
@@ -808,6 +808,12 @@ namespace NecromancerTome
Debug.Log("[NecromancerTome] MindPalace: днём чертоги недоступны");
return;
}
if (SnakeMode.IsBloodTide())
{
SnakeMode.BloodTideHint(_player);
Debug.Log("[NecromancerTome] MindPalace: кровавый прилив - дух не покидает тело");
return;
}
World world = GameManager.Instance.World;
if (world.IsRemote())
{
@@ -903,6 +909,13 @@ namespace NecromancerTome
Exit(player);
return;
}
if (SnakeMode.IsBloodTide())
{
SnakeMode.BloodTideHint(player);
Debug.Log("[NecromancerTome] MindPalace: кровавый прилив - дух выброшен в тело");
Exit(player);
return;
}
Body(player);
switch (_stage)
{
+15 -1
View File
@@ -260,6 +260,13 @@ namespace NecromancerTome
{
return false;
}
// Кровавый прилив (указание 10.10): дух не выходит из тела - ни в зомби, ни в своего питомца.
if (SnakeMode.IsBloodTide())
{
SnakeMode.BloodTideHint(_player0);
Debug.Log("[NecromancerTome] Possession: кровавый прилив - дух не покидает тело");
return false;
}
Active = true;
IsPet = _pet;
Flying = _zombie is EntityVulture;
@@ -398,7 +405,8 @@ namespace NecromancerTome
return;
}
// Сам зомби в ужасе бежит от тела игрока (решение 03.10: «пугается и убегает как при отрицании»).
if (!z.IsDead() && player != null)
// В кровавый прилив леденящий ужас не действует (10.10) - выброшенный дух зомби не пугает.
if (!z.IsDead() && player != null && !SnakeMode.IsBloodTide())
{
z.SetMoveForwardWithModifiers(0f, 0f, 0f, false);
NecroFleeSnakeTask.ScareFrom(z, player, HandHolds.DenyMaxSeconds, HandHolds.DenySpeed, HandHolds.DenyFarDistance);
@@ -496,6 +504,12 @@ namespace NecromancerTome
Exit("одержимый погиб");
return;
}
if (SnakeMode.IsBloodTide())
{
SnakeMode.BloodTideHint(_player);
Exit("кровавый прилив - дух выброшен в тело");
return;
}
if (Flying)
{
RevealMap(world, z); // разведка - только стервятник (указание 08.10)
+44
View File
@@ -65,6 +65,37 @@ namespace NecromancerTome
return world != null && world.IsDark();
}
/// <summary>
/// «Кровавый прилив» (указание 10.10, новая концепция ночи кровавой луны). Луна в этой фазе тянет из
/// земли некротлен - прах умерших за годы эпидемии, - и плотность некроэнергии в воздухе скачком
/// сравнивается с плотностью в теле некроманта. Дух выходит из тела по перепаду плотностей; перепада
/// нет - выйти нечем. Поэтому до утра: нет духа змеи, чертогов разума, одержимости (и зомби, и своих
/// питомцев), а кто был вне тела к началу - выброшен в тело. «Коза» (леденящий ужас) тонет в
/// насыщенном воздухе: жест есть, эффекта нет.
/// Время - ванильное GameUtils.IsBloodMoonTime (от заката дня луны до рассвета), оно считается по часам
/// мира и одинаково у хоста и клиента; AIDirector с его BloodMoonActive есть только у сервера.
/// </summary>
public static bool IsBloodTide()
{
World world = GameManager.Instance?.World;
return world != null && GameUtils.IsBloodMoonTime(world.worldTime, (world.DuskHour, world.DawnHour),
GameStats.GetInt(EnumGameStats.BloodMoonDay));
}
/// <summary>Надпись «кровавого прилива» - не чаще раза в BloodTideHintPeriod с.</summary>
public const float BloodTideHintPeriod = 2f;
static float _bloodTideHintAt = -100f;
public static void BloodTideHint(EntityPlayerLocal _player)
{
if (_player == null || Time.time - _bloodTideHintAt < BloodTideHintPeriod)
{
return;
}
_bloodTideHintAt = Time.time;
GameManager.ShowTooltip(_player, Localization.Get("necroBloodTide"));
}
public static bool IsKnife(ItemClass _item)
{
return _item != null && _item.Name == KnifeName;
@@ -81,6 +112,12 @@ namespace NecromancerTome
Debug.Log("[NecromancerTome] SnakeMode: днём дух змеи недоступен");
return;
}
if (IsBloodTide())
{
BloodTideHint(_player);
Debug.Log("[NecromancerTome] SnakeMode: кровавый прилив - дух не покидает тело");
return;
}
World world = GameManager.Instance.World;
EntityClass snakeClass = EntityClass.list[EntityClass.FromString(SnakeClassName)];
if (snakeClass == null)
@@ -247,6 +284,13 @@ namespace NecromancerTome
Exit(player);
return;
}
if (IsBloodTide())
{
BloodTideHint(player);
Debug.Log("[NecromancerTome] SnakeMode: кровавый прилив - дух выброшен в тело");
Exit(player);
return;
}
if (_placeSnake && PlaceSnake(player, snake))
{
_placeSnake = false;