diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
new file mode 100644
index 0000000..cf6106b
Binary files /dev/null and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ
diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
index d36756e..d83cc24 100644
--- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
+++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml
@@ -3,8 +3,8 @@
ARA_EggSpew
-
- Launch an egg sac and a spray of acidic sludge at the target area. The sludge will stick to targets and burn them.
+
+ 向目标区域发射一个卵囊和酸性污泥喷射。污泥会粘在目标上并灼烧它们。
UI/Commands/EggSpew
5000
true
@@ -34,7 +34,7 @@
ARA_Proj_StrongSludgeSpray
-
+
Projectile_Liquid
Projectile
Normal
@@ -64,7 +64,7 @@
ARA_Proj_EggSac
-
+
Projectile_SpawnsThing
Things/Projectile/EggSac
diff --git a/1.6/1.6/Defs/BackstoryDefs/BackstoryDef.xml b/1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml
similarity index 100%
rename from 1.6/1.6/Defs/BackstoryDefs/BackstoryDef.xml
rename to 1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml
diff --git a/1.6/1.6/Defs/LifeStageDefs/LifeStages.xml b/1.6/1.6/Defs/LifeStageDefs/ARA_LifeStages.xml
similarity index 100%
rename from 1.6/1.6/Defs/LifeStageDefs/LifeStages.xml
rename to 1.6/1.6/Defs/LifeStageDefs/ARA_LifeStages.xml
diff --git a/1.6/1.6/Defs/Thing_building/ARA_Eggs.xml b/1.6/1.6/Defs/Thing_building/ARA_Eggs.xml
new file mode 100644
index 0000000..5f50972
--- /dev/null
+++ b/1.6/1.6/Defs/Thing_building/ARA_Eggs.xml
@@ -0,0 +1,49 @@
+
+
+
+
+ ARA_EggSac
+
+ 一个黏滑的囊状物,内含昆虫幼虫。幼虫的孕育过程会产生微弱的生物荧光。
+ Building
+ Building
+
+ Things/Building/EggSac
+ Graphic_Random
+
+ Building
+ PassThroughOnly
+ 0.3
+ false
+ Light
+
+ 20
+ 0.4
+ -6
+
+
+ true
+ false
+ false
+ false
+ true
+ true
+ false
+
+
+
+ 6
+ (113,141,117,0)
+
+
+ CompSpawnLarva
+ Larva
+ LordJob_WanderNest
+
+
+ CocoonDestroyed
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj
new file mode 100644
index 0000000..f6a8da1
--- /dev/null
+++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj
@@ -0,0 +1,79 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {EAE0DB6B-E282-C812-7F5A-6D13E9D24581}
+ Library
+ Properties
+ ArachnaeSwarm
+ ArachnaeSwarm
+ v4.8
+ 512
+ true
+ 11.0
+
+
+ false
+ none
+ false
+ ..\..\1.6\1.6\Assemblies\
+ DEBUG;TRACE
+ prompt
+ 4
+ Off
+ .allowedextension
+
+
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+
+
+
+ ..\..\..\..\..\..\workshop\content\294100\2009463077\1.5\Assemblies\0Harmony.dll
+ False
+
+
+ ..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\Assembly-CSharp.dll
+ False
+
+
+
+
+
+
+
+
+
+
+ ..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.dll
+ False
+
+
+ ..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.CoreModule.dll
+ False
+
+
+ ..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.IMGUIModule.dll
+ False
+
+
+ ..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll
+ False
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Source/ArachnaeSwarm/SpawnPawnFromList_Design.md b/Source/ArachnaeSwarm/SpawnPawnFromList_Design.md
new file mode 100644
index 0000000..17685af
--- /dev/null
+++ b/Source/ArachnaeSwarm/SpawnPawnFromList_Design.md
@@ -0,0 +1,180 @@
+# CompSpawnPawnFromList 功能设计文档
+
+## 1. 功能概述
+
+`CompSpawnPawnFromList` 是一个 `ThingComp` 组件,它允许一个特定的 Pawn 通过右键菜单与一个物体交互,从一个可配置的列表中选择一个 Pawn,并在经过一段可配置的延迟后,生成这个 Pawn。在延迟期间,剩余时间会显示在建筑的检查面板上。可以选择在生成 Pawn 后是否摧毁建筑。
+
+## 2. XML 配置
+
+### 2.1. 配置属性
+
+* `pawnKinds` (`List`): 一个 `PawnKindDef` 的列表,用于填充右键菜单的选项。
+* `whitelist` (`List`): 一个 `PawnKindDef` 的白名单,只有在这个列表中的 Pawn 才能看到并使用这个右键菜单。
+* `delay` (`int`): 延迟时间,单位为 Ticks (1秒 = 60 Ticks)。
+* `destroyOnSpawn` (`bool`): (可选, 默认为 `false`) 如果为 `true`,则在生成 Pawn 后摧毁建筑。
+* `lordJob` (`Type`): (可选) 生成的 Pawn 要执行的集体任务。
+
+### 2.2. XML 示例
+
+```xml
+
+ ARA_PawnSpawner
+
+ A device that can be used to spawn pawns after a delay.
+
+
+
+
+ Megascarab
+ Spelopede
+
+
+ Colonist
+
+ 300
+ true
+ RimWorld.LordJob_AssaultColony
+
+
+
+```
+
+## 3. 类设计
+
+### 3.1. `CompProperties_SpawnPawnFromList.cs`
+
+```csharp
+using System;
+using System.Collections.Generic;
+using Verse;
+
+namespace ArachnaeSwarm
+{
+ public class CompProperties_SpawnPawnFromList : CompProperties
+ {
+ public List pawnKinds;
+ public List whitelist;
+ public int delay = 0;
+ public bool destroyOnSpawn = false;
+ public Type lordJob;
+
+ public CompProperties_SpawnPawnFromList()
+ {
+ compClass = typeof(CompSpawnPawnFromList);
+ }
+
+ public override IEnumerable ConfigErrors(ThingDef parentDef)
+ {
+ foreach (string item in base.ConfigErrors(parentDef))
+ {
+ yield return item;
+ }
+ if (lordJob != null && !typeof(RimWorld.LordJob).IsAssignableFrom(lordJob))
+ {
+ yield return $"lordJob {lordJob} must be of type LordJob";
+ }
+ }
+ }
+}
+```
+
+### 3.2. `CompSpawnPawnFromList.cs`
+
+```csharp
+using System.Collections.Generic;
+using Verse;
+using RimWorld;
+
+namespace ArachnaeSwarm
+{
+ public class CompSpawnPawnFromList : ThingComp
+ {
+ private CompProperties_SpawnPawnFromList Props => (CompProperties_SpawnPawnFromList)props;
+
+ private int spawnUntilTick = -1;
+ private PawnKindDef spawningPawnKind;
+
+ public override IEnumerable CompFloatMenuOptions(Pawn selPawn)
+ {
+ if (spawnUntilTick > 0)
+ {
+ yield break; // 正在延迟中,不显示菜单
+ }
+
+ if (Props.whitelist == null || !Props.whitelist.Contains(selPawn.kindDef))
+ {
+ yield break;
+ }
+
+ if (Props.pawnKinds != null)
+ {
+ foreach (PawnKindDef pawnKind in Props.pawnKinds)
+ {
+ yield return new FloatMenuOption($"Spawn {pawnKind.label}", () =>
+ {
+ StartDelayedSpawn(pawnKind);
+ });
+ }
+ }
+ }
+
+ private void StartDelayedSpawn(PawnKindDef pawnKind)
+ {
+ spawningPawnKind = pawnKind;
+ spawnUntilTick = Find.TickManager.TicksGame + Props.delay;
+ }
+
+ public override void CompTick()
+ {
+ base.CompTick();
+ if (spawnUntilTick > 0 && Find.TickManager.TicksGame >= spawnUntilTick)
+ {
+ SpawnPawn(spawningPawnKind);
+ spawnUntilTick = -1;
+ spawningPawnKind = null;
+ }
+ }
+
+ private void SpawnPawn(PawnKindDef pawnKind)
+ {
+ Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnKind, parent.Faction));
+ GenSpawn.Spawn(pawn, parent.Position, parent.Map);
+
+ if (Props.lordJob != null)
+ {
+ Lord lord = LordMaker.MakeNewLord(parent.Faction, (LordJob)System.Activator.CreateInstance(Props.lordJob), parent.Map);
+ lord.AddPawn(pawn);
+ }
+
+ if (Props.destroyOnSpawn)
+ {
+ parent.Destroy(DestroyMode.Vanish);
+ }
+ }
+
+ public override string CompInspectStringExtra()
+ {
+ if (spawnUntilTick > 0)
+ {
+ int remainingTicks = spawnUntilTick - Find.TickManager.TicksGame;
+ return $"Spawning in: {remainingTicks.ToStringTicksToPeriod()}";
+ }
+ return base.CompInspectStringExtra();
+ }
+
+ public override void PostExposeData()
+ {
+ base.PostExposeData();
+ Scribe_Values.Look(ref spawnUntilTick, "spawnUntilTick", -1);
+ Scribe_Defs.Look(ref spawningPawnKind, "spawningPawnKind");
+ }
+ }
+}
+```
+
+## 4. 使用示例
+
+1. 一个 `Colonist` 右键点击 `ARA_PawnSpawner`,选择 "Spawn Megascarab"。
+2. `ARA_PawnSpawner` 进入延迟状态。当玩家选中它时,检查面板会显示 "Spawning in: 5 seconds"。
+3. 5 秒后,一个新的 `Megascarab` 被生成。
+4. 由于 `destroyOnSpawn` 为 `true`,`ARA_PawnSpawner` 建筑被摧毁。
\ No newline at end of file