diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll index a55bd7d4..b354fac0 100644 Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml index 31025ccc..52fab635 100644 --- a/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml +++ b/1.6/1.6/Defs/ThingDefs_Buildings/Buildings_WULA.xml @@ -269,6 +269,7 @@ WULA_Charging_Station_Synth Building_Bed + Normal 一台供乌拉帝国合成人进行机体修复的检修站。 diff --git a/Source/WulaFallenEmpire/CompChargingBed.cs b/Source/WulaFallenEmpire/CompChargingBed.cs index fab3111a..303e714e 100644 --- a/Source/WulaFallenEmpire/CompChargingBed.cs +++ b/Source/WulaFallenEmpire/CompChargingBed.cs @@ -25,41 +25,71 @@ namespace WulaFallenEmpire { base.CompTick(); var bed = (Building_Bed)parent; - var occupants = new HashSet(bed.CurOccupants); + var powerComp = parent.GetComp(); + // 如果床没电,停止所有充电 + if (powerComp is { PowerOn: false }) + { + StopAllCharging(); + return; + } + + var currentOccupants = new HashSet(bed.CurOccupants); + + // 移除已经不在床上的 pawn 的充电效果 for (int i = chargingPawns.Count - 1; i >= 0; i--) { var pawn = chargingPawns[i]; - if (!occupants.Contains(pawn)) + if (!currentOccupants.Contains(pawn)) { - var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef); - if (hediff != null) - { - pawn.health.RemoveHediff(hediff); - } + StopCharging(pawn); chargingPawns.RemoveAt(i); } } - if (bed.AnyOccupants) + // 为床上的新 pawn 开始充电 + foreach (var pawn in currentOccupants) { - foreach (var pawn in bed.CurOccupants) + if (ShouldCharge(pawn) && !chargingPawns.Contains(pawn)) { - if (pawn.def.defName == Props.raceDefName) - { - if (!pawn.health.hediffSet.HasHediff(Props.hediffDef)) - { - pawn.health.AddHediff(Props.hediffDef); - if (!chargingPawns.Contains(pawn)) - { - chargingPawns.Add(pawn); - } - } - } + StartCharging(pawn); } } } + private bool ShouldCharge(Pawn pawn) + { + return pawn.def.defName == Props.raceDefName; + } + + private void StartCharging(Pawn pawn) + { + if (pawn.health.hediffSet.HasHediff(Props.hediffDef)) return; + pawn.health.AddHediff(Props.hediffDef); + if (!chargingPawns.Contains(pawn)) + { + chargingPawns.Add(pawn); + } + } + + private void StopCharging(Pawn pawn) + { + var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef); + if (hediff != null) + { + pawn.health.RemoveHediff(hediff); + } + } + + private void StopAllCharging() + { + for (int i = chargingPawns.Count - 1; i >= 0; i--) + { + StopCharging(chargingPawns[i]); + chargingPawns.RemoveAt(i); + } + } + public override void PostExposeData() { base.PostExposeData(); diff --git a/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs b/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs index 0f6e5b6d..6561bf37 100644 --- a/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs +++ b/Source/WulaFallenEmpire/JobDriver_WulaLayDownToCharge.cs @@ -14,52 +14,24 @@ namespace WulaFallenEmpire protected override IEnumerable MakeNewToils() { - this.AddFinishAction(jobCondition => - { - var bed = (Building_Bed)job.targetA.Thing; - var comp = bed.GetComp(); - if (comp == null) return; - var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(comp.Props.hediffDef); - if (hediff != null) - { - pawn.health.RemoveHediff(hediff); - } - }); - yield return Toils_Bed.GotoBed(TargetIndex.A); Toil layDownAndCharge = Toils_LayDown.LayDown(TargetIndex.A, true, false, false, false); - layDownAndCharge.AddPreInitAction(delegate - { - if (!pawn.health.hediffSet.HasHediff(HediffDef.Named("WULA_ChargingHediff"))) - { - var bed = (Building_Bed)job.targetA.Thing; - var comp = bed.GetComp(); - if (comp != null && !pawn.health.hediffSet.HasHediff(comp.Props.hediffDef)) - { - pawn.health.AddHediff(comp.Props.hediffDef); - } - } - }); - layDownAndCharge.tickAction = delegate { - if (pawn.IsHashIntervalTick(60)) + var bed = (Building_Bed)job.targetA.Thing; + var powerComp = bed.GetComp(); + + if (powerComp is { PowerOn: false }) { - var bed = (Building_Bed)job.targetA.Thing; - var powerComp = bed.GetComp(); - - if (powerComp != null && !powerComp.PowerOn) - { - EndJobWith(JobCondition.Incompletable); - return; - } - - Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed(); - if (energyNeed != null && energyNeed.CurLevelPercentage >= 0.99f) - { - EndJobWith(JobCondition.Succeeded); - } + EndJobWith(JobCondition.Incompletable); + return; + } + + var energyNeed = pawn.needs.TryGetNeed(); + if (energyNeed != null && energyNeed.CurLevelPercentage >= 1f) + { + EndJobWith(JobCondition.Succeeded); } };