Урна рабочего: подкладка сырья в кузню до изготовления (#19)

После изготовления очередь до подкладки не доходила: переплавленного
каждый шаг хватало на один цемент. Теперь подкладка первой, но только
в пустую или наполовину опустевшую ячейку входа.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-24 15:07:52 +03:00
co-authored by Claude Opus 5.5
parent cc9c0366f0
commit c208e3b9f9
3 changed files with 47 additions and 40 deletions
+47 -40
View File
@@ -119,6 +119,47 @@ namespace NecromancerTome
break;
}
}
// 2а. Кузня: вход сырья держать полным (24.10, пользователь: «Места не должны пустовать. Нужно чтобы заполнены были
// обе ячейки»). Раньше сырьё подкладывалось, только когда переплавленного не хватало даже на одну штуку, - кузня
// плавила остатки, и дух ставил цемент по одному. Подкладка - ДО изготовления (после него очередь до неё не
// доходила: переплавленного каждый шаг хватало на одну штуку), но только в пустую или наполовину опустевшую ячейку -
// кузня плавит непрерывно, и иначе подкладка отнимала бы все шаги.
if (hasSample)
{
string feedName = sample.itemValue.ItemClass?.GetItemName();
foreach (Station st in stations)
{
if (!st.Te.isModuleUsed[MaterialModule] || !OutputHasRoom(st.Te, sample) && !outRoom)
{
continue;
}
foreach (Recipe r in CraftingManager.GetRecipes(feedName))
{
if (r.IsScrap || !AreaFits(r, st.Areas) || owner != null && !r.IsUnlocked(owner))
{
continue;
}
foreach (ItemStack ing in r.ingredients)
{
string iname = ing?.itemValue?.ItemClass?.GetItemName();
if (iname == null || UnitSlot(st.Te, iname) < 0)
{
continue;
}
if (FeedMaterial(st, iname, src, _dry, out Vector3i? rawAt, true))
{
_from = rawAt;
if (!_dry)
{
Ignite(st.Te, src, false);
}
return st.Pos;
}
}
}
}
}
if (hasSample)
{
string name = sample.itemValue.ItemClass?.GetItemName();
@@ -171,45 +212,6 @@ namespace NecromancerTome
}
}
// 2б. Кузня: вход сырья держать полным (24.10, пользователь: «Места не должны пустовать. Нужно чтобы заполнены были
// обе ячейки»). Раньше сырьё подкладывалось, только когда переплавленного не хватало даже на одну штуку, - кузня
// плавила остатки, и дух ставил цемент по одному. Изготовление - первым делом (выше), подкладка - следующим.
if (hasSample)
{
string name = sample.itemValue.ItemClass?.GetItemName();
foreach (Station st in stations)
{
if (!st.Te.isModuleUsed[MaterialModule] || !OutputHasRoom(st.Te, sample) && !outRoom)
{
continue;
}
foreach (Recipe r in CraftingManager.GetRecipes(name))
{
if (r.IsScrap || !AreaFits(r, st.Areas) || owner != null && !r.IsUnlocked(owner))
{
continue;
}
foreach (ItemStack ing in r.ingredients)
{
string iname = ing?.itemValue?.ItemClass?.GetItemName();
if (iname == null || UnitSlot(st.Te, iname) < 0)
{
continue;
}
if (FeedMaterial(st, iname, src, _dry, out Vector3i? rawAt))
{
_from = rawAt;
if (!_dry)
{
Ignite(st.Te, src, false);
}
return st.Pos;
}
}
}
}
}
// 3. Огонь: работа есть - топливо и огонь; нет - погасить (экономия топлива).
foreach (Station st in stations)
{
@@ -516,7 +518,8 @@ namespace NecromancerTome
}
/// <summary>Сырьё для переплавки в unit_X: предмет из ящика «откуда», сделанный из этого материала, - во вход кузни.</summary>
static bool FeedMaterial(Station _st, string _unit, List<(Vector3i p, TEFeatureStorage box)> _src, bool _dry, out Vector3i? _at)
/// <remarks>_halfEmpty - только в пустую ячейку или заполненную меньше чем наполовину (подкладка впрок, шаг 2а).</remarks>
static bool FeedMaterial(Station _st, string _unit, List<(Vector3i p, TEFeatureStorage box)> _src, bool _dry, out Vector3i? _at, bool _halfEmpty = false)
{
_at = null;
string mat = _unit.Substring(5);
@@ -546,6 +549,10 @@ namespace NecromancerTome
{
bool empty = input[i] == null || input[i].IsEmpty();
int room = empty ? ic.MaxCount : input[i].itemValue.type == g.itemValue.type ? ic.MaxCount - input[i].count : 0;
if (_halfEmpty && !empty && input[i].count * 2 > ic.MaxCount)
{
room = 0;
}
if (room <= 0)
{
continue;
Binary file not shown.
Binary file not shown.