diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 9311a00..426b9e4 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/JobDefs/ARA_Jobs.xml b/1.6/1.6/Defs/JobDefs/ARA_Jobs.xml new file mode 100644 index 0000000..d75811e --- /dev/null +++ b/1.6/1.6/Defs/JobDefs/ARA_Jobs.xml @@ -0,0 +1,10 @@ + + + + + ARA_IncubateJob + ArachnaeSwarm.JobDriver_Incubate + incubating TargetA. + + + \ No newline at end of file diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml index f5c49aa..8ba7ec0 100644 --- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml @@ -2,5 +2,6 @@ 孵化 {0} + 未孵化,需要阿拉克涅女皇种交互 \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 06bdd65..943fcf2 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -70,6 +70,7 @@ + diff --git a/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs b/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs index 14ae742..efef87f 100644 --- a/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs +++ b/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs @@ -11,6 +11,7 @@ namespace ArachnaeSwarm public List whitelist; public int delay = 0; public bool destroyOnSpawn = false; + public IntRange spawnCount = new IntRange(1, 1); public Type lordJob; public CompProperties_SpawnPawnFromList() diff --git a/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs b/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs index d12c483..07027e4 100644 --- a/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs +++ b/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs @@ -1,16 +1,18 @@ using System.Collections.Generic; using Verse; using RimWorld; +using Verse.AI; using Verse.AI.Group; namespace ArachnaeSwarm { public class CompSpawnPawnFromList : ThingComp { - private CompProperties_SpawnPawnFromList Props => (CompProperties_SpawnPawnFromList)props; + public CompProperties_SpawnPawnFromList Props => (CompProperties_SpawnPawnFromList)props; private int spawnUntilTick = -1; private PawnKindDef spawningPawnKind; + private PawnKindDef selectedPawnKind; public override IEnumerable CompFloatMenuOptions(Pawn selPawn) { @@ -30,15 +32,17 @@ namespace ArachnaeSwarm { yield return new FloatMenuOption("ARA_Incubate".Translate(pawnKind.label), () => { - StartDelayedSpawn(pawnKind); + Job job = JobMaker.MakeJob(DefDatabase.GetNamed("ARA_IncubateJob"), parent); + selectedPawnKind = pawnKind; + selPawn.jobs.TryTakeOrderedJob(job); }); } } } - private void StartDelayedSpawn(PawnKindDef pawnKind) + public void StartIncubation() { - spawningPawnKind = pawnKind; + spawningPawnKind = selectedPawnKind; spawnUntilTick = Find.TickManager.TicksGame + Props.delay; } @@ -115,9 +119,16 @@ namespace ArachnaeSwarm if (spawnUntilTick > 0) { int remainingTicks = spawnUntilTick - Find.TickManager.TicksGame; - return $"Spawning in: {remainingTicks.ToStringTicksToPeriod()}"; + if (remainingTicks > 0) + { + return "Spawning {0} in: {1}".Translate(spawningPawnKind.label, remainingTicks.ToStringTicksToPeriod()); + } } - return base.CompInspectStringExtra(); + else + { + return "ARA_NeedsInteraction".Translate(); + } + return null; } public override void PostExposeData() diff --git a/Source/ArachnaeSwarm/JobDriver_Incubate.cs b/Source/ArachnaeSwarm/JobDriver_Incubate.cs new file mode 100644 index 0000000..4dfaf70 --- /dev/null +++ b/Source/ArachnaeSwarm/JobDriver_Incubate.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using Verse; +using Verse.AI; + +namespace ArachnaeSwarm +{ + public class JobDriver_Incubate : JobDriver + { + private const TargetIndex EggSacInd = TargetIndex.A; + private const TargetIndex PawnKindInd = TargetIndex.B; + + public override bool TryMakePreToilReservations(bool errorOnFailed) + { + return pawn.Reserve(job.GetTarget(EggSacInd), job, 1, -1, null, errorOnFailed); + } + + protected override IEnumerable MakeNewToils() + { + this.FailOnDespawnedNullOrForbidden(EggSacInd); + + yield return Toils_Goto.GotoThing(EggSacInd, PathEndMode.Touch); + + Toil incubate = new Toil(); + incubate.initAction = () => + { + CompSpawnPawnFromList comp = job.GetTarget(EggSacInd).Thing.TryGetComp(); + if (comp != null) + { + comp.StartIncubation(); + } + }; + incubate.defaultCompleteMode = ToilCompleteMode.Instant; + yield return incubate; + } + } +} \ No newline at end of file