Цинерарий-старатель (#64): дух добывает ископаемые

Урна necroCinerariumProspector (и ...Skull): в «Содержимом» череп и образец - один из девяти ресурсов (камень, глина,
песок, древесина, железо, свинец, уголь, селитра, сланец), нить к ящику. Дух отлетает на соседнюю свободную клетку и
уходит на 5 блоков под землю, растворяясь; раз в игровой час поднимается так же, кладёт добычу в ящик и уходит снова.
За сутки: камень/глина/песок/древесина 30000, руды 18000, ходка ±20%. Из руды - шанс на алмаз, серебро, золото по
шансам игры на каждый «блок» руды. Ящик полон - дух ждёт с добычей. Без зоны и вне лимита урн.

Рецепт - кузня: латунь 40, прах 100, кости 10, кровь/сок, железная кирка; открывается с остальными урнами.
Консоль necroprospector: on/off, trip, yield, spread, depth, состояние. Тексты - 13 языков; глава книги
«Цинерарии» - лист Fig. VIII с шестой урной и фраза про prospektisto.

Проверено в игре (test8): ходка железа 625 в ящике, спуск и подъём духа, лист и страница книги помещаются.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-22 11:09:12 +03:00
co-authored by Claude Opus 5.5
parent f1010f98b7
commit 0999fd3afc
12 changed files with 760 additions and 17 deletions
+27 -3
View File
@@ -10,6 +10,7 @@ namespace NecromancerTome
/// в ячейке остаётся один череп, всё остальное (лишние черепа, чужие предметы) - назад в рюкзак, и урна узнаёт, есть ли
/// в ней череп. Череп - обычный предмет (ItemClass): он уже в сейвах, менять ему класс на модификацию нельзя.
/// У урны рабочего (18.10) ячеек две: вторая - образец (любой предмет, стопка целиком - сколько держать в запасе).
/// У старателя (22.10) вторая ячейка - что добывать: один предмет из TEFeatureCinerarium.Ores, лишнее и чужое - назад.
/// </summary>
public static class CinerariumContents
{
@@ -31,12 +32,12 @@ namespace NecromancerTome
}
_urn = _u;
_player = _p;
_bag = new Bag(new Vector2i(_u.IsWorker ? 2 : 1, 1), XUiC_ItemStack.StackLocationTypes.LootContainer, null);
_bag = new Bag(new Vector2i(_u.IsWorker || _u.IsProspector ? 2 : 1, 1), XUiC_ItemStack.StackLocationTypes.LootContainer, null);
if (_u.HasSkull && skull != null && skull.type > 0)
{
_bag.SetSlot(0, new ItemStack(skull, 1));
}
if (_u.IsWorker && _u.Sample != null && !_u.Sample.IsEmpty())
if ((_u.IsWorker || _u.IsProspector) && _u.Sample != null && !_u.Sample.IsEmpty())
{
_bag.SetSlot(1, _u.Sample.Clone());
}
@@ -59,7 +60,7 @@ namespace NecromancerTome
{
return;
}
if (_urn.IsWorker && _bag.ItemGrid.items.Length > 1)
if ((_urn.IsWorker || _urn.IsProspector) && _bag.ItemGrid.items.Length > 1)
{
ItemStack smp = _bag.ItemGrid.items[1];
ItemStack first = _bag.ItemGrid.items[0];
@@ -70,6 +71,29 @@ namespace NecromancerTome
_bag.SetSlot(1, ItemStack.Empty.Clone());
smp = _bag.ItemGrid.items[1];
}
if (_urn.IsProspector && smp != null && !smp.IsEmpty())
{
// Старатель: образец - один предмет из списка добычи; чужое целиком, лишние штуки - назад.
if (!TEFeatureCinerarium.IsOreSample(smp))
{
GiveBack(smp.Clone());
_bag.SetSlot(1, ItemStack.Empty.Clone());
if (_player != null)
{
GameManager.ShowTooltip(_player, Localization.Get("necroProspectorBadSample"));
}
}
else if (smp.count > 1)
{
ItemStack back = smp.Clone();
back.count = smp.count - 1;
GiveBack(back);
ItemStack one = smp.Clone();
one.count = 1;
_bag.SetSlot(1, one);
}
smp = _bag.ItemGrid.items[1];
}
_urn.SetSample(smp != null && !smp.IsEmpty() ? smp.Clone() : ItemStack.Empty.Clone());
}
ItemStack s = _bag.ItemGrid.items[0];