Рабочий: делает по образцу без счёта - пока есть ингредиенты и место для готового; описание на 13 языках
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
322dc952d3
commit
8a5f4fa0e3
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ namespace NecromancerTome
|
||||
{
|
||||
/// <summary>
|
||||
/// Работа духа урны рабочего (18.10.2026, BACKLOG «Урна рабочего»): изготовить предмет из ячейки образца, пока его в запасе
|
||||
/// меньше, чем в стопке образца. Решения 17.10: нити ящик -> урна - откуда ингредиенты и топливо, урна -> станция - где
|
||||
/// меньше, чем в стопке образца (23.10 - без счёта: пока хватает ресурсов и есть куда класть). Решения 17.10: нити ящик -> урна - откуда ингредиенты и топливо, урна -> станция - где
|
||||
/// изготавливать, урна -> ящик - куда готовое (нет такой нити - готовое остаётся в выходе станции, выход полон - станция
|
||||
/// гаснет); только прямые рецепты (цепочки - несколько урн); качество 1; топливо - костру, химстанции, кузне, и станция
|
||||
/// гасится, когда делать нечего (верстаку, ступке, бетономешалке топливо не нужно). Изготавливает сама станция игры: дух
|
||||
@@ -106,9 +106,20 @@ namespace NecromancerTome
|
||||
}
|
||||
}
|
||||
|
||||
// 2. Изготовить, если запаса мало.
|
||||
// 2. Изготовить. 23.10, пользователь: «Рабочий должен делать бесконечное количество по образцу. Я положил 1 цемент,
|
||||
// а его задача наделать цемента столько, сколько возможно с учётом текущего количества ресурсов» - образец задаёт что,
|
||||
// не сколько (было: пока запас меньше стопки образца). Стоп - нет ингредиентов или готовое класть некуда.
|
||||
EntityPlayer owner = OwnerPlayer(_world, _urn);
|
||||
if (hasSample && Stock(sample, stations, outs) < sample.count)
|
||||
bool outRoom = false;
|
||||
foreach ((Vector3i p, TEFeatureStorage box) o in outs)
|
||||
{
|
||||
if (CinerariumWork.Fits(o.box, sample))
|
||||
{
|
||||
outRoom = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (hasSample)
|
||||
{
|
||||
string name = sample.itemValue.ItemClass?.GetItemName();
|
||||
foreach (Station st in stations)
|
||||
@@ -118,9 +129,9 @@ namespace NecromancerTome
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!OutputHasRoom(st.Te, sample) && outs.Count == 0)
|
||||
if (!OutputHasRoom(st.Te, sample) && !outRoom)
|
||||
{
|
||||
continue; // выход полон, класть некуда - ниже станция погаснет
|
||||
continue; // выход полон и ящики «куда» полны (или их нет) - ниже станция погаснет
|
||||
}
|
||||
foreach (Recipe r in CraftingManager.GetRecipes(name))
|
||||
{
|
||||
@@ -164,7 +175,7 @@ namespace NecromancerTome
|
||||
continue;
|
||||
}
|
||||
bool busy = st.Te.hasRecipeInQueue() || RawInInput(st.Te);
|
||||
bool full = hasSample && !OutputHasRoom(st.Te, sample) && outs.Count == 0;
|
||||
bool full = hasSample && !OutputHasRoom(st.Te, sample) && !outRoom;
|
||||
if (busy && !full)
|
||||
{
|
||||
if (st.Te.BurnTotalTimeLeft <= 0f)
|
||||
@@ -264,42 +275,6 @@ namespace NecromancerTome
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/// <summary>Запас: в ящиках «куда», в выходе станций и в их очередях.</summary>
|
||||
static int Stock(ItemStack _sample, List<Station> _stations, List<(Vector3i p, TEFeatureStorage box)> _outs)
|
||||
{
|
||||
int type = _sample.itemValue.type;
|
||||
int n = 0;
|
||||
foreach ((Vector3i p, TEFeatureStorage box) o in _outs)
|
||||
{
|
||||
foreach (ItemStack s in o.box.ItemGrid.items)
|
||||
{
|
||||
if (s != null && !s.IsEmpty() && s.itemValue.type == type)
|
||||
{
|
||||
n += s.count;
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Station st in _stations)
|
||||
{
|
||||
foreach (ItemStack s in st.Te.Output)
|
||||
{
|
||||
if (s != null && !s.IsEmpty() && s.itemValue.type == type)
|
||||
{
|
||||
n += s.count;
|
||||
}
|
||||
}
|
||||
foreach (RecipeQueueItem q in st.Te.Queue)
|
||||
{
|
||||
if (q != null && q.Recipe != null && q.Multiplier > 0 && q.Recipe.itemValueType == type)
|
||||
{
|
||||
n += q.Multiplier * q.Recipe.count;
|
||||
}
|
||||
}
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
/// <summary>Свободная ячейка очереди: самая близкая к работающей (последней).</summary>
|
||||
static int FreeQueueSlot(TileEntityWorkstation _te)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user