好像这一版终于行了 修充电床

This commit is contained in:
2025-08-14 21:36:00 +08:00
parent fcd1e6b0b4
commit 11b9caacab
8 changed files with 71 additions and 63 deletions

View File

@@ -30,11 +30,4 @@
<casualInterruptible>false</casualInterruptible>
</JobDef>
<JobDef>
<defName>WULA_LayDownToCharge</defName>
<driverClass>WulaFallenEmpire.JobDriver_WulaLayDownToCharge</driverClass>
<reportString>正在充电</reportString>
<casualInterruptible>false</casualInterruptible>
</JobDef>
</Defs>

View File

@@ -265,21 +265,30 @@
<emergency>true</emergency>
</li>
<!-- Get Wula energy (only if starving) -->
<li Class="ThinkNode_ConditionalNeedPercentageAbove">
<need>WULA_Energy</need>
<threshold>0.5</threshold> <!-- 能量低于10%时触发 -->
<invert>true</invert>
<!-- Satisfy Needs -->
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<subNodes>
<li Class="ThinkNode_Tagger">
<tagToGive>SatisfyingNeeds</tagToGive>
<li Class="ThinkNode_PrioritySorter">
<subNodes>
<li Class="JobGiver_Autofeed" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="WulaFallenEmpire.JobGiver_WulaGetEnergy">
<leaveJoinableLordIfIssuesJob>true</leaveJoinableLordIfIssuesJob>
<minEnergyLevelPercentage>0.3</minEnergyLevelPercentage>
<maxEnergyLevelPercentage>0.9</maxEnergyLevelPercentage>
<maxEnergyLevelPercentage>1.0</maxEnergyLevelPercentage>
<emergencyPriority>9.5</emergencyPriority>
</li>
<li Class="JobGiver_SatisfyChemicalNeed"/>
<li Class="JobGiver_SatifyChemicalDependency" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="JobGiver_GetHemogen" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="JobGiver_GetDeathrest" MayRequire="Ludeon.RimWorld.Biotech" />
<li Class="ThinkNode_Priority_GetJoy">
<subNodes>
<li Class="JobGiver_GetJoy"/>
<li Class="JobGiver_GetJoyInBed"/>
</subNodes>
</li>
<li Class="JobGiver_Meditate"/>
</subNodes>
</li>
</subNodes>

View File

@@ -24,7 +24,6 @@ namespace WulaFallenEmpire
public override void CompTick()
{
base.CompTick();
Log.Message("[CompChargingBed] CompTick running.");
var bed = (Building_Bed)parent;
var powerComp = parent.GetComp<CompPowerTrader>();
@@ -74,6 +73,7 @@ namespace WulaFallenEmpire
}
}
private void StopCharging(Pawn pawn)
{
var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);

View File

@@ -1,41 +0,0 @@
using RimWorld;
using System.Collections.Generic;
using Verse;
using Verse.AI;
namespace WulaFallenEmpire
{
public class JobDriver_WulaLayDownToCharge : JobDriver
{
public override bool TryMakePreToilReservations(bool errorOnFailed)
{
return pawn.Reserve(job.targetA, job, 1, -1, null, errorOnFailed);
}
protected override IEnumerable<Toil> MakeNewToils()
{
yield return Toils_Bed.GotoBed(TargetIndex.A);
Toil layDownAndCharge = Toils_LayDown.LayDown(TargetIndex.A, true, false, false, false);
layDownAndCharge.tickAction = delegate
{
var bed = (Building_Bed)job.targetA.Thing;
var powerComp = bed.GetComp<CompPowerTrader>();
if (powerComp is { PowerOn: false })
{
EndJobWith(JobCondition.Incompletable);
return;
}
var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed != null && energyNeed.CurLevelPercentage >= 1f)
{
EndJobWith(JobCondition.Succeeded);
}
};
yield return layDownAndCharge;
}
}
}

View File

@@ -8,38 +8,72 @@ namespace WulaFallenEmpire
public class JobGiver_WulaGetEnergy : ThinkNode_JobGiver
{
public float minEnergyLevelPercentage = 0.3f;
public float maxEnergyLevelPercentage = 0.9f;
public float maxEnergyLevelPercentage = 1.0f;
public float emergencyPriority = 9.5f;
public override float GetPriority(Pawn pawn)
{
var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed == null || energyNeed.CurLevelPercentage >= minEnergyLevelPercentage)
if (energyNeed == null)
{
return 0f;
}
return 9.5f;
// 如果能量已充满,则不需要充电
if (energyNeed.CurLevel >= energyNeed.MaxLevel)
{
return 0f;
}
// 如果Pawn正在执行充电Job并且能量尚未充满则保持高优先级
if ((pawn.CurJobDef == JobDefOf.LayDown ||
pawn.CurJobDef == DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy")) &&
energyNeed.CurLevel < energyNeed.MaxLevel)
{
return emergencyPriority; // 保持高优先级,直到充满
}
// 如果能量低于阈值,则需要充电
if (energyNeed.CurLevelPercentage < minEnergyLevelPercentage)
{
return emergencyPriority;
}
return 0f; // 否则不需要充电返回0
}
protected override Job TryGiveJob(Pawn pawn)
{
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob called for {pawn.Name.ToStringShort}.");
var energyNeed = pawn.needs.TryGetNeed<Need_WulaEnergy>();
if (energyNeed == null || energyNeed.CurLevelPercentage >= maxEnergyLevelPercentage)
if (energyNeed == null)
{
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob for {pawn.Name.ToStringShort}: EnergyNeed is null. Returning null.");
return null;
}
if (energyNeed.CurLevelPercentage >= maxEnergyLevelPercentage)
{
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob for {pawn.Name.ToStringShort}: CurLevelPercentage ({energyNeed.CurLevelPercentage:F3}) >= maxEnergyLevelPercentage ({maxEnergyLevelPercentage:F3}). Returning null.");
return null;
}
if (!TryFindBestEnergySourceFor(pawn, out var energySource))
{
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob for {pawn.Name.ToStringShort}: No best energy source found. Returning null.");
return null;
}
if (energySource is Building_Bed)
{
return JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_LayDownToCharge"), energySource);
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob for {pawn.Name.ToStringShort}: Assigning LayDown job to {energySource.Label}.");
return JobMaker.MakeJob(JobDefOf.LayDown, energySource);
}
var job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("WULA_IngestWulaEnergy"), energySource);
job.count = 1;
Log.Message($"[JobGiver_WulaGetEnergy] TryGiveJob for {pawn.Name.ToStringShort}: Assigning WULA_IngestWulaEnergy job to {energySource.Label}.");
return job;
}

View File

@@ -0,0 +1,13 @@
using Verse;
namespace WulaFallenEmpire
{
[StaticConstructorOnStartup]
public static class StartupLogger
{
static StartupLogger()
{
Log.Message("WulaFallenEmpire Mod DLL, version 1.0.2, has been loaded.");
}
}
}

View File

@@ -104,7 +104,6 @@
<Compile Include="JobDriver_EnterMaintenancePod.cs" />
<Compile Include="JobDriver_HaulToMaintenancePod.cs" />
<Compile Include="JobDriver_IngestWulaEnergy.cs" />
<Compile Include="JobDriver_WulaLayDownToCharge.cs" />
<Compile Include="JobGiver_WulaGetEnergy.cs" />
<Compile Include="JobGiver_WulaPackEnergy.cs" />
<Compile Include="Job_Maintenance.cs" />
@@ -151,6 +150,7 @@
<Compile Include="HediffComp_DamageResponse.cs" />
<Compile Include="JobDefOf_WULA.cs" />
<Compile Include="ThingDefOf_WULA.cs" />
<Compile Include="StartupLogger.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 自定义清理任务删除obj文件夹中的临时文件 -->