Урна рабочего: подкладка сырья в кузню до изготовления (#19)
После изготовления очередь до подкладки не доходила: переплавленного каждый шаг хватало на один цемент. Теперь подкладка первой, но только в пустую или наполовину опустевшую ячейку входа. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
cc9c0366f0
commit
c208e3b9f9
@@ -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.
Reference in New Issue
Block a user