From 060c3148c48cca9273da94a843f0cd0da39d0413 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Mon, 1 Sep 2025 12:38:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 3072 -> 10752 bytes 1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml | 2 +- .../Thing_building/ARA_InteractiveEggSac.xml | 56 +++++++++++ .../Keyed/ArachnaeSwarm_Keys.xml | 6 ++ Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 2 + .../CompProperties_SpawnPawnFromList.cs | 33 +++++++ Source/ArachnaeSwarm/CompSpawnPawnFromList.cs | 90 ++++++++++++++++++ 7 files changed, 188 insertions(+), 1 deletion(-) create mode 100644 1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml create mode 100644 1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml create mode 100644 Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs create mode 100644 Source/ArachnaeSwarm/CompSpawnPawnFromList.cs diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index cf6106be030fabda326b5a687ceb38dca7a55a9d..fec69070680a3b7425876f6c0b9c6c4f5d7a20e8 100644 GIT binary patch literal 10752 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 delta 657 zcmY+C&ubG=5XZl7v)y*n5;sj743>1W8)y$@NvY6-64F|X7R5qrq2Qruy0n2!wrnCr zrENe8RWA+iF8%@HC1O2@$DYNLC+Wen=HSVLIFoFJ4$REwedotMme+dNx_WZF{A@D+ z9HE`VGKWPDP)X4GV$7y&k{8GUqsL0Wg@v#UXtlpOu}>E8faL=4QE6uqBOAa7o!?Ml zLS~d1xh|%nV-b=}a#g+*wq9T&*W?E=sc#U`2N0Ftg_Y{kAln^s1p`A>#^tNQEOEEz^iV`Tyk8#P3Gqpf^uc2UUo}+ z<)G$lc^)n)a4JndKDHX3YI(cvH=5OoJWI{e8|YbA+fDyW*KWVtU(310Z!=I$ zA%-F*!~j7&K6Lu@(OT;I`3rd~Gb<0Q^ym*O9HsP^*=%Q$O4sU~S<^zsvNuGbvz$GR S=w|<67;~NY^e@rQ4gLcpS7tN- diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml index d83cc24..1b2d358 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -74,7 +74,7 @@ Bullet 21 0 - EggSac + ARA_InteractiveEggSac true diff --git a/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml b/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml new file mode 100644 index 0000000..dba23de --- /dev/null +++ b/1.6/1.6/Defs/Thing_building/ARA_InteractiveEggSac.xml @@ -0,0 +1,56 @@ + + + + + ARA_InteractiveEggSac + + 一个黏滑的囊状物,可以通过交互来孵化特定的昆虫。 + 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) +
  • +
  • + +
  • Megascarab
  • +
  • Spelopede
  • +
  • Megaspider
  • + + +
  • ARA_ArachnaeQueen
  • +
    + 300 + true + +
  • + CocoonDestroyed +
  • +
    +
    + +
    \ 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 new file mode 100644 index 0000000..f5c49aa --- /dev/null +++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/ArachnaeSwarm_Keys.xml @@ -0,0 +1,6 @@ + + + + 孵化 {0} + + \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index f6a8da1..06bdd65 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -68,6 +68,8 @@ + + diff --git a/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs b/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs new file mode 100644 index 0000000..14ae742 --- /dev/null +++ b/Source/ArachnaeSwarm/CompProperties_SpawnPawnFromList.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using Verse; +using Verse.AI.Group; + +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(LordJob).IsAssignableFrom(lordJob)) + { + yield return $"lordJob {lordJob} must be of type LordJob"; + } + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs b/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs new file mode 100644 index 0000000..ccdeb3c --- /dev/null +++ b/Source/ArachnaeSwarm/CompSpawnPawnFromList.cs @@ -0,0 +1,90 @@ +using System.Collections.Generic; +using Verse; +using RimWorld; +using Verse.AI.Group; + +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("ARA_Incubate".Translate(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"); + } + } +} \ No newline at end of file