1
This commit is contained in:
120
Source/WulaFallenEmpire/GlobalWorkTable/GlobalProductionOrder.cs
Normal file
120
Source/WulaFallenEmpire/GlobalWorkTable/GlobalProductionOrder.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
// GlobalProductionOrder.cs (修复版)
|
||||
using RimWorld;
|
||||
using System.Collections.Generic;
|
||||
using Verse;
|
||||
|
||||
namespace WulaFallenEmpire
|
||||
{
|
||||
public class GlobalProductionOrder : IExposable
|
||||
{
|
||||
public RecipeDef recipe;
|
||||
public int targetCount = 1;
|
||||
public int currentCount = 0;
|
||||
public bool paused = true; // 初始状态为暂停
|
||||
public float progress = 0f;
|
||||
|
||||
// 生产状态
|
||||
public ProductionState state = ProductionState.Waiting;
|
||||
|
||||
public enum ProductionState
|
||||
{
|
||||
Waiting, // 等待资源
|
||||
Producing, // 生产中
|
||||
Completed // 完成
|
||||
}
|
||||
|
||||
public void ExposeData()
|
||||
{
|
||||
Scribe_Defs.Look(ref recipe, "recipe");
|
||||
Scribe_Values.Look(ref targetCount, "targetCount", 1);
|
||||
Scribe_Values.Look(ref currentCount, "currentCount", 0);
|
||||
Scribe_Values.Look(ref paused, "paused", true);
|
||||
Scribe_Values.Look(ref progress, "progress", 0f);
|
||||
Scribe_Values.Look(ref state, "state", ProductionState.Waiting);
|
||||
}
|
||||
|
||||
public string Label => recipe.LabelCap;
|
||||
public string Description => $"{currentCount}/{targetCount} {recipe.products[0].thingDef.label}";
|
||||
|
||||
// 检查是否有足够资源 - 修复逻辑,只检查costList
|
||||
public bool HasEnoughResources()
|
||||
{
|
||||
var globalStorage = Find.World.GetComponent<GlobalStorageWorldComponent>();
|
||||
if (globalStorage == null)
|
||||
{
|
||||
Log.Warning("GlobalStorageWorldComponent not found");
|
||||
return false;
|
||||
}
|
||||
|
||||
// 只检查costList,不检查ingredients
|
||||
if (recipe.costList != null && recipe.costList.Count > 0)
|
||||
{
|
||||
foreach (var cost in recipe.costList)
|
||||
{
|
||||
int required = cost.count;
|
||||
int available = globalStorage.GetInputStorageCount(cost.thingDef);
|
||||
|
||||
Log.Message($"[DEBUG] Checking {cost.thingDef.defName}: required={required}, available={available}");
|
||||
|
||||
if (available < required)
|
||||
{
|
||||
Log.Message($"[DEBUG] Insufficient {cost.thingDef.defName}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Log.Message("[DEBUG] All resources available");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning($"Recipe {recipe.defName} has no costList");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// 消耗资源 - 修复逻辑,只消耗costList
|
||||
public bool ConsumeResources()
|
||||
{
|
||||
var globalStorage = Find.World.GetComponent<GlobalStorageWorldComponent>();
|
||||
if (globalStorage == null) return false;
|
||||
|
||||
// 只消耗costList中的资源
|
||||
if (recipe.costList != null)
|
||||
{
|
||||
foreach (var cost in recipe.costList)
|
||||
{
|
||||
if (!globalStorage.RemoveFromInputStorage(cost.thingDef, cost.count))
|
||||
{
|
||||
Log.Warning($"Failed to consume {cost.count} {cost.thingDef.defName}");
|
||||
return false;
|
||||
}
|
||||
Log.Message($"[DEBUG] Consumed {cost.count} {cost.thingDef.defName}");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// 生产一个产品
|
||||
public void Produce()
|
||||
{
|
||||
var globalStorage = Find.World.GetComponent<GlobalStorageWorldComponent>();
|
||||
if (globalStorage == null) return;
|
||||
|
||||
foreach (var product in recipe.products)
|
||||
{
|
||||
globalStorage.AddToOutputStorage(product.thingDef, product.count);
|
||||
Log.Message($"[DEBUG] Produced {product.count} {product.thingDef.defName}");
|
||||
}
|
||||
|
||||
currentCount++;
|
||||
progress = 0f;
|
||||
|
||||
if (currentCount >= targetCount)
|
||||
{
|
||||
state = ProductionState.Completed;
|
||||
Log.Message("[DEBUG] Order completed");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user