修维护仓囚犯问题

This commit is contained in:
2025-08-16 09:01:57 +08:00
parent d058de9e6b
commit eed43cc6ff
2 changed files with 46 additions and 36 deletions

View File

@@ -353,63 +353,73 @@ namespace WulaFallenEmpire
private List<FloatMenuOption> GetPawnOptions() private List<FloatMenuOption> GetPawnOptions()
{ {
List<FloatMenuOption> options = new List<FloatMenuOption>(); List<FloatMenuOption> options = new List<FloatMenuOption>();
foreach (Pawn p in parent.Map.mapPawns.FreeColonists.Where(pawn => pawn.def.defName == "WulaSpecies" || pawn.def.defName == "WulaSpeciesReal")) // Now iterates over all pawns on the map, not just colonists.
foreach (Pawn p in parent.Map.mapPawns.AllPawns.Where(pawn => pawn.def.defName == "WulaSpecies" || pawn.def.defName == "WulaSpeciesReal"))
{ {
if (p.health.hediffSet.HasHediff(Props.hediffToRemove)) if (p.health.hediffSet.HasHediff(Props.hediffToRemove))
{ {
if (!p.CanReach(parent, PathEndMode.InteractionCell, Danger.Deadly)) // If the pawn is downed or not a free colonist, they need to be brought to the pod.
{ if (p.Downed || !p.IsFreeColonist)
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "CannotReach".Translate() + ")", null));
}
else if (p.Downed)
{ {
float required = RequiredComponents(p); float required = RequiredComponents(p);
if (refuelableComp.Fuel < required) if (refuelableComp.Fuel < required)
{ {
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "Incapacitated".Translate() + ", " + "WULA_MaintenancePod_NotEnoughComponents".Translate(required.ToString("F0")) + ")", null)); options.Add(new FloatMenuOption(p.LabelShortCap + " (" + p.KindLabel + ", " + "WULA_MaintenancePod_NotEnoughComponents".Translate(required.ToString("F0")) + ")", null));
} }
else else
{ {
Action action = delegate // Find colonists who can haul the pawn.
var potentialHaulers = parent.Map.mapPawns.FreeColonistsSpawned.Where(colonist =>
!colonist.Downed && colonist.CanReserveAndReach(p, PathEndMode.OnCell, Danger.Deadly) && colonist.CanReserveAndReach(parent, PathEndMode.InteractionCell, Danger.Deadly));
if (!potentialHaulers.Any())
{ {
var potentialRescuers = parent.Map.mapPawns.FreeColonistsSpawned.Where(colonist => // If no one can haul, then it's unreachable.
!colonist.Downed && colonist.CanReserveAndReach(p, PathEndMode.OnCell, Danger.Deadly) && colonist.CanReserveAndReach(parent, PathEndMode.InteractionCell, Danger.Deadly)); options.Add(new FloatMenuOption(p.LabelShortCap + " (" + p.KindLabel + ", " + "CannotReach".Translate() + ")", null));
}
if (!potentialRescuers.Any()) else
{
Action action = delegate
{ {
Messages.Message("WULA_MaintenancePod_NoRescuer".Translate(p.Named("PAWN")), MessageTypeDefOf.RejectInput); // Create a menu to select which colonist should do the hauling.
return; var haulerOptions = new List<FloatMenuOption>();
} foreach (var hauler in potentialHaulers)
var rescuerOptions = new List<FloatMenuOption>();
foreach (var rescuer in potentialRescuers)
{
rescuerOptions.Add(new FloatMenuOption(rescuer.LabelCap, delegate
{ {
var haulJob = JobMaker.MakeJob(JobDefOf_WULA.WULA_HaulToMaintenancePod, p, parent); haulerOptions.Add(new FloatMenuOption(hauler.LabelCap, delegate
haulJob.count = 1; {
rescuer.jobs.TryTakeOrderedJob(haulJob, JobTag.Misc); var haulJob = JobMaker.MakeJob(JobDefOf_WULA.WULA_HaulToMaintenancePod, p, parent);
})); haulJob.count = 1;
} hauler.jobs.TryTakeOrderedJob(haulJob, JobTag.Misc);
Find.WindowStack.Add(new FloatMenu(rescuerOptions)); }));
}; }
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "Incapacitated".Translate() + ")", action)); Find.WindowStack.Add(new FloatMenu(haulerOptions));
};
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + p.KindLabel + ")", action));
}
} }
} }
// If the pawn is a free colonist and can walk, they can go on their own.
else else
{ {
float required = RequiredComponents(p); if (!p.CanReach(parent, PathEndMode.InteractionCell, Danger.Deadly))
if (refuelableComp.Fuel >= required)
{ {
options.Add(new FloatMenuOption(p.LabelShortCap, () => options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "CannotReach".Translate() + ")", null));
{
Job job = JobMaker.MakeJob(JobDefOf_WULA.WULA_EnterMaintenancePod, parent);
p.jobs.TryTakeOrderedJob(job, JobTag.Misc);
}));
} }
else else
{ {
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "WULA_MaintenancePod_NotEnoughComponents".Translate(required.ToString("F0")) + ")", null)); float required = RequiredComponents(p);
if (refuelableComp.Fuel >= required)
{
options.Add(new FloatMenuOption(p.LabelShortCap, () =>
{
Job job = JobMaker.MakeJob(JobDefOf_WULA.WULA_EnterMaintenancePod, parent);
p.jobs.TryTakeOrderedJob(job, JobTag.Misc);
}));
}
else
{
options.Add(new FloatMenuOption(p.LabelShortCap + " (" + "WULA_MaintenancePod_NotEnoughComponents".Translate(required.ToString("F0")) + ")", null));
}
} }
} }
} }