Урна устроена как транспорт: на E круговое меню - «Багажник» (своё окно с одной ячейкой под череп), сумка духа 6x2 (хранилище игры), «Починить» (5 костей из рюкзака), показать/скрыть зону 5x5 от -1 до +4, «Поднять» (деталь игры TEFeaturePickup; только с пустой сумкой, череп остаётся внутри - поднятая урна с черепом становится necroCinerariumSkull). Постановка: зоны урн не пересекаются, урн не больше ceil(убийств / 500); реестр урн - файл в папке сейва. Разбитая урна роняет череп. Сохранение - CinerariumWriteHelper, версия первым байтом. Рецепт - конец Адепта (уровень 15). Модель и иконка временные (кастрюля). Тексты - 13 языков. Дух-работник - следующий этап. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
86 lines
3.2 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|