This commit is contained in:
2026-02-06 17:32:09 +08:00
2 changed files with 59 additions and 21 deletions

Binary file not shown.

View File

@@ -44,7 +44,29 @@ namespace ArachnaeSwarm
public ResearchProjectDef StoredResearch => storedResearch;
public float Progress => progress;
public bool IsLocked => storedResearch != null;
public bool IsLocked
{
get
{
// 如果没有存储科技,则未锁定
if (storedResearch == null)
return false;
// 如果科技尚未完成,则锁定
if (!storedResearch.IsFinished)
return true;
// 检查是否还有其他试验卵存储同一科技
int otherBuildingsCount = manager?.GetBuildingCountForResearch(storedResearch) ?? 0;
// 如果还有其他试验卵存储同一科技,则允许解锁
if (otherBuildingsCount > 1)
return false;
// 否则,保持锁定
return true;
}
}
public bool IsResearching => isResearching && storedResearch != null && !storedResearch.IsFinished;
// 获取研究速度
@@ -118,22 +140,25 @@ namespace ArachnaeSwarm
protected override void Tick()
{
base.Tick();
// 如果没有储存科技或者科技已完成,不进行研究
if (storedResearch == null || storedResearch.IsFinished)
{
isResearching = false;
return;
}
// 同步本地进度到全局进度(确保进度条显示一致)
progress = Find.ResearchManager.GetProgress(storedResearch);
// 检查电力
bool hasPower = powerComp == null || powerComp.PowerOn;
// 如果正在研究且有储存的科技,则增加进度
if (hasPower && isResearching)
{
float speed = ResearchSpeed;
// 应用电力效率
if (powerComp != null && powerComp.PowerNet != null)
{
@@ -149,7 +174,7 @@ namespace ArachnaeSwarm
}
}
}
// 增加进度
AddResearchProgress(speed / 60f);
}
@@ -158,25 +183,26 @@ namespace ArachnaeSwarm
private void AddResearchProgress(float amount)
{
if (storedResearch == null || storedResearch.IsFinished) return;
progress += amount;
// 获取全局进度
float globalProgress = Find.ResearchManager.GetProgress(storedResearch);
// 同步本地进度到全局进度
progress = globalProgress;
// 检查科技是否已完成
if (!storedResearch.IsFinished && progress >= storedResearch.baseCost)
{
// 完成科技
Find.ResearchManager.AddProgress(storedResearch, storedResearch.baseCost - globalProgress);
// 停止研究
isResearching = false;
// 发送消息
Messages.Message("ResearchBlueprintReader_ResearchCompleted".Translate(storedResearch.LabelCap),
MessageTypeDefOf.PositiveEvent);
ArachnaeLog.Debug($"[ResearchBlueprintReader] Research completed: {storedResearch.defName}");
}
else
@@ -187,6 +213,8 @@ namespace ArachnaeSwarm
if (toAdd > 0)
{
Find.ResearchManager.AddProgress(storedResearch, toAdd);
// 更新本地进度以反映全局变化
progress = Find.ResearchManager.GetProgress(storedResearch);
}
}
}
@@ -196,37 +224,47 @@ namespace ArachnaeSwarm
/// </summary>
public void StartResearch(ResearchProjectDef project)
{
// 如果已经锁定且无法解锁,则返回
if (IsLocked)
{
Messages.Message("ResearchBlueprintReader_LockedBuilding".Translate(),
Messages.Message("ResearchBlueprintReader_LockedBuilding".Translate(),
MessageTypeDefOf.RejectInput);
return;
}
// 如果当前已存储一个已完成的科技,需要先从管理器中移除
if (storedResearch != null && storedResearch.IsFinished)
{
if (manager != null)
{
manager.OnBuildingDestroyed(this, storedResearch);
}
}
if (project == null || project.IsFinished || project.techprintCount <= 0)
return;
// 检查前置条件
if (!AreAllPrerequisitesCompleted(project))
{
Messages.Message("ResearchBlueprintReader_PrerequisitesNotMet".Translate(),
Messages.Message("ResearchBlueprintReader_PrerequisitesNotMet".Translate(),
MessageTypeDefOf.RejectInput);
return;
}
// 立即绑定科技
storedResearch = project;
progress = Find.ResearchManager.GetProgress(project);
isResearching = true;
researchStartTime = Find.TickManager.TicksGame;
// 通知管理器
if (manager != null)
{
manager.RegisterResearch(this, project);
}
Messages.Message("ResearchBlueprintReader_ResearchStarted".Translate(project.LabelCap),
Messages.Message("ResearchBlueprintReader_ResearchStarted".Translate(project.LabelCap),
MessageTypeDefOf.NeutralEvent);
}