This commit is contained in:
2025-09-08 13:50:21 +08:00
parent 341d6d1da7
commit 8cf1ec75b2
7 changed files with 299 additions and 277 deletions

View File

@@ -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;
}

View File

@@ -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.
}
}
}