From 8688e469f6afa74677505b4ddff4ff0672cae646 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Tue, 2 Sep 2025 12:40:02 +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 32256 -> 39424 bytes 1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml | 2 +- .../Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml | 18 ++ 1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml | 231 +----------------- Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 6 +- .../CompAutoMechCarrier.cs | 195 +++++++++++++++ .../CompProperties_AutoMechCarrier.cs | 54 ++++ .../PawnProductionEntry.cs | 23 ++ 8 files changed, 297 insertions(+), 232 deletions(-) create mode 100644 Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompAutoMechCarrier.cs create mode 100644 Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompProperties_AutoMechCarrier.cs create mode 100644 Source/ArachnaeSwarm/WULA_AutoMechCarrier/PawnProductionEntry.cs diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 4b840a2a2aea35c94a8e3acb5b5036fc31c500d9..2bd6e5db09c35c688d2e5fd11d5ef19a31de4c33 100644 GIT binary patch delta 16705 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 delta 9645 zcmZu%349f0lCSUUe*L=p-Dh4xP7*Npg!@tif?^PqC~}MWHp`z{m(EZN|A6$5tFfLB&fVUBMsBhz?Qr zJ2n0<9ij_awUy{;*wB7m5koXOUGcj?zs$*ZhUPqnSYPHmuS4)y z{$zj?`Hyq_M+$G1_5UKvV;D

#Bt_S^hVmE|gubBpOgBsRUDv6NO|a>usaxWUX06 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 diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml index e4b4b28..98ca5d0 100644 --- a/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml +++ b/1.6/1.6/Defs/AbilityDefs/ARA_Abilities.xml @@ -21,7 +21,7 @@ Verb_CastAbility 2 - -1 + 80 true true true diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml index a0dbb15..7e0e8f2 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceNodeSwarm.xml @@ -498,6 +498,24 @@ 1 14 +

  • + true + + ARA_InsectJelly + 500 + 500 + 999 + 9999 + +
  • + Spelopede + 3 + 600 +
  • + + CocoonDestroyed + + diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml index a7cd62e..c263409 100644 --- a/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_RaceQueen.xml @@ -497,233 +497,4 @@
  • AteWithoutTable
  • SleptOutside
  • SleptOnGround
  • -
  • SleptInCold
  • -
  • SleptInHeat
  • -
  • Ugly
  • -
  • AteKibble
  • -
  • AteInsectMeatDirect
  • -
  • AteInsectMeatAsIngredient
  • -
  • AteRawFood
  • -
  • AteHumanlikeMeatDirect
  • -
  • AteHumanlikeMeatAsIngredient
  • -
  • KnowButcheredHumanlikeCorpse
  • -
  • ButcheredHumanlikeCorpseOpinion
  • -
  • AteRawHumanlikeMeat
  • - - - - - - - - 0 - 0 - - 0 - 0 - 0 - - 0 - 0 - 0 - - - - - - - 2000 - 5 - - - 1.75 - 250 - - - - 2 - - 0.5 - - - 0 - 450 - 600 - - - 1 - - 5 - - 0 - - 0.95 - 0.95 - - 0.1 - - - 0.25 - - - - - - - - - 0.6 - 0.8 - 0.5 - - - 5 - - - 0 - - - - - ArachnaeQueen_Body - Normal - - ARA_Humanlike - - Humanlike - - Leather_Light - Meat_Megaspider - HumanStandard - Filth_BloodInsect - Filth_BloodSmear - - 10 - - 10 - - Steel - Steel - - Pawn_Melee_BigBash_HitPawn - Pawn_Melee_BigBash_HitBuilding - Pawn_Melee_BigBash_Miss - Pawn_MeleeDodge - - - - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - -
  • - ARA_Queen_Adult - 0 - Pawn_HiveQueen_Wounded - Pawn_HiveQueen_Death - Pawn_HiveQueen_Call - Pawn_HiveQueen_Angry -
  • -
    - false - -
    - - - -
  • - - -
  • Poke
  • - - 16 - 2 - HeadAttackTool - true - 0.01 - -
  • - - -
  • Blunt
  • -
  • Poke
  • - - 35 - 2.5 - Legs - -
  • - - -
  • Stab
  • - - 50 - 3 - Legs - -
  • - - -
  • Cut
  • - - 30 - 2 - Hands - -
    - - - - - - - - - - - \ No newline at end of file +
  • SleptInCold
  • \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 51db4f4..a9ea442 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -85,7 +85,11 @@ - + + + + + diff --git a/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompAutoMechCarrier.cs b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompAutoMechCarrier.cs new file mode 100644 index 0000000..312faf0 --- /dev/null +++ b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompAutoMechCarrier.cs @@ -0,0 +1,195 @@ +using RimWorld; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using UnityEngine; +using Verse; +using Verse.AI.Group; + +namespace ArachnaeSwarm +{ + public class CompAutoMechCarrier : CompMechCarrier + { + #region Reflected Fields + private static FieldInfo spawnedPawnsField; + private static FieldInfo cooldownTicksRemainingField; + private static FieldInfo innerContainerField; + + private List SpawnedPawns + { + get + { + if (spawnedPawnsField == null) + spawnedPawnsField = typeof(CompMechCarrier).GetField("spawnedPawns", BindingFlags.NonPublic | BindingFlags.Instance); + return (List)spawnedPawnsField.GetValue(this); + } + } + + private int CooldownTicksRemaining + { + get + { + if (cooldownTicksRemainingField == null) + cooldownTicksRemainingField = typeof(CompMechCarrier).GetField("cooldownTicksRemaining", BindingFlags.NonPublic | BindingFlags.Instance); + return (int)cooldownTicksRemainingField.GetValue(this); + } + set + { + if (cooldownTicksRemainingField == null) + cooldownTicksRemainingField = typeof(CompMechCarrier).GetField("cooldownTicksRemaining", BindingFlags.NonPublic | BindingFlags.Instance); + cooldownTicksRemainingField.SetValue(this, value); + } + } + + private ThingOwner InnerContainer + { + get + { + if (innerContainerField == null) + innerContainerField = typeof(CompMechCarrier).GetField("innerContainer", BindingFlags.NonPublic | BindingFlags.Instance); + return (ThingOwner)innerContainerField.GetValue(this); + } + } + #endregion + + public CompProperties_AutoMechCarrier AutoProps => (CompProperties_AutoMechCarrier)props; + + private int TotalPawnCapacity => AutoProps.productionQueue.Sum(e => e.count); + + private int LiveSpawnedPawnsCount(PawnKindDef kind) + { + SpawnedPawns.RemoveAll(p => p == null || p.Destroyed); + return SpawnedPawns.Count(p => p.kindDef == kind); + } + + private AcceptanceReport CanSpawnNow(PawnKindDef kind) + { + if (parent is Pawn pawn && (pawn.IsSelfShutdown() || !pawn.Awake() || pawn.Downed || pawn.Dead || !pawn.Spawned)) + return false; + if (CooldownTicksRemaining > 0) + return "CooldownTime".Translate() + " " + CooldownTicksRemaining.ToStringSecondsFromTicks(); + + PawnProductionEntry entry = AutoProps.productionQueue.First(e => e.pawnKind == kind); + int cost = entry.cost ?? Props.costPerPawn; + + if (!AutoProps.freeProduction && InnerContainer.TotalStackCountOfDef(Props.fixedIngredient) < cost) + return "MechCarrierNotEnoughResources".Translate(); + return true; + } + + private void TrySpawnPawn(PawnKindDef kind) + { + PawnGenerationRequest request = new PawnGenerationRequest(kind, parent.Faction, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: true); + Pawn pawn = PawnGenerator.GeneratePawn(request); + GenSpawn.Spawn(pawn, parent.Position, parent.Map); + SpawnedPawns.Add(pawn); + + if (parent is Pawn p && p.GetLord() != null) + p.GetLord().AddPawn(pawn); + + if (!AutoProps.freeProduction) + { + PawnProductionEntry entry = AutoProps.productionQueue.First(e => e.pawnKind == kind); + int costLeft = entry.cost ?? Props.costPerPawn; + + List things = new List(InnerContainer); + for (int j = 0; j < things.Count; j++) + { + Thing thing = InnerContainer.Take(things[j], Mathf.Min(things[j].stackCount, costLeft)); + costLeft -= thing.stackCount; + thing.Destroy(); + if (costLeft <= 0) break; + } + } + + PawnProductionEntry spawnEntry = AutoProps.productionQueue.First(e => e.pawnKind == kind); + CooldownTicksRemaining = spawnEntry.cooldownTicks ?? Props.cooldownTicks; + + if (Props.spawnedMechEffecter != null) + EffecterTrigger(Props.spawnedMechEffecter, Props.attachSpawnedMechEffecter, pawn); + if (Props.spawnEffecter != null) + EffecterTrigger(Props.spawnEffecter, Props.attachSpawnedEffecter, parent); + } + + private void EffecterTrigger(EffecterDef effecterDef, bool attach, Thing target) + { + Effecter effecter = new Effecter(effecterDef); + effecter.Trigger(attach ? ((TargetInfo)target) : new TargetInfo(target.Position, target.Map), TargetInfo.Invalid); + effecter.Cleanup(); + } + + public override void CompTick() + { + base.CompTick(); + + if (parent.IsHashIntervalTick(60)) // 每秒检查一次 + { + // 检查是否有抑制生产的Hediff + if (AutoProps.disableHediff != null && (parent as Pawn)?.health.hediffSet.HasHediff(AutoProps.disableHediff) == true) + { + return; // 有Hediff,停止生产 + } + + // 1. 先检查是否满员 + bool isFull = true; + foreach (var entry in AutoProps.productionQueue) + { + if (LiveSpawnedPawnsCount(entry.pawnKind) < entry.count) + { + isFull = false; + break; + } + } + + if (isFull) + { + return; // 如果已满员,则不进行任何操作,包括冷却计时 + } + + // 2. 如果未满员,才检查冷却时间 + if (CooldownTicksRemaining > 0) return; + + // 3. 寻找空位并生产 + foreach (var entry in AutoProps.productionQueue) + { + if (LiveSpawnedPawnsCount(entry.pawnKind) < entry.count) + { + if (CanSpawnNow(entry.pawnKind).Accepted) + { + TrySpawnPawn(entry.pawnKind); + break; // 每次只生产一个 + } + } + } + } + } + + public override IEnumerable CompGetGizmosExtra() + { + // 移除所有Gizmo逻辑 + return Enumerable.Empty(); + } + + public override string CompInspectStringExtra() + { + SpawnedPawns.RemoveAll(p => p == null || p.Destroyed); + string text = "Pawns: " + SpawnedPawns.Count + " / " + TotalPawnCapacity; + + foreach (var entry in AutoProps.productionQueue) + { + text += $"\n- {entry.pawnKind.LabelCap}: {LiveSpawnedPawnsCount(entry.pawnKind)} / {entry.count}"; + } + + if (CooldownTicksRemaining > 0) + { + text += "\n" + "CooldownTime".Translate() + ": " + CooldownTicksRemaining.ToStringSecondsFromTicks(); + } + + if (!AutoProps.freeProduction) + { + text += "\n" + base.CompInspectStringExtra(); + } + return text; + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompProperties_AutoMechCarrier.cs b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompProperties_AutoMechCarrier.cs new file mode 100644 index 0000000..a1fe812 --- /dev/null +++ b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/CompProperties_AutoMechCarrier.cs @@ -0,0 +1,54 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; + +namespace ArachnaeSwarm +{ + public class CompProperties_AutoMechCarrier : CompProperties_MechCarrier + { + // XML中定义,生产是否消耗资源 + public bool freeProduction = false; + + // 如果单位拥有这个Hediff,则停止生产 + public HediffDef disableHediff; + + // 定义生产队列 + public List productionQueue = new List(); + + public CompProperties_AutoMechCarrier() + { + // 确保这个属性类指向我们新的功能实现类 + compClass = typeof(CompAutoMechCarrier); + } + + public override IEnumerable ConfigErrors(ThingDef parentDef) + { + foreach (string error in base.ConfigErrors(parentDef)) + { + yield return error; + } + + if (productionQueue.NullOrEmpty()) + { + yield return "CompProperties_AutoMechCarrier must have at least one entry in productionQueue."; + } + } + + public override void ResolveReferences(ThingDef parentDef) + { + base.ResolveReferences(parentDef); + // Prevent division by zero if costPerPawn is not set, which the base game AI might try to access. + if (costPerPawn <= 0) + { + costPerPawn = 1; + } + + // 如果spawnPawnKind为空(因为我们用了新的队列系统), + // 就从队列里取第一个作为“假”值,以防止基类方法在生成Gizmo标签时出错。 + if (spawnPawnKind == null && !productionQueue.NullOrEmpty()) + { + spawnPawnKind = productionQueue[0].pawnKind; + } + } + } +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/WULA_AutoMechCarrier/PawnProductionEntry.cs b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/PawnProductionEntry.cs new file mode 100644 index 0000000..b8e8c9e --- /dev/null +++ b/Source/ArachnaeSwarm/WULA_AutoMechCarrier/PawnProductionEntry.cs @@ -0,0 +1,23 @@ +using Verse; + +namespace ArachnaeSwarm +{ + /// + /// A data class to hold information about a pawn to be produced in a queue. + /// Used in XML definitions. + /// + public class PawnProductionEntry + { + // The PawnKindDef of the unit to spawn. + public PawnKindDef pawnKind; + + // The maximum number of this kind of unit to maintain. + public int count = 1; + + // Optional: specific cooldown for this entry. If not set, the parent comp's cooldown is used. + public int? cooldownTicks; + + // Optional: specific cost for this entry. If not set, the parent comp's costPerPawn is used. + public int? cost; + } +} \ No newline at end of file