diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 1565622..cbb52f7 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 bc46b46..a00d02d 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.pdb and b/1.6/1.6/Assemblies/ArachnaeSwarm.pdb differ diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ARA_QueuedIncubator.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ARA_QueuedIncubator.xml new file mode 100644 index 0000000..76daf5d --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ARA_QueuedIncubator.xml @@ -0,0 +1,68 @@ + + + + 手动 + 品质 + 平衡 + 速度 + + + 队列已满! + 已有幼虫正在工作中,请等待完成 + 没有需要激活的订单 + 未找到可用的幼虫! + 已呼叫幼虫 + 幼虫无法接受任务 + 没有可用的孵化选项(检查 CompIncubatorData 配置) + 没有可生产的物品(检查建筑是否正确配置) + + + 传奇 + 杰作 + 优秀 + 良好 + 普通 + 较差 + + + 等待中 + 等待幼虫 + + + 订单: {0} / {1} + 等待幼虫: {0} 正在孵化: {1} + 等待幼虫: {0} 正在生产: {1} + + + 添加订单 ({0}/{1}) + 选择要孵化的单位类型(可多次点击) + 选择要生产的物品(可多次点击) + 呼叫幼虫 + 呼叫一只幼虫来激活下一个订单(还有{0}个等待中) + 幼虫工作中 + 一只幼虫正在操作孵化器(还有{0}个订单等待) + + + 选择孵化目标 + 选择生产目标 + 需要研究: {0} + {0}天 + + + 选择孵化目标... + 选择生产目标... + (满) + 就绪 - 点击上方选择目标 + 等待幼虫激活 + + + 【未选择目标】 + 点击上方标题选择孵化目标 + 点击上方标题选择生产目标 + 【就绪】 + 目标: + 孵化时间: {0} 天 + + + 可制作: {0} 份 + diff --git a/Source/ArachnaeSwarm/Building_Comps/ARA_CompInteractiveProducer/CompQueuedInteractiveProducerWithFlux.cs b/Source/ArachnaeSwarm/Building_Comps/ARA_CompInteractiveProducer/CompQueuedInteractiveProducerWithFlux.cs index b21af57..e25e34c 100644 --- a/Source/ArachnaeSwarm/Building_Comps/ARA_CompInteractiveProducer/CompQueuedInteractiveProducerWithFlux.cs +++ b/Source/ArachnaeSwarm/Building_Comps/ARA_CompInteractiveProducer/CompQueuedInteractiveProducerWithFlux.cs @@ -66,6 +66,9 @@ namespace ArachnaeSwarm // === 幼虫管理 === private List assignedLarvae = new List(); + + // === UI 状态(供 Gizmo 使用,不保存) === + public float GizmoScrollPosition = 0f; // === 组件引用 === private CompRefuelableNutrition _fuelComp; @@ -98,10 +101,10 @@ namespace ArachnaeSwarm public void CycleFluxMode() => fluxMode = (FluxMode)(((int)fluxMode + 1) % 4); public string GetModeName() => fluxMode switch { - FluxMode.Manual => "手动", - FluxMode.Quality => "品质", - FluxMode.Balance => "平衡", - FluxMode.Speed => "速度", + FluxMode.Manual => "ARA_FluxMode_Manual".Translate(), + FluxMode.Quality => "ARA_FluxMode_Quality".Translate(), + FluxMode.Balance => "ARA_FluxMode_Balance".Translate(), + FluxMode.Speed => "ARA_FluxMode_Speed".Translate(), _ => "?" }; @@ -135,7 +138,7 @@ namespace ArachnaeSwarm { if (orders.Count >= Props.productionQueueLimit) { - Messages.Message("队列已满!", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_QueueFull".Translate(), MessageTypeDefOf.RejectInput); return; } orders.Add(new QueuedItemOrder { process = process, status = OrderStatus.WaitingForLarva }); @@ -187,13 +190,13 @@ namespace ArachnaeSwarm { if (assignedLarvae.Count > 0) { - Messages.Message("已有幼虫正在工作中,请等待完成", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_LarvaWorking".Translate(), MessageTypeDefOf.RejectInput); return; } if (WaitingForLarvaCount <= 0) { - Messages.Message("没有需要激活的订单", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoOrderToActivate".Translate(), MessageTypeDefOf.RejectInput); return; } @@ -206,7 +209,7 @@ namespace ArachnaeSwarm if (larva == null) { if (showMessage) - Messages.Message("未找到可用的幼虫!", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoLarvaFound".Translate(), MessageTypeDefOf.RejectInput); return false; } @@ -215,13 +218,13 @@ namespace ArachnaeSwarm { assignedLarvae.Add(larva); if (showMessage) - Messages.Message("已呼叫幼虫", MessageTypeDefOf.PositiveEvent); + Messages.Message("ARA_Msg_LarvaCalled".Translate(), MessageTypeDefOf.PositiveEvent); return true; } else { if (showMessage) - Messages.Message("幼虫无法接受任务", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_LarvaCannotAccept".Translate(), MessageTypeDefOf.RejectInput); return false; } } @@ -391,8 +394,8 @@ namespace ArachnaeSwarm public override string CompInspectStringExtra() { StringBuilder sb = new StringBuilder(); - sb.AppendLine($"订单: {orders.Count} / {Props.productionQueueLimit}"); - sb.AppendLine($"等待幼虫: {WaitingForLarvaCount} 正在生产: {IncubatingCount}"); + sb.AppendLine("ARA_Inspect_Orders".Translate(orders.Count, Props.productionQueueLimit)); + sb.AppendLine("ARA_Inspect_WaitingAndProducing".Translate(WaitingForLarvaCount, IncubatingCount)); return sb.ToString().TrimEnd(); } @@ -408,8 +411,8 @@ namespace ArachnaeSwarm { yield return new Command_Action { - defaultLabel = $"添加订单 ({orders.Count}/{Props.productionQueueLimit})", - defaultDesc = "选择要生产的物品(可多次点击)", + defaultLabel = "ARA_Gizmo_AddOrder".Translate(orders.Count, Props.productionQueueLimit), + defaultDesc = "ARA_Gizmo_AddOrderDesc_Item".Translate(), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_NodeSwarmIcon", false), action = ShowOrderMenu }; @@ -420,8 +423,8 @@ namespace ArachnaeSwarm { yield return new Command_Action { - defaultLabel = "呼叫幼虫", - defaultDesc = $"呼叫一只幼虫来激活下一个订单(还有{WaitingForLarvaCount}个等待中)", + defaultLabel = "ARA_Gizmo_CallLarva".Translate(), + defaultDesc = "ARA_Gizmo_CallLarvaDesc".Translate(WaitingForLarvaCount), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_CallLarva", false), action = CallLarvae }; @@ -430,8 +433,8 @@ namespace ArachnaeSwarm { yield return new Command_Action { - defaultLabel = "幼虫工作中", - defaultDesc = $"一只幼虫正在操作孵化器(还有{WaitingForLarvaCount}个订单等待)", + defaultLabel = "ARA_Gizmo_LarvaWorking".Translate(), + defaultDesc = "ARA_Gizmo_LarvaWorkingDesc".Translate(WaitingForLarvaCount), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_CallLarva", false), Disabled = true }; @@ -450,14 +453,14 @@ namespace ArachnaeSwarm if (process.requiredResearch != null && !process.requiredResearch.IsFinished) { - label += $" (需要研究: {process.requiredResearch.LabelCap})"; + label += " (" + "ARA_Menu_RequiresResearch".Translate(process.requiredResearch.LabelCap) + ")"; options.Add(new FloatMenuOption(label, null, icon, Color.white)); } else { var capturedProcess = process; float days = capturedProcess.productionTicks / 60000f; - label += $" ({days:F1}天)"; + label += " (" + "ARA_Menu_Days".Translate(days.ToString("F1")) + ")"; options.Add(new FloatMenuOption(label, () => { AddOrder(capturedProcess); if (orders.Count < Props.productionQueueLimit) ShowOrderMenu(); @@ -466,9 +469,9 @@ namespace ArachnaeSwarm } if (options.Count > 0) - Find.WindowStack.Add(new FloatMenu(options, "选择生产目标")); + Find.WindowStack.Add(new FloatMenu(options, "ARA_Menu_SelectProductionTarget".Translate())); else - Messages.Message("没有可生产的物品(检查建筑是否正确配置)", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoProducibleItems".Translate(), MessageTypeDefOf.RejectInput); } private void BuildProcessList() diff --git a/Source/ArachnaeSwarm/Building_Comps/ARA_SpawnPawnFromList/CompQueuedPawnSpawnerWithFlux.cs b/Source/ArachnaeSwarm/Building_Comps/ARA_SpawnPawnFromList/CompQueuedPawnSpawnerWithFlux.cs index eaf4fad..7e98a46 100644 --- a/Source/ArachnaeSwarm/Building_Comps/ARA_SpawnPawnFromList/CompQueuedPawnSpawnerWithFlux.cs +++ b/Source/ArachnaeSwarm/Building_Comps/ARA_SpawnPawnFromList/CompQueuedPawnSpawnerWithFlux.cs @@ -79,6 +79,10 @@ namespace ArachnaeSwarm // === 幼虫管理 === private List assignedLarvae = new List(); + + // === UI 状态(供 Gizmo 使用,不保存) === + public float GizmoScrollPosition = 0f; + public string LarvaStatusText = null; // 幼虫状态文本 // === 组件引用 === private CompRefuelableNutrition _fuelComp; @@ -106,10 +110,10 @@ namespace ArachnaeSwarm public void CycleFluxMode() => fluxMode = (FluxMode)(((int)fluxMode + 1) % 4); public string GetModeName() => fluxMode switch { - FluxMode.Manual => "手动", - FluxMode.Quality => "品质", - FluxMode.Balance => "平衡", - FluxMode.Speed => "速度", + FluxMode.Manual => "ARA_FluxMode_Manual".Translate(), + FluxMode.Quality => "ARA_FluxMode_Quality".Translate(), + FluxMode.Balance => "ARA_FluxMode_Balance".Translate(), + FluxMode.Speed => "ARA_FluxMode_Speed".Translate(), _ => "?" }; @@ -134,7 +138,7 @@ namespace ArachnaeSwarm { if (orders.Count >= Props.productionQueueLimit) { - Messages.Message("队列已满!", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_QueueFull".Translate(), MessageTypeDefOf.RejectInput); return; } orders.Add(new QueuedPawnOrder { config = config, status = OrderStatus.WaitingForLarva }); @@ -161,7 +165,7 @@ namespace ArachnaeSwarm qualityProgress = order.QualityPercent, remainingTime = order.status == OrderStatus.Incubating ? ((int)GetRemainingTicks(order)).ToStringTicksToPeriod() - : "等待中", + : "ARA_Status_Waiting".Translate(), estimatedQuality = GetEstimatedQuality(order.QualityPercent) }); } @@ -185,12 +189,12 @@ namespace ArachnaeSwarm private string GetEstimatedQuality(float qualityPercent) { - if (qualityPercent >= 0.99f) return "传奇"; - if (qualityPercent >= 0.90f) return "杰作"; - if (qualityPercent >= 0.70f) return "优秀"; - if (qualityPercent >= 0.50f) return "良好"; - if (qualityPercent >= 0.20f) return "普通"; - return "较差"; + if (qualityPercent >= 0.99f) return "ARA_Quality_Legendary".Translate(); + if (qualityPercent >= 0.90f) return "ARA_Quality_Masterwork".Translate(); + if (qualityPercent >= 0.70f) return "ARA_Quality_Excellent".Translate(); + if (qualityPercent >= 0.50f) return "ARA_Quality_Good".Translate(); + if (qualityPercent >= 0.20f) return "ARA_Quality_Normal".Translate(); + return "ARA_Quality_Poor".Translate(); } // === 幼虫激活逻辑 === @@ -200,13 +204,13 @@ namespace ArachnaeSwarm // 检查是否已有幼虫在工作/路上 if (assignedLarvae.Count > 0) { - Messages.Message("已有幼虫正在工作中,请等待完成", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_LarvaWorking".Translate(), MessageTypeDefOf.RejectInput); return; } if (WaitingForLarvaCount <= 0) { - Messages.Message("没有需要激活的订单", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoOrderToActivate".Translate(), MessageTypeDefOf.RejectInput); return; } @@ -221,7 +225,7 @@ namespace ArachnaeSwarm if (larva == null) { if (showMessage) - Messages.Message("未找到可用的幼虫!", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoLarvaFound".Translate(), MessageTypeDefOf.RejectInput); return false; } @@ -230,13 +234,13 @@ namespace ArachnaeSwarm { assignedLarvae.Add(larva); if (showMessage) - Messages.Message("已呼叫幼虫", MessageTypeDefOf.PositiveEvent); + Messages.Message("ARA_Msg_LarvaCalled".Translate(), MessageTypeDefOf.PositiveEvent); return true; } else { if (showMessage) - Messages.Message("幼虫无法接受任务", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_LarvaCannotAccept".Translate(), MessageTypeDefOf.RejectInput); return false; } } @@ -409,8 +413,8 @@ namespace ArachnaeSwarm public override string CompInspectStringExtra() { StringBuilder sb = new StringBuilder(); - sb.AppendLine($"订单: {orders.Count} / {Props.productionQueueLimit}"); - sb.AppendLine($"等待幼虫: {WaitingForLarvaCount} 正在孵化: {IncubatingCount}"); + sb.AppendLine("ARA_Inspect_Orders".Translate(orders.Count, Props.productionQueueLimit)); + sb.AppendLine("ARA_Inspect_WaitingAndIncubating".Translate(WaitingForLarvaCount, IncubatingCount)); return sb.ToString().TrimEnd(); } @@ -426,8 +430,8 @@ namespace ArachnaeSwarm { yield return new Command_Action { - defaultLabel = $"添加订单 ({orders.Count}/{Props.productionQueueLimit})", - defaultDesc = "选择要孵化的单位类型(可多次点击)", + defaultLabel = "ARA_Gizmo_AddOrder".Translate(orders.Count, Props.productionQueueLimit), + defaultDesc = "ARA_Gizmo_AddOrderDesc_Pawn".Translate(), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_NodeSwarmIcon", false), action = ShowOrderMenu }; @@ -438,8 +442,8 @@ namespace ArachnaeSwarm { yield return new Command_Action { - defaultLabel = $"呼叫幼虫", - defaultDesc = $"呼叫一只幼虫来激活下一个订单(还有{WaitingForLarvaCount}个等待中)", + defaultLabel = "ARA_Gizmo_CallLarva".Translate(), + defaultDesc = "ARA_Gizmo_CallLarvaDesc".Translate(WaitingForLarvaCount), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_CallLarva", false), action = CallLarvae }; @@ -449,8 +453,8 @@ namespace ArachnaeSwarm // 显示幼虫正在工作的状态 yield return new Command_Action { - defaultLabel = "幼虫工作中", - defaultDesc = $"一只幼虫正在操作孵化器(还有{WaitingForLarvaCount}个订单等待)", + defaultLabel = "ARA_Gizmo_LarvaWorking".Translate(), + defaultDesc = "ARA_Gizmo_LarvaWorkingDesc".Translate(WaitingForLarvaCount), icon = ContentFinder.Get("ArachnaeSwarm/UI/Commands/ARA_CallLarva", false), Disabled = true }; @@ -471,7 +475,7 @@ namespace ArachnaeSwarm if (config.requiredResearch != null && !config.requiredResearch.IsFinished) { options.Add(new FloatMenuOption( - config.pawnKind.LabelCap + " (需要研究: " + config.requiredResearch.LabelCap + ")", + config.pawnKind.LabelCap + " (" + "ARA_Menu_RequiresResearch".Translate(config.requiredResearch.LabelCap) + ")", null )); } @@ -490,9 +494,9 @@ namespace ArachnaeSwarm } if (options.Count > 0) - Find.WindowStack.Add(new FloatMenu(options, "选择孵化目标")); + Find.WindowStack.Add(new FloatMenu(options, "ARA_Menu_SelectIncubationTarget".Translate())); else - Messages.Message("没有可用的孵化选项(检查 CompIncubatorData 配置)", MessageTypeDefOf.RejectInput); + Messages.Message("ARA_Msg_NoIncubationOptions".Translate(), MessageTypeDefOf.RejectInput); } public override void PostExposeData() diff --git a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_DualProgressBar.cs b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_DualProgressBar.cs index adef01e..8b91156 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_DualProgressBar.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_DualProgressBar.cs @@ -23,7 +23,7 @@ namespace ArachnaeSwarm private static readonly Texture2D EmptyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.1f, 0.1f, 0.1f, 0.5f)); private readonly CompQueuedInteractiveProducerWithFlux comp; - private float scrollPosition = 0f; + // scrollPosition 现在存储在 comp 中以在刷新间保持 public Gizmo_DualProgressBar(CompQueuedInteractiveProducerWithFlux comp) { @@ -107,17 +107,17 @@ namespace ArachnaeSwarm { Rect scrollbarRect = new Rect(innerRect.xMax - scrollbarWidth, curY, scrollbarWidth, listHeight); float scrollMax = totalContentHeight - listHeight; - scrollPosition = GUI.VerticalScrollbar(scrollbarRect, scrollPosition, listHeight, 0f, totalContentHeight); + comp.GizmoScrollPosition = GUI.VerticalScrollbar(scrollbarRect, comp.GizmoScrollPosition, listHeight, 0f, totalContentHeight); if (Mouse.IsOver(listRect)) { - scrollPosition -= Event.current.delta.y * 1.5f; - scrollPosition = Mathf.Clamp(scrollPosition, 0f, scrollMax); + comp.GizmoScrollPosition -= Event.current.delta.y * 1.5f; + comp.GizmoScrollPosition = Mathf.Clamp(comp.GizmoScrollPosition, 0f, scrollMax); } } GUI.BeginClip(listRect); - float drawY = -scrollPosition; + float drawY = -comp.GizmoScrollPosition; for (int i = 0; i < orderCount; i++) { diff --git a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_PawnProgressBar.cs b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_PawnProgressBar.cs index 3219c06..4695eaa 100644 --- a/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_PawnProgressBar.cs +++ b/Source/ArachnaeSwarm/Buildings/Building_Ootheca/Gizmo_PawnProgressBar.cs @@ -23,7 +23,7 @@ namespace ArachnaeSwarm private static readonly Texture2D EmptyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.1f, 0.1f, 0.1f, 0.5f)); private readonly CompQueuedPawnSpawnerWithFlux comp; - private float scrollPosition = 0f; + // scrollPosition 现在存储在 comp 中以在刷新间保持 public Gizmo_PawnProgressBar(CompQueuedPawnSpawnerWithFlux comp) { @@ -65,7 +65,7 @@ namespace ArachnaeSwarm } else { - title = "选择孵化目标..."; + title = "ARA_Gizmo_SelectIncubationTarget".Translate(); } // 标题按钮 @@ -89,7 +89,7 @@ namespace ArachnaeSwarm else { GUI.color = new Color(0.5f, 0.5f, 0.5f); - Widgets.Label(titleRect, title.Truncate(titleRect.width) + " (满)"); + Widgets.Label(titleRect, title.Truncate(titleRect.width) + " " + "ARA_Gizmo_QueueFull".Translate()); GUI.color = Color.white; } curY += Text.LineHeight + Spacing; @@ -111,18 +111,18 @@ namespace ArachnaeSwarm { Rect scrollbarRect = new Rect(innerRect.xMax - scrollbarWidth, curY, scrollbarWidth, listHeight); float scrollMax = totalContentHeight - listHeight; - scrollPosition = GUI.VerticalScrollbar(scrollbarRect, scrollPosition, listHeight, 0f, totalContentHeight); + comp.GizmoScrollPosition = GUI.VerticalScrollbar(scrollbarRect, comp.GizmoScrollPosition, listHeight, 0f, totalContentHeight); // 也支持滚轮 if (Mouse.IsOver(listRect)) { - scrollPosition -= Event.current.delta.y * 1.5f; - scrollPosition = Mathf.Clamp(scrollPosition, 0f, scrollMax); + comp.GizmoScrollPosition -= Event.current.delta.y * 1.5f; + comp.GizmoScrollPosition = Mathf.Clamp(comp.GizmoScrollPosition, 0f, scrollMax); } } GUI.BeginClip(listRect); - float drawY = -scrollPosition; + float drawY = -comp.GizmoScrollPosition; for (int i = 0; i < orderCount; i++) {