Одержимый зомби: оружие на поясе по ремеслу (#37), карта по M (#36)

- Пояс - нижний ряд сумки зомби; оружие ближнего боя в руку, если этот тип зомби
  им владеет (ZombieWeapons: таблица умений, утверждена 25.10). Удар как у персонажа:
  ItemActionAttack.Hit, урон предмета без перков зомби, износ, темп оружия.
  Модель на кость RightWeapon, хват WeaponHoldType; иконки и износ на поясе HUD.
  Неумелое или сломанное - кулаки и подсказка (13 языков). Выключатель
  necroarms weapon on|off; dev-команда necropossess для проверок без мыши.
- M в зомби и волке открывал сумку вместо карты (перехват windowpaging) - исправлено;
  туман карты и карта на одержимом - у любого одержимого зомби, как у стервятника.
- Глава «Одержимость» (EN/RU): пояс - оружие, M - карта.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-25 14:26:55 +03:00
co-authored by Claude Opus 5.5
parent 5ebd09dacd
commit cf61d98bb7
8 changed files with 626 additions and 18 deletions
+34 -2
View File
@@ -11,6 +11,8 @@ namespace NecromancerTome
/// - при выходе из одержимости зомби сбрасывает рюкзаком всё, что было в сумке (и на поясе - когда в поясе
/// появятся предметы);
/// - гибель одержимого - мешок на месте и метка на карте, как у сумки волка.
/// ПОЯС (#37, 25.10) - нижний ряд той же сумки: Possession.BeltSlots ячеек под верхним рядом, оружие в руке берётся
/// оттуда (ZombieWeapons). Хранение, выброс мешком и метка - общие с сумкой.
/// Лут (указание 13.10: «раз у них E свободно, подключай лутание») - как у волка: E на ящик или мешок - обыск с
/// переносом в сумку, E на предмет на земле - подобрать (WolfBag.Target - сумка зомби, пока она есть).
/// Только зомби из списка вида от первого лица (FpArms.Allows), не питомцы. Окно - то же, что у сумки волка
@@ -28,12 +30,41 @@ namespace NecromancerTome
public const string WaypointName = "necroZombieBagWaypoint";
public static bool WindowOpen;
static Bag _bag;
/// <summary>Ячеек в ряду: верхний ряд - сумка, нижний - пояс.</summary>
static int _cols;
static string FilePath => Path.Combine(GameIO.GetSaveGameDir(), FileName);
public static bool Active => _bag != null;
public static Bag Current => _bag;
/// <summary>Ячейка пояса (0..BeltSlots-1) - нижний ряд сумки; нет сумки - null.</summary>
public static ItemStack Belt(int _i)
{
ItemStack[] items = _bag?.ItemGrid?.items;
int idx = _cols + _i;
return items != null && _i >= 0 && _i < Possession.BeltSlots && idx < items.Length && !items[idx].IsEmpty() ? items[idx] : null;
}
/// <summary>necropossess belt: положить предмет в ячейку пояса (проверка без мыши).</summary>
public static bool DevSetBelt(int _i, ItemStack _s)
{
if (_bag == null || _i < 0 || _i >= Possession.BeltSlots)
{
return false;
}
_bag.SetSlot(_cols + _i, _s);
Save();
return true;
}
/// <summary>Предмет пояса изменился на месте (износ) - окно и файл.</summary>
public static void BeltChanged()
{
_bag?.onBackpackChanged();
Save();
}
/// <summary>Записать после лута (WolfBag.SaveTarget).</summary>
public static void SaveNow() => Save();
@@ -64,8 +95,9 @@ namespace NecromancerTome
{
Debug.LogWarning("[NecromancerTome] ZombieBag: файл сумки не прочитан (" + e.Message + ") - оставлен как есть");
}
_bag = new Bag(new Vector2i(SlotsFor(_z), 1), XUiC_ItemStack.StackLocationTypes.LootContainer, null);
Debug.Log("[NecromancerTome] ZombieBag: сумка " + _z.EntityName + " - ячеек " + _bag.SlotCount);
_cols = Mathf.Max(SlotsFor(_z), Possession.BeltSlots);
_bag = new Bag(new Vector2i(_cols, 2), XUiC_ItemStack.StackLocationTypes.LootContainer, null);
Debug.Log("[NecromancerTome] ZombieBag: сумка " + _z.EntityName + " - ячеек " + _bag.SlotCount + ", из них пояс " + Possession.BeltSlots);
}
/// <summary>Вселение кончилось: всё из сумки - мешком на месте зомби; погиб - ещё и метка на карте.</summary>