暂存
This commit is contained in:
@@ -5,11 +5,20 @@ using Verse.AI.Group;
|
||||
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
// 新的统一入口类
|
||||
public class PawnSpawnEntry
|
||||
{
|
||||
public PawnKindDef pawnKind;
|
||||
public int delayTicks = 0; // 默认延迟为0
|
||||
public ResearchProjectDef requiredResearch; // 可选的科技需求
|
||||
}
|
||||
|
||||
public class CompProperties_SpawnPawnFromList : CompProperties
|
||||
{
|
||||
public List<PawnKindDef> pawnKinds;
|
||||
// 合并后的新列表
|
||||
public List<PawnSpawnEntry> spawnablePawns;
|
||||
|
||||
public List<PawnKindDef> whitelist;
|
||||
public List<PawnKindDelay> pawnKindDelays;
|
||||
public bool destroyOnSpawn = false;
|
||||
public IntRange spawnCount = new IntRange(1, 1);
|
||||
public Type lordJob;
|
||||
@@ -32,10 +41,4 @@ namespace ArachnaeSwarm
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class PawnKindDelay
|
||||
{
|
||||
public PawnKindDef pawnKind;
|
||||
public int delay;
|
||||
}
|
||||
@@ -13,14 +13,14 @@ namespace ArachnaeSwarm
|
||||
|
||||
private int spawnUntilTick = -1;
|
||||
private PawnKindDef spawningPawnKind;
|
||||
private PawnKindDef selectedPawnKind;
|
||||
private PawnSpawnEntry selectedEntry;
|
||||
public bool IsHatching => spawnUntilTick > 0;
|
||||
|
||||
|
||||
public override IEnumerable<FloatMenuOption> CompFloatMenuOptions(Pawn selPawn)
|
||||
{
|
||||
if (spawnUntilTick > 0)
|
||||
{
|
||||
yield break; // 正在延迟中,不显示菜单
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (Props.whitelist == null || !Props.whitelist.Contains(selPawn.kindDef))
|
||||
@@ -28,16 +28,29 @@ namespace ArachnaeSwarm
|
||||
yield break;
|
||||
}
|
||||
|
||||
if (Props.pawnKinds != null)
|
||||
if (Props.spawnablePawns != null)
|
||||
{
|
||||
foreach (PawnKindDef pawnKind in Props.pawnKinds)
|
||||
foreach (PawnSpawnEntry entry in Props.spawnablePawns)
|
||||
{
|
||||
yield return new FloatMenuOption("ARA_Incubate".Translate(pawnKind.label), () =>
|
||||
if (entry.pawnKind == null) continue;
|
||||
|
||||
// 检查科技需求
|
||||
if (entry.requiredResearch != null && !entry.requiredResearch.IsFinished)
|
||||
{
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_IncubateJob"), parent);
|
||||
selectedPawnKind = pawnKind;
|
||||
selPawn.jobs.TryTakeOrderedJob(job);
|
||||
});
|
||||
// 科技未完成,显示灰色不可点击选项
|
||||
string disabledText = "ARA_Incubate".Translate(entry.pawnKind.label) + " (" + "Requires".Translate() + ": " + entry.requiredResearch.label + ")";
|
||||
yield return new FloatMenuOption(disabledText, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 科技已完成或无需求,显示正常选项
|
||||
yield return new FloatMenuOption("ARA_Incubate".Translate(entry.pawnKind.label), () =>
|
||||
{
|
||||
Job job = JobMaker.MakeJob(DefDatabase<JobDef>.GetNamed("ARA_IncubateJob"), parent);
|
||||
this.selectedEntry = entry; // 保存整个入口信息
|
||||
selPawn.jobs.TryTakeOrderedJob(job);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -45,9 +58,10 @@ namespace ArachnaeSwarm
|
||||
|
||||
public void StartIncubation()
|
||||
{
|
||||
spawningPawnKind = selectedPawnKind;
|
||||
int delay = Props.pawnKindDelays?.FirstOrDefault(pkd => pkd.pawnKind == selectedPawnKind)?.delay ?? 0;
|
||||
spawnUntilTick = Find.TickManager.TicksGame + delay;
|
||||
if (this.selectedEntry == null) return;
|
||||
|
||||
spawningPawnKind = this.selectedEntry.pawnKind;
|
||||
spawnUntilTick = Find.TickManager.TicksGame + this.selectedEntry.delayTicks;
|
||||
}
|
||||
|
||||
public override void CompTick()
|
||||
@@ -147,7 +161,7 @@ namespace ArachnaeSwarm
|
||||
base.PostExposeData();
|
||||
Scribe_Values.Look(ref spawnUntilTick, "spawnUntilTick", -1);
|
||||
Scribe_Defs.Look(ref spawningPawnKind, "spawningPawnKind");
|
||||
Scribe_Defs.Look(ref selectedPawnKind, "selectedPawnKind");
|
||||
// selectedEntry is transient and does not need to be saved.
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user