From d290c014eda87189d00cb25957eb373a5b94bb32 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Mon, 1 Sep 2025 12:14:32 +0800 Subject: [PATCH] ZC --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 0 -> 3072 bytes 1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml | 8 +- ...{BackstoryDef.xml => ARA_BackstoryDef.xml} | 0 .../{LifeStages.xml => ARA_LifeStages.xml} | 0 1.6/1.6/Defs/Thing_building/ARA_Eggs.xml | 49 +++++ Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 79 ++++++++ .../ArachnaeSwarm/SpawnPawnFromList_Design.md | 180 ++++++++++++++++++ 7 files changed, 312 insertions(+), 4 deletions(-) create mode 100644 1.6/1.6/Assemblies/ArachnaeSwarm.dll rename 1.6/1.6/Defs/BackstoryDefs/{BackstoryDef.xml => ARA_BackstoryDef.xml} (100%) rename 1.6/1.6/Defs/LifeStageDefs/{LifeStages.xml => ARA_LifeStages.xml} (100%) create mode 100644 1.6/1.6/Defs/Thing_building/ARA_Eggs.xml create mode 100644 Source/ArachnaeSwarm/ArachnaeSwarm.csproj create mode 100644 Source/ArachnaeSwarm/SpawnPawnFromList_Design.md diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll new file mode 100644 index 0000000000000000000000000000000000000000..cf6106be030fabda326b5a687ceb38dca7a55a9d GIT binary patch literal 3072 zcmeHJO>Z1U5Pf5>owY-ZO`?bhZN1Bh- z%xr9fK$cJrhzmzfh+lv>L?S|ge-Mcy#~e6=51cr}yy}_RSw|5BDHl-6?&|t@U0qc@ z-S)}{Ut$i?PRwvNIqDq1 zq?U(Lh!`>$a7cxApwotPqyXp?Vo=0*#DP?n>cS-P>@;9O!}P0{DQu+3RWQayDJ7!&1BV;1Mr z+$Dz8AnlbQvJ60F^C(`$*ZgjlG(U?k@H~Ffh#V<(jNvx<6!|DFkdMQ{X-XE(qC)-> z=1@A!mi4DSN|HfNlf_ZIwG!_1JarX*?1Yi$w$V`SUZ-QXJvEoG5$#^0un_uP*RvBh z4Azxr?`tV8{Oi3SaeXB)y4tSiCI^LgF0!57z*en2JMyg^&%+4|EGG#gv<~7#`BuZV zJ3$yHt`p~`EV`9up`wKR`TLKyHZRm3d|o!PJ25S--55ImUSxN#hr!~$qqhu#RhSw(!DBTlx~rDk6&SoN4FUa^*@&lUHpsbD>_hX zdZVk4u?tAvj`!=p7B6E?TSGO9n`q%C`6AXSE%T+lPJNmDTKekZ$I|Z)^ZS;smHF*V zky|tnR$JvQFc{TF#5gYB6vdbUK18Vfm-XG-px34~rr$^zjYu9>dXbx+nHAiLLUBFR+`$Mno66RQZM!18Cp{;-#8I zV*}>yv0pZP>fmc5RXNxt!ltE#J 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