This commit is contained in:
2025-08-14 16:30:38 +08:00
parent 0e0a952b0f
commit acb5dcebc0
4 changed files with 63 additions and 60 deletions

View File

@@ -269,6 +269,7 @@
<ThingDef ParentName="BasicBedBase"> <ThingDef ParentName="BasicBedBase">
<defName>WULA_Charging_Station_Synth</defName> <defName>WULA_Charging_Station_Synth</defName>
<thingClass>Building_Bed</thingClass> <thingClass>Building_Bed</thingClass>
<tickerType>Normal</tickerType>
<label>合成人修复站</label> <label>合成人修复站</label>
<description>一台供乌拉帝国合成人进行机体修复的检修站。</description> <description>一台供乌拉帝国合成人进行机体修复的检修站。</description>
<graphicData> <graphicData>

View File

@@ -25,41 +25,71 @@ namespace WulaFallenEmpire
{ {
base.CompTick(); base.CompTick();
var bed = (Building_Bed)parent; var bed = (Building_Bed)parent;
var occupants = new HashSet<Pawn>(bed.CurOccupants); var powerComp = parent.GetComp<CompPowerTrader>();
// 如果床没电,停止所有充电
if (powerComp is { PowerOn: false })
{
StopAllCharging();
return;
}
var currentOccupants = new HashSet<Pawn>(bed.CurOccupants);
// 移除已经不在床上的 pawn 的充电效果
for (int i = chargingPawns.Count - 1; i >= 0; i--) for (int i = chargingPawns.Count - 1; i >= 0; i--)
{ {
var pawn = chargingPawns[i]; var pawn = chargingPawns[i];
if (!occupants.Contains(pawn)) if (!currentOccupants.Contains(pawn))
{ {
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef); StopCharging(pawn);
if (hediff != null)
{
pawn.health.RemoveHediff(hediff);
}
chargingPawns.RemoveAt(i); 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) StartCharging(pawn);
{
if (!pawn.health.hediffSet.HasHediff(Props.hediffDef))
{
pawn.health.AddHediff(Props.hediffDef);
if (!chargingPawns.Contains(pawn))
{
chargingPawns.Add(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() public override void PostExposeData()
{ {
base.PostExposeData(); base.PostExposeData();

View File

@@ -14,52 +14,24 @@ namespace WulaFallenEmpire
protected override IEnumerable<Toil> MakeNewToils() protected override IEnumerable<Toil> MakeNewToils()
{ {
this.AddFinishAction(jobCondition =>
{
var bed = (Building_Bed)job.targetA.Thing;
var comp = bed.GetComp<CompChargingBed>();
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); yield return Toils_Bed.GotoBed(TargetIndex.A);
Toil layDownAndCharge = Toils_LayDown.LayDown(TargetIndex.A, true, false, false, false); 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<CompChargingBed>();
if (comp != null && !pawn.health.hediffSet.HasHediff(comp.Props.hediffDef))
{
pawn.health.AddHediff(comp.Props.hediffDef);
}
}
});
layDownAndCharge.tickAction = delegate layDownAndCharge.tickAction = delegate
{ {
if (pawn.IsHashIntervalTick(60)) var bed = (Building_Bed)job.targetA.Thing;
var powerComp = bed.GetComp<CompPowerTrader>();
if (powerComp is { PowerOn: false })
{ {
var bed = (Building_Bed)job.targetA.Thing; EndJobWith(JobCondition.Incompletable);
var powerComp = bed.GetComp<CompPowerTrader>(); return;
}
if (powerComp != null && !powerComp.PowerOn)
{ var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
EndJobWith(JobCondition.Incompletable); if (energyNeed != null && energyNeed.CurLevelPercentage >= 1f)
return; {
} EndJobWith(JobCondition.Succeeded);
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed != null && energyNeed.CurLevelPercentage >= 0.99f)
{
EndJobWith(JobCondition.Succeeded);
}
} }
}; };