diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 399b41d..f94b6b1 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.pdb b/1.6/1.6/Assemblies/ArachnaeSwarm.pdb index 24ba3af..c797b84 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.pdb and b/1.6/1.6/Assemblies/ArachnaeSwarm.pdb differ diff --git a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs index 384b63d..722424a 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_ResearchBlueprintReader/Building_ResearchBlueprintReader.cs @@ -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 /// 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); }