Files
necromants-tome-7d2d-3-2/HarmonySrc/CinerariumTrunk.cs
T
AlexCubeandClaude Opus 5.5 bd76360eeb Урна-цинерарий: блок, багажник с черепом, сумка духа, зона, лимит
Урна устроена как транспорт: на E круговое меню - «Багажник» (своё окно
с одной ячейкой под череп), сумка духа 6x2 (хранилище игры), «Починить»
(5 костей из рюкзака), показать/скрыть зону 5x5 от -1 до +4, «Поднять»
(деталь игры TEFeaturePickup; только с пустой сумкой, череп остаётся
внутри - поднятая урна с черепом становится necroCinerariumSkull).
Постановка: зоны урн не пересекаются, урн не больше ceil(убийств / 500);
реестр урн - файл в папке сейва. Разбитая урна роняет череп.
Сохранение - CinerariumWriteHelper, версия первым байтом.
Рецепт - конец Адепта (уровень 15). Модель и иконка временные (кастрюля).
Тексты - 13 языков. Дух-работник - следующий этап.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 15:10:02 +03:00

86 lines
3.2 KiB
C#

using UnityEngine;
namespace NecromancerTome
{
/// <summary>
/// «Багажник» урны-цинерария (решение 16.10: «урна как транспорт» - на E круговое меню, как у велосипеда:
/// багажник с ячейкой черепа и сумка духа). Окно necroCinerariumTrunk (Config/XUi_InGame) - панель с одной
/// ячейкой игры для обязательного предмета (XUiC_RequiredItemStack, как в панели модификаций коллектора
/// росы), рядом рюкзак (open_backpack_on_open). Ячейка принимает только череп и не больше одного
/// (override_stack_count="1" в XML). Череп - обычный предмет (ItemClass): в сейвах он уже есть, менять ему
/// класс на модификацию нельзя (см. память про сейвы), поэтому ячейка, а не сборка как у робомолота.
/// </summary>
public class XUiC_NecroCinerariumSkullGrid : XUiC_ItemStackGrid
{
public const string WindowGroup = "necroCinerariumTrunk";
/// <summary>Урна, чей багажник открыт (ставится перед открытием окна).</summary>
public static TEFeatureCinerarium Urn;
public static void Open(EntityPlayerLocal _player, TEFeatureCinerarium _urn)
{
LocalPlayerUI ui = _player?.PlayerUI;
if (ui == null || _urn == null)
{
return;
}
Urn = _urn;
ui.windowManager.Open(WindowGroup, true);
}
public override void OnOpen()
{
base.OnOpen();
ItemValue skull = ItemClass.GetItem(TEFeatureCinerarium.SkullItemName);
for (int i = 0; i < itemControllers.Length; i++)
{
if (itemControllers[i] is XUiC_RequiredItemStack slot)
{
slot.SetAllowedItemClassSingle(TEFeatureCinerarium.SkullItemName);
slot.RequiredItemOnly = true;
slot.StackLocation = XUiC_ItemStack.StackLocationTypes.Workstation;
}
}
ItemStack[] stacks = new ItemStack[itemControllers.Length];
for (int i = 0; i < stacks.Length; i++)
{
stacks[i] = ItemStack.Empty.Clone();
}
if (stacks.Length > 0 && Urn != null && Urn.HasSkull && skull != null && skull.type > 0)
{
stacks[0] = new ItemStack(skull, 1);
}
SetStacks(stacks);
}
public override void OnClose()
{
base.OnClose();
Urn = null;
}
public override void UpdateBackend(ItemStack[] stackList)
{
base.UpdateBackend(stackList);
bool has = stackList != null && stackList.Length > 0 && stackList[0] != null && !stackList[0].IsEmpty();
Urn?.SetSkull(has);
}
/// <summary>Урна убрана или выгружена, пока открыт её багажник, - закрыть окно (иначе череп в ячейке
/// уже ни к чему не привязан).</summary>
public static void CloseIfShowing(TEFeatureCinerarium _urn)
{
if (Urn == null || Urn != _urn)
{
return;
}
LocalPlayerUI ui = GameManager.Instance?.World?.GetPrimaryPlayer()?.PlayerUI;
if (ui != null && ui.windowManager.IsWindowOpen(WindowGroup))
{
ui.windowManager.Close(WindowGroup);
}
Urn = null;
}
}
}