diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index 9e566755..6eb27c1f 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/CompMaintenancePod.cs b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/CompMaintenancePod.cs index ccb1671c..d552fad8 100644 --- a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/CompMaintenancePod.cs +++ b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/CompMaintenancePod.cs @@ -16,24 +16,24 @@ namespace WulaFallenEmpire public SoundDef exitSound; public EffecterDef operatingEffecter; - // 时间相关 - public int baseDurationTicks = 60000; // 基础维护时间(1天) - public float ticksPerNeedLevel = 120000f; // 每点需求降低需要的时间 + // 鏃堕棿鐩稿叧 + public int baseDurationTicks = 60000; // 鍩虹缁存姢鏃堕棿锛1澶╋級 + public float ticksPerNeedLevel = 120000f; // 姣忕偣闇姹傞檷浣庨渶瑕佺殑鏃堕棿 - // 电力消耗 + // 鐢靛姏娑堣 public float powerConsumptionRunning = 250f; public float powerConsumptionIdle = 50f; - // 组件消耗 + // 缁勪欢娑堣 public float componentCostPerNeedLevel = 2f; public int baseComponentCost = 1; - // 维护效果 - public float minNeedLevelToMaintain = 0.3f; // 低于此值才需要维护 - public float needLevelAfterCycle = 1.0f; // 维护后的需求水平 - public bool healInjuries = true; // 是否治疗损伤 - public bool healMissingParts = true; // 是否修复缺失部位 - public int maxInjuriesHealedPerCycle = 5; // 每次维护最多治疗的损伤数量 + // 缁存姢鏁堟灉 + public float minNeedLevelToMaintain = 0.3f; // 浣庝簬姝ゅ兼墠闇瑕佺淮鎶 + public float needLevelAfterCycle = 1.0f; // 缁存姢鍚庣殑闇姹傛按骞 + public bool healInjuries = true; // 鏄惁娌荤枟鎹熶激 + public bool healMissingParts = true; // 鏄惁淇缂哄け閮ㄤ綅 + public int maxInjuriesHealedPerCycle = 5; // 姣忔缁存姢鏈澶氭不鐤楃殑鎹熶激鏁伴噺 public CompProperties_MaintenancePod() { compClass = typeof(CompMaintenancePod); @@ -57,20 +57,18 @@ namespace WulaFallenEmpire public MaintenancePodState State => state; public Pawn Occupant => innerContainer.FirstOrDefault() as Pawn; public bool PowerOn => powerComp != null && powerComp.PowerOn; - public float RequiredComponents + public float RequiredComponents => GetRequiredComponentsFor(Occupant); + + public float GetRequiredComponentsFor(Pawn pawn) { - get - { - var occupant = Occupant; - if (occupant == null) return Props.baseComponentCost; + if (pawn == null) return Props.baseComponentCost; - var maintenanceNeed = occupant.needs?.TryGetNeed(); - if (maintenanceNeed == null) return Props.baseComponentCost; + var maintenanceNeed = pawn.needs?.TryGetNeed(); + if (maintenanceNeed == null) return Props.baseComponentCost; - // 计算基于当前需求水平的组件需求 - float needDeficit = 1.0f - maintenanceNeed.CurLevel; - return Props.baseComponentCost + (needDeficit * Props.componentCostPerNeedLevel); - } + // 璁$畻鍩轰簬褰撳墠闇姹傛按骞崇殑缁勪欢闇姹 + float needDeficit = 1.0f - maintenanceNeed.CurLevel; + return Props.baseComponentCost + (needDeficit * Props.componentCostPerNeedLevel); } public int RequiredDuration { @@ -82,7 +80,7 @@ namespace WulaFallenEmpire var maintenanceNeed = occupant.needs?.TryGetNeed(); if (maintenanceNeed == null) return Props.baseDurationTicks; - // 计算基于当前需求水平的维护时间 + // 璁$畻鍩轰簬褰撳墠闇姹傛按骞崇殑缁存姢鏃堕棿 float needDeficit = 1.0f - maintenanceNeed.CurLevel; return Props.baseDurationTicks + (int)(needDeficit * Props.ticksPerNeedLevel); } @@ -127,17 +125,17 @@ namespace WulaFallenEmpire { base.CompTick(); if (!parent.Spawned) return; - // 更新电力消耗 + // 鏇存柊鐢靛姏娑堣 if (powerComp != null) { powerComp.PowerOutput = -(state == MaintenancePodState.Running ? Props.powerConsumptionRunning : Props.powerConsumptionIdle); } - // 运行维护周期 + // 杩愯缁存姢鍛ㄦ湡 if (state == MaintenancePodState.Running && PowerOn) { ticksRemaining--; - // 更新效果器 + // 鏇存柊鏁堟灉鍣 if (Props.operatingEffecter != null) { if (operatingEffecter == null) @@ -160,29 +158,29 @@ namespace WulaFallenEmpire public void StartCycle(Pawn pawn) { if (pawn == null) return; - // 检查组件是否足够 + // 妫鏌ョ粍浠舵槸鍚﹁冻澶 float requiredComponents = RequiredComponents; if (refuelableComp.Fuel < requiredComponents) { Messages.Message("WULA_MaintenancePod_NotEnoughComponents".Translate(requiredComponents.ToString("F0")), MessageTypeDefOf.RejectInput); return; } - // 消耗组件 + // 娑堣楃粍浠 if (requiredComponents > 0) { refuelableComp.ConsumeFuel(requiredComponents); } - // 将 pawn 放入容器 + // 灏 pawn 鏀惧叆瀹瑰櫒 if (pawn.Spawned) { pawn.DeSpawn(DestroyMode.Vanish); } innerContainer.TryAddOrTransfer(pawn); - // 开始维护周期 + // 寮濮嬬淮鎶ゅ懆鏈 state = MaintenancePodState.Running; ticksRemaining = RequiredDuration; - // 播放进入音效 + // 鎾斁杩涘叆闊虫晥 if (Props.enterSound != null) { Props.enterSound.PlayOneShot(new TargetInfo(parent.Position, parent.Map)); @@ -197,10 +195,10 @@ namespace WulaFallenEmpire state = MaintenancePodState.Idle; return; } - // 执行维护效果 + // 鎵ц缁存姢鏁堟灉 PerformMaintenanceEffects(occupant); - // 弹出 pawn + // 寮瑰嚭 pawn EjectPawn(); Messages.Message("WULA_MaintenanceCycleComplete".Translate(occupant.LabelShortCap), MessageTypeDefOf.PositiveEvent); @@ -209,17 +207,17 @@ namespace WulaFallenEmpire { var maintenanceNeed = pawn.needs?.TryGetNeed(); - // 1. 恢复维护需求 + // 1. 鎭㈠缁存姢闇姹 if (maintenanceNeed != null) { maintenanceNeed.PerformMaintenance(Props.needLevelAfterCycle); } - // 2. 治疗损伤(如果启用) + // 2. 娌荤枟鎹熶激锛堝鏋滃惎鐢級 if (Props.healInjuries) { HealInjuries(pawn); } - // 3. 修复缺失部位(如果启用) + // 3. 淇缂哄け閮ㄤ綅锛堝鏋滃惎鐢級 if (Props.healMissingParts) { HealMissingParts(pawn); @@ -249,7 +247,7 @@ namespace WulaFallenEmpire int partsHealed = 0; foreach (var missingPart in missingParts) { - if (partsHealed >= 1) // 每次最多修复一个缺失部位 + if (partsHealed >= 1) // 姣忔鏈澶氫慨澶嶄竴涓己澶遍儴浣 break; pawn.health.RemoveHediff(missingPart); partsHealed++; @@ -264,15 +262,15 @@ namespace WulaFallenEmpire var occupant = Occupant; if (occupant != null) { - // 弹出到交互单元格 + // 寮瑰嚭鍒颁氦浜掑崟鍏冩牸 innerContainer.TryDropAll(parent.InteractionCell, parent.Map, ThingPlaceMode.Near); - // 播放退出音效 + // 鎾斁閫鍑洪煶鏁 if (Props.exitSound != null) { Props.exitSound.PlayOneShot(new TargetInfo(parent.Position, parent.Map)); } - // 如果被中断,应用负面效果 + // 濡傛灉琚腑鏂紝搴旂敤璐熼潰鏁堟灉 if (interrupted) { occupant.needs?.mood?.thoughts?.memories?.TryGainMemory(ThoughtDefOf.SoakingWet); @@ -281,7 +279,7 @@ namespace WulaFallenEmpire innerContainer.Clear(); state = MaintenancePodState.Idle; - // 清理效果器 + // 娓呯悊鏁堟灉鍣 if (operatingEffecter != null) { operatingEffecter.Cleanup(); @@ -300,7 +298,7 @@ namespace WulaFallenEmpire var maintenanceNeed = Occupant.needs?.TryGetNeed(); if (maintenanceNeed != null) { - // 直接显示 CurLevel,确保与 Need 显示一致 + // 鐩存帴鏄剧ず CurLevel锛岀‘淇濅笌 Need 鏄剧ず涓鑷 sb.AppendLine("WULA_MaintenanceLevel".Translate() + ": " + maintenanceNeed.CurLevel.ToStringPercent()); } } @@ -316,7 +314,7 @@ namespace WulaFallenEmpire { yield return gizmo; } - // 进入维护舱的按钮 + // 杩涘叆缁存姢鑸辩殑鎸夐挳 if (state == MaintenancePodState.Idle && PowerOn) { yield return new Command_Action @@ -327,7 +325,7 @@ namespace WulaFallenEmpire action = () => ShowPawnSelectionMenu() }; } - // 取消维护的按钮 + // 鍙栨秷缁存姢鐨勬寜閽 if (state == MaintenancePodState.Running) { yield return new Command_Action @@ -362,19 +360,19 @@ namespace WulaFallenEmpire foreach (var pawn in map.mapPawns.AllPawnsSpawned) { - // 首先检查是否有维护需求 + // 棣栧厛妫鏌ユ槸鍚︽湁缁存姢闇姹 var maintenanceNeed = pawn.needs?.TryGetNeed(); if (maintenanceNeed == null) { - // 这个Pawn没有维护需求,跳过 + // 杩欎釜Pawn娌℃湁缁存姢闇姹傦紝璺宠繃 continue; } - // 检查是否真的需要维护 + // 妫鏌ユ槸鍚︾湡鐨勯渶瑕佺淮鎶 if (maintenanceNeed.CurLevel > Props.minNeedLevelToMaintain && !DebugSettings.godMode) continue; - // 创建选项 + // 鍒涘缓閫夐」 var option = CreatePawnOption(pawn, maintenanceNeed); if (option != null) options.Add(option); @@ -387,12 +385,12 @@ namespace WulaFallenEmpire { string label = $"{pawn.LabelShortCap} ({need.CurLevel.ToStringPercent()})"; float requiredComponents = RequiredComponents; - // 检查组件是否足够 + // 妫鏌ョ粍浠舵槸鍚﹁冻澶 if (refuelableComp.Fuel < requiredComponents) { return new FloatMenuOption(label + " (" + "WULA_MaintenancePod_NotEnoughComponents".Translate(requiredComponents.ToString("F0")) + ")", null); } - // 检查是否可以到达 + // 妫鏌ユ槸鍚﹀彲浠ュ埌杈 if (!pawn.CanReach(parent, PathEndMode.InteractionCell, Danger.Deadly)) { return new FloatMenuOption(label + " (" + "CannotReach".Translate() + ")", null); @@ -401,7 +399,7 @@ namespace WulaFallenEmpire { if (pawn.Downed || !pawn.IsFreeColonist) { - // 需要搬运 + // 闇瑕佹惉杩 var haulJob = JobMaker.MakeJob(JobDefOf_WULA.WULA_HaulToMaintenancePod, pawn, parent); var hauler = FindBestHauler(pawn); if (hauler != null) @@ -415,7 +413,7 @@ namespace WulaFallenEmpire } else { - // 自己进入 + // 鑷繁杩涘叆 var enterJob = JobMaker.MakeJob(JobDefOf_WULA.WULA_EnterMaintenancePod, parent); pawn.jobs.TryTakeOrderedJob(enterJob); } diff --git a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/WorkGiver_DoMaintenance.cs b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/WorkGiver_DoMaintenance.cs index 563cb1d6..457e5648 100644 --- a/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/WorkGiver_DoMaintenance.cs +++ b/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/WorkGiver_DoMaintenance.cs @@ -22,6 +22,20 @@ namespace WulaFallenEmpire if (podComp == null || podComp.State != MaintenancePodState.Idle || !podComp.PowerOn) return false; + // 妫鏌ユ槸鍚︽湁瓒冲鐨勭噧鏂欙紙闆堕儴浠讹級 + // 濡傛灉鏄己鍒跺伐浣滐紙鐜╁鍙抽敭锛夛紝鎴戜滑鍏佽閫氳繃妫鏌ワ紝璁 JobDriver 鍘诲鐞嗭紙鍙兘浼氭彁绀虹噧鏂欎笉瓒筹級 + // 杩欐牱鐜╁鑳界煡閬撲负浠涔堜笉鑳藉伐浣滐紝鑰屼笉鏄粯榛樺け璐 + if (!forced) + { + float requiredFuel = podComp.GetRequiredComponentsFor(pawn); + var refuelable = t.TryGetComp(); + if (refuelable != null && refuelable.Fuel < requiredFuel) + { + JobFailReason.Is("WULA_MaintenancePod_NotEnoughComponents".Translate(requiredFuel.ToString("F0"))); + return false; + } + } + // 妫鏌ュ綋鍓峱awn鏄惁鏈夌淮鎶ら渶姹備笖闇瑕佺淮鎶 return PawnNeedsMaintenance(pawn); }