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