Урна рабочего: подкладка сырья в кузню до изготовления (#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;
|
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)
|
if (hasSample)
|
||||||
{
|
{
|
||||||
string name = sample.itemValue.ItemClass?.GetItemName();
|
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. Огонь: работа есть - топливо и огонь; нет - погасить (экономия топлива).
|
// 3. Огонь: работа есть - топливо и огонь; нет - погасить (экономия топлива).
|
||||||
foreach (Station st in stations)
|
foreach (Station st in stations)
|
||||||
{
|
{
|
||||||
@@ -516,7 +518,8 @@ namespace NecromancerTome
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>Сырьё для переплавки в unit_X: предмет из ящика «откуда», сделанный из этого материала, - во вход кузни.</summary>
|
/// <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;
|
_at = null;
|
||||||
string mat = _unit.Substring(5);
|
string mat = _unit.Substring(5);
|
||||||
@@ -546,6 +549,10 @@ namespace NecromancerTome
|
|||||||
{
|
{
|
||||||
bool empty = input[i] == null || input[i].IsEmpty();
|
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;
|
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)
|
if (room <= 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Reference in New Issue
Block a user