diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 74c0f664..598ad1fe 100644
Binary files a/1.6/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml
index 1436f26f..33ddbfbd 100644
--- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml
+++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Drop_Buildings.xml
@@ -53,6 +53,7 @@
4
+ false
BuildingDestroyed_Metal_Small
false
false
diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
index 4db0ea82..5858efc1 100644
--- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
+++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Misc_Buildings.xml
@@ -4,6 +4,9 @@
WULA_OrbitalTradeBeacon
Building_OrbitalTradeBeacon
+
+ BuildingsMisc
+
Things/Building/Misc/DropBeacon
Graphic_Single
@@ -52,7 +55,7 @@
Misc2
- Techprint_WULA_Colony_License_LV1_Technology
+ WULA_Colony_License_LV1_Technology
@@ -672,7 +675,6 @@
乌拉帝国行星封锁机关的旗帜,没什么用但是可以宣示乌拉帝国的主权。
Building
Building
- Building
PassThroughOnly
WULA_Buildings
true
@@ -723,8 +725,9 @@
天锁
Building
+ WulaFallenEmpire.Building_ExtraGraphics
true
- Building
+ MetaOverlays
50
true
PassThroughOnly
@@ -738,24 +741,27 @@
TransparentPostLight
(3,3)
(195,195,195,255)
+
+ (4, 4, 4)
+ (0,0,-0.1)
+
- 100
- 0.5
- 36000
+ 35000
+ 0
+ 1
125
- 0.65
- 50
- 1
+ 5000
-
+ true
+ WULA_Buildings
Normal
true
true
false
- East
+ North
true
Light
BulletImpact_Metal
@@ -768,13 +774,61 @@
true
true
+
+
+
-
- 5000
- 10
- 30
- true
- true
+
+ 7
+ 20
+ 2400
+ 30
+
+
+ Interceptor_BlockedProjectile
+ Interceptor_BlockedProjectile
+ Shield_Break
+ BulletShieldGenerator_Reactivate
+
+ (0.9, 0.2, 0.2, 0.5)
+
+
+ true
+ false
+ true
+
+
+ true
+ 1
+ 30
+ 0
+ Interceptor_BlockedProjectile
diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Prefab_Beacons.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Prefab_Beacons.xml
index d6590f04..0c87f4f2 100644
--- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Prefab_Beacons.xml
+++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Prefab_Beacons.xml
@@ -1,103 +1,101 @@
-
+
-
-
- WULA_Prefab_Incoming
-
- WulaFallenEmpire.Skyfaller_PrefabSpawner
- (13,13)
-
- Wula/Building/Linked/WULA_Fortress_Wall_MenuIcon
- Graphic_Single
- CutoutFlying
- (13,13)
-
-
- Accelerate
- Things/Skyfaller/SkyfallerShadowDropPod
- (13, 13)
- DropPod_Fall
- 100
- Explosion_Vaporize
- 0.05
- 1
- 1
-
-
- (0,0)
- (1, 1)
-
-
-
-
-
- Smoke_Joint
-
-
-
-
-
- WULA_Prefab_Cleanzone_NewColonyBase_Beacon
-
- 一个用于呼叫建筑的信标,用于快速建造一个小型前哨站。
- Wula/Building/Linked/WULA_Fortress_Wall_MenuIcon
- Normal
-
- Wula/Building/WULA_Dropping_Building_Cleanzone
- Graphic_Multi
- (13,13)
-
- false
-
-
- false
- false
- false
- false
- false
- false
- Building
- PassThroughOnly
- 0
- false
- false
-
- 0
- false
- Light
-
- 1
- 0
- 1
- 0
-
- (13,13)
- 0
- 1
-
-
- WULA_Structure_Technology
-
- 0
-
- 4
-
-
- BuildingDestroyed_Metal_Small
- false
- false
-
-
-
- WULA_NewColonyBase
- true
- WULA_Prefab_Incoming
- true
- 1
- true
- false
-
-
-
-
+
+ WULA_Prefab_Cleanzone_NewColonyBase_Beacon
+
+ 一个用于呼叫建筑的信标,用于快速建造一个小型前哨站。
+ Wula/Building/Linked/WULA_Fortress_Wall_MenuIcon
+ Normal
+
+ Wula/Building/WULA_Dropping_Building_Cleanzone_Plus
+ Graphic_Multi
+ (13,13)
+
+ false
+
+
+ false
+ false
+ false
+ false
+ false
+ false
+ BuildingOnTop
+ PassThroughOnly
+ 0
+ false
+ false
+
+ 0
+ false
+ Light
+
+ 1
+ 0
+ 1
+ 0
+
+ (13,13)
+ 0
+ 1
+
+
+ WULA_Structure_Technology
+
+ 0
+
+ 4
+
+
+ BuildingDestroyed_Metal_Small
+ false
+ false
+
+
+
+ WULA_NewColonyBase
+ true
+ WULA_Prefab_Incoming
+ true
+ 1
+ true
+ false
+
+
+
+
+
+ WULA_Prefab_Incoming
+
+ WulaFallenEmpire.Skyfaller_PrefabSpawner
+ (13,13)
+
+ Wula/Building/WULA_Prefab_Incoming
+ Graphic_Single
+ CutoutFlying
+ (19,19)
+
+
+ Accelerate
+ Things/Skyfaller/SkyfallerShadowDropPod
+ (13, 13)
+ DropPod_Fall
+ 100
+ Explosion_Vaporize
+ 0.05
+ 1
+ 1
+
+
+ (0,0)
+ (1, 1)
+
+
+
+
+
+ Smoke_Joint
+
+
+
\ No newline at end of file
diff --git a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml
index 3ffd260d..563153d0 100644
--- a/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml
+++ b/1.6/1.6/Defs/ThingDefs_Buildings/WULA_Turret_Buildings.xml
@@ -39,7 +39,7 @@
1
- 1
+ 0
1
0
diff --git a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml
index 16f13b29..5dd19c1e 100644
--- a/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml
+++ b/1.6/1.6/Defs/ThingDefs_Races/Races_Wulaspecies.xml
@@ -1672,13 +1672,12 @@
0
Interceptor_BlockedProjectile
-
- 0.75
- 25
- false
+
+ 1
+ WULA_Sky_Lock
- 0.1
- 0.9
+ 0
+ 1
diff --git a/1.6/1.6/Defs/ThoughtDefs/Thoughts_WULA.xml b/1.6/1.6/Defs/ThoughtDefs/Thoughts_WULA.xml
index a60b0d37..508aafee 100644
--- a/1.6/1.6/Defs/ThoughtDefs/Thoughts_WULA.xml
+++ b/1.6/1.6/Defs/ThoughtDefs/Thoughts_WULA.xml
@@ -1,20 +1,5 @@
-
- WULA_Energy_Furnace_Though_Hunger
- ThoughtWorker_Hediff
- WULA_Energy_Furnace_Hediff_Hunger
- true
- Baby, Child, Adult
-
-
-
- 我要疯狂偷吃能源核心,这真是太爽了!
- 20
-
-
-
-
Mech_WULA_Cat_Cute_Though
ThoughtWorker_Hediff
diff --git a/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.png b/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.png
new file mode 100644
index 00000000..2ba966b8
Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.png differ
diff --git a/Content/Textures/Wula/Building/WULA_Prefab_Incoming.png b/Content/Textures/Wula/Building/WULA_Prefab_Incoming.png
new file mode 100644
index 00000000..dd1f644c
Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Prefab_Incoming.png differ
diff --git a/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_A.png b/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_A.png
new file mode 100644
index 00000000..b5a783a1
Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_A.png differ
diff --git a/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_B.png b/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_B.png
new file mode 100644
index 00000000..2bbd8d99
Binary files /dev/null and b/Content/Textures/Wula/Building/WULA_Sky_Lock/WULA_Sky_Lock_B.png differ
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageReceiver.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageReceiver.cs
deleted file mode 100644
index 505c7ef8..00000000
--- a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageReceiver.cs
+++ /dev/null
@@ -1,107 +0,0 @@
-using RimWorld;
-using Verse;
-using UnityEngine;
-
-namespace WulaFallenEmpire
-{
- public class CompDamageReceiver : ThingComp
- {
- private CompProperties_DamageReceiver Props => (CompProperties_DamageReceiver)props;
-
- private float currentDamage;
- private int lastDamageTick;
-
- public float CurrentDamage => currentDamage;
- public float MaxDamageCapacity => Props.maxDamageCapacity;
- public float DamageRatio => currentDamage / Props.maxDamageCapacity;
-
- public override void PostExposeData()
- {
- base.PostExposeData();
- Scribe_Values.Look(ref currentDamage, "currentDamage", 0f);
- Scribe_Values.Look(ref lastDamageTick, "lastDamageTick", 0);
- }
-
- public override void CompTick()
- {
- base.CompTick();
-
- // 定期衰减伤害
- if (Find.TickManager.TicksGame % Props.damageDecayInterval == 0 && currentDamage > 0)
- {
- currentDamage = Mathf.Max(0f, currentDamage - Props.damageDecayRate);
-
- // 如果伤害为0,重置最后伤害时间
- if (currentDamage <= 0f)
- {
- lastDamageTick = 0;
- }
- }
- }
-
- ///
- /// 接收伤害
- ///
- public bool ReceiveDamage(float damageAmount, Pawn sourcePawn = null)
- {
- float oldDamage = currentDamage;
- currentDamage += damageAmount;
- lastDamageTick = Find.TickManager.TicksGame;
-
- // 检查是否超过容量
- if (currentDamage >= Props.maxDamageCapacity)
- {
- if (Props.canBeDestroyedByDamage)
- {
- // 摧毁建筑
- parent.Destroy(DestroyMode.Vanish);
- }
- else
- {
- // 只是达到上限,不再接收更多伤害
- currentDamage = Props.maxDamageCapacity;
- }
- return false; // 无法接收更多伤害
- }
-
- // 触发效果
- OnDamageReceived(damageAmount, sourcePawn);
- return true;
- }
-
- private void OnDamageReceived(float damageAmount, Pawn sourcePawn)
- {
- // 记录日志
- Log.Message($"[DamageReceiver] {parent.Label} 接收 {damageAmount} 点伤害,当前伤害: {currentDamage}/{Props.maxDamageCapacity}");
- }
-
- public override void PostDraw()
- {
- base.PostDraw();
-
- // 绘制伤害条
- if (Props.showDamageBar && currentDamage > 0f)
- {
- Vector3 drawPos = parent.DrawPos;
- drawPos.y += 0.5f; // 在建筑上方显示
-
- GenDraw.DrawFillableBar(new GenDraw.FillableBarRequest
- {
- center = drawPos,
- size = new Vector2(1f, 0.15f),
- fillPercent = DamageRatio,
- filledMat = SolidColorMaterials.SimpleSolidColorMaterial(Color.red),
- unfilledMat = SolidColorMaterials.SimpleSolidColorMaterial(Color.gray),
- margin = 0.1f,
- rotation = Rot4.North
- });
- }
- }
-
- // 获取接收器状态
- public string GetStatusString()
- {
- return $"伤害吸收: {currentDamage:F0}/{Props.maxDamageCapacity:F0} ({DamageRatio * 100:F1}%)";
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageTransfer.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageTransfer.cs
deleted file mode 100644
index a22b5d26..00000000
--- a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompDamageTransfer.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-using RimWorld;
-using Verse;
-using System.Collections.Generic;
-using Verse.Sound;
-
-namespace WulaFallenEmpire
-{
- public class CompDamageTransfer : ThingComp
- {
- private CompProperties_DamageTransfer Props => (CompProperties_DamageTransfer)props;
- private Pawn Pawn => (Pawn)parent;
-
- public override void PostPostApplyDamage(DamageInfo dinfo, float totalDamageDealt)
- {
- base.PostPostApplyDamage(dinfo, totalDamageDealt);
-
- // 检查是否应该转移伤害
- if (ShouldTransferDamage(dinfo, totalDamageDealt))
- {
- TryTransferDamage(dinfo, totalDamageDealt);
- }
- }
-
- private bool ShouldTransferDamage(DamageInfo dinfo, float totalDamageDealt)
- {
- if (parent == null || !parent.Spawned)
- return false;
-
- // 检查生命值阈值
- if (Pawn.health != null)
- {
- float healthRatio = Pawn.health.summaryHealth.SummaryHealthPercent;
- if (healthRatio < Props.healthThreshold.min || healthRatio > Props.healthThreshold.max)
- return false;
- }
-
- // 检查伤害类型
- if (!Props.transferAllDamageTypes)
- {
- // 这里可以添加特定伤害类型检查
- // 例如:只转移物理伤害,不转移火焰伤害等
- }
-
- return true;
- }
-
- private void TryTransferDamage(DamageInfo dinfo, float totalDamageDealt)
- {
- // 计算转移的伤害量
- float transferDamage = totalDamageDealt * Props.damageTransferRatio;
-
- // 寻找可用的伤害接收器
- CompDamageReceiver receiver = FindAvailableDamageReceiver();
- if (receiver != null)
- {
- // 执行伤害转移
- if (receiver.ReceiveDamage(transferDamage, Pawn))
- {
- OnDamageTransferred(dinfo, transferDamage, receiver);
-
- // 记录日志
- Log.Message($"[DamageTransfer] {Pawn.LabelShort} 将 {transferDamage} 点伤害转移至 {receiver.parent.Label}");
- }
- }
- }
-
- private CompDamageReceiver FindAvailableDamageReceiver()
- {
- if (parent?.Map == null)
- return null;
-
- var map = parent.Map;
- var faction = parent.Faction;
-
- // 搜索范围内的同派系建筑
- foreach (var thing in GenRadial.RadialDistinctThingsAround(parent.Position, map, Props.maxTransferRange, true))
- {
- if (thing is Building building &&
- building.Faction == faction &&
- building != parent)
- {
- var receiver = building.TryGetComp();
- if (receiver != null && receiver.CurrentDamage < receiver.MaxDamageCapacity)
- {
- // 检查视线(如果需要)
- if (Props.requireLineOfSight)
- {
- if (!GenSight.LineOfSight(parent.Position, building.Position, map))
- continue;
- }
-
- return receiver;
- }
- }
- }
-
- return null;
- }
-
- private void OnDamageTransferred(DamageInfo dinfo, float transferDamage, CompDamageReceiver receiver)
- {
- // 创建转移效果
- if (Props.transferEffecter != null)
- {
- Effecter effect = Props.transferEffecter.Spawn();
- effect.Trigger(new TargetInfo(parent.Position, parent.Map), new TargetInfo(receiver.parent.Position, parent.Map));
- effect.Cleanup();
- }
-
- // 播放音效
- if (Props.transferSound != null)
- {
- Props.transferSound.PlayOneShot(new TargetInfo(parent.Position, parent.Map));
- }
- }
-
- // 获取组件状态
- public string GetStatusString()
- {
- return $"伤害转移: {Props.damageTransferRatio * 100}% (范围: {Props.maxTransferRange})";
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageReceiver.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageReceiver.cs
deleted file mode 100644
index 7b073903..00000000
--- a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageReceiver.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class CompProperties_DamageReceiver : CompProperties
- {
- public float maxDamageCapacity = 1000f; // 最大伤害容量
- public float damageDecayRate = 5f; // 每 tick 衰减的伤害量
- public float damageDecayInterval = 60f; // 伤害衰减间隔(ticks)
- public bool showDamageBar = true; // 是否显示伤害条
- public bool canBeDestroyedByDamage = true; // 是否可以被伤害摧毁
-
- public CompProperties_DamageReceiver()
- {
- compClass = typeof(CompDamageReceiver);
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageTransfer.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageTransfer.cs
deleted file mode 100644
index 50db0710..00000000
--- a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/CompProperties_DamageTransfer.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- public class CompProperties_DamageTransfer : CompProperties
- {
- public float damageTransferRatio = 0.8f; // 伤害转移比例 (80%)
- public float maxTransferRange = 30f; // 最大转移范围
- public bool requireLineOfSight = false; // 是否需要视线
- public bool transferAllDamageTypes = true; // 是否转移所有伤害类型
- public FloatRange healthThreshold = new FloatRange(0f, 1f); // 生命值阈值(低于此值才触发)
-
- // 效果设置
- public EffecterDef transferEffecter;
- public SoundDef transferSound;
-
- public CompProperties_DamageTransfer()
- {
- compClass = typeof(CompDamageTransfer);
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/Patch_Pawn_DamageTransfer.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/Patch_Pawn_DamageTransfer.cs
deleted file mode 100644
index b90d7918..00000000
--- a/Source/WulaFallenEmpire/ThingComp/WULA_DamageReceiver/Patch_Pawn_DamageTransfer.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using HarmonyLib;
-using RimWorld;
-using Verse;
-
-namespace WulaFallenEmpire
-{
- [HarmonyPatch(typeof(Pawn), "PostApplyDamage")]
- public static class Patch_Pawn_PostApplyDamage
- {
- [HarmonyPostfix]
- public static void Postfix(Pawn __instance, DamageInfo dinfo, float totalDamageDealt)
- {
- // 检查Pawn是否有伤害转移组件
- var transferComp = __instance.TryGetComp();
- if (transferComp != null)
- {
- // 组件会在PostPostApplyDamage中自动处理
- // 这里主要用于调试和日志记录
- Log.Message($"[DamageTransfer] {__instance.LabelShort} 受到 {totalDamageDealt} 点伤害,转移组件已激活");
- }
- }
- }
-
- [HarmonyPatch(typeof(Pawn), "PreApplyDamage")]
- public static class Patch_Pawn_PreApplyDamage
- {
- [HarmonyPrefix]
- public static bool Prefix(Pawn __instance, ref DamageInfo dinfo, out bool __state)
- {
- __state = false;
-
- // 检查Pawn是否有伤害转移组件
- var transferComp = __instance.TryGetComp();
- if (transferComp != null && __instance.Spawned && !__instance.Dead)
- {
- // 这里可以添加预处理逻辑
- // 例如:在某些条件下完全阻止伤害
- __state = true;
- }
-
- return true;
- }
-
- [HarmonyPostfix]
- public static void Postfix(Pawn __instance, DamageInfo dinfo, bool __state)
- {
- if (__state)
- {
- // 后处理逻辑
- // 例如:记录伤害转移统计
- }
- }
- }
-}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageInterceptor.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageInterceptor.cs
new file mode 100644
index 00000000..15a3a6f1
--- /dev/null
+++ b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageInterceptor.cs
@@ -0,0 +1,137 @@
+using RimWorld;
+using Verse;
+using System.Collections.Generic;
+using Verse.Sound;
+using HarmonyLib;
+
+namespace WulaFallenEmpire
+{
+ public class CompDamageInterceptor : ThingComp
+ {
+ private CompProperties_DamageInterceptor Props => (CompProperties_DamageInterceptor)props;
+ private Pawn Pawn => (Pawn)parent;
+
+ // 使用Harmony补丁在伤害应用前完全拦截
+ public bool PreApplyDamage(ref DamageInfo dinfo)
+ {
+ if (!ShouldInterceptDamage(dinfo))
+ return true; // 继续应用伤害
+
+ // 计算要转移的伤害量(完全拦截)
+ float transferDamage = dinfo.Amount * Props.damageTransferRatio;
+
+ // 寻找可用的目标建筑
+ Building targetBuilding = FindTargetBuilding();
+ if (targetBuilding != null)
+ {
+ // 将伤害完全转移到建筑
+ ApplyDamageToBuilding(transferDamage, targetBuilding, dinfo);
+ OnDamageIntercepted(dinfo, transferDamage, targetBuilding);
+
+ // 完全拦截伤害 - 将伤害设置为0
+ dinfo.SetAmount(0f);
+
+ Log.Message($"[DamageInterceptor] {Pawn.LabelShort} 完全拦截 {transferDamage} 点伤害并转移至 {targetBuilding.Label},自身承受0伤害");
+
+ return true; // 继续应用修改后的伤害(0伤害)
+ }
+
+ return true; // 没有找到建筑,正常应用伤害
+ }
+
+ private bool ShouldInterceptDamage(DamageInfo dinfo)
+ {
+ if (parent == null || !parent.Spawned || Pawn.Dead)
+ return false;
+
+ // 检查生命值阈值
+ if (Pawn.health != null)
+ {
+ float healthRatio = Pawn.health.summaryHealth.SummaryHealthPercent;
+ if (healthRatio < Props.healthThreshold.min || healthRatio > Props.healthThreshold.max)
+ return false;
+ }
+
+ return true;
+ }
+
+ private Building FindTargetBuilding()
+ {
+ if (parent?.Map == null)
+ return null;
+
+ var map = parent.Map;
+ var faction = parent.Faction;
+
+ // 在全图范围内搜索目标建筑
+ List targetBuildings = new List();
+ foreach (var building in map.listerBuildings.allBuildingsColonist)
+ {
+ if (building.def.defName == Props.targetBuildingDefName &&
+ !building.Destroyed)
+ {
+ // 检查派系(如果需要)
+ if (Props.requireSameFaction && building.Faction != faction)
+ continue;
+
+ targetBuildings.Add(building);
+ }
+ }
+
+ // 随机选择一个建筑
+ if (targetBuildings.Count > 0)
+ {
+ return targetBuildings.RandomElement();
+ }
+
+ return null;
+ }
+
+ ///
+ /// 将伤害直接应用到目标建筑的生命值上
+ ///
+ private void ApplyDamageToBuilding(float damageAmount, Building building, DamageInfo originalDinfo)
+ {
+ // 创建新的伤害信息,使用原始伤害类型
+ DamageInfo buildingDamage = new DamageInfo(
+ originalDinfo.Def, // 使用相同的伤害类型
+ damageAmount,
+ originalDinfo.ArmorPenetrationInt,
+ originalDinfo.Angle,
+ originalDinfo.Instigator,
+ originalDinfo.HitPart,
+ originalDinfo.Weapon,
+ originalDinfo.Category,
+ originalDinfo.IntendedTarget
+ );
+
+ // 对建筑造成伤害
+ building.TakeDamage(buildingDamage);
+
+ Log.Message($"[DamageInterceptor] 对建筑 {building.Label} 造成 {damageAmount} 点伤害,剩余生命值: {building.HitPoints}/{building.MaxHitPoints}");
+ }
+
+ private void OnDamageIntercepted(DamageInfo dinfo, float interceptDamage, Building targetBuilding)
+ {
+ // 创建拦截效果
+ if (Props.interceptEffecter != null)
+ {
+ Effecter effect = Props.interceptEffecter.Spawn();
+ effect.Trigger(new TargetInfo(parent.Position, parent.Map), new TargetInfo(targetBuilding.Position, parent.Map));
+ effect.Cleanup();
+ }
+
+ // 播放音效
+ if (Props.interceptSound != null)
+ {
+ Props.interceptSound.PlayOneShot(new TargetInfo(parent.Position, parent.Map));
+ }
+ }
+
+ // 获取组件状态
+ public string GetStatusString()
+ {
+ return $"伤害拦截: {Props.damageTransferRatio * 100}% → {Props.targetBuildingDefName}";
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageRelay.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageRelay.cs
new file mode 100644
index 00000000..86442ecd
--- /dev/null
+++ b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompDamageRelay.cs
@@ -0,0 +1,133 @@
+using RimWorld;
+using Verse;
+using System.Collections.Generic;
+using Verse.Sound;
+
+namespace WulaFallenEmpire
+{
+ public class CompDamageRelay : ThingComp
+ {
+ private CompProperties_DamageRelay Props => (CompProperties_DamageRelay)props;
+ private Building Building => (Building)parent;
+
+ public override void PostPostApplyDamage(DamageInfo dinfo, float totalDamageDealt)
+ {
+ base.PostPostApplyDamage(dinfo, totalDamageDealt);
+
+ // 检查是否应该传递伤害
+ if (ShouldRelayDamage(dinfo, totalDamageDealt))
+ {
+ TryRelayDamage(dinfo, totalDamageDealt);
+ }
+ }
+
+ private bool ShouldRelayDamage(DamageInfo dinfo, float totalDamageDealt)
+ {
+ if (parent == null || !parent.Spawned || parent.Destroyed)
+ return false;
+
+ // 检查生命值阈值
+ float healthRatio = (float)Building.HitPoints / Building.MaxHitPoints;
+ if (healthRatio < Props.healthThreshold.min || healthRatio > Props.healthThreshold.max)
+ return false;
+
+ return true;
+ }
+
+ private void TryRelayDamage(DamageInfo dinfo, float totalDamageDealt)
+ {
+ // 计算传递的伤害量
+ float relayDamage = totalDamageDealt * Props.damageRelayRatio;
+
+ // 寻找可用的同派系建筑
+ Building targetBuilding = FindAvailableBuilding();
+ if (targetBuilding != null)
+ {
+ // 执行伤害传递
+ ApplyDamageToBuilding(relayDamage, targetBuilding, dinfo);
+ OnDamageRelayed(dinfo, relayDamage, targetBuilding);
+
+ // 记录日志
+ Log.Message($"[DamageRelay] {Building.Label} 将 {relayDamage} 点伤害传递给 {targetBuilding.Label}");
+ }
+ }
+
+ private Building FindAvailableBuilding()
+ {
+ if (parent?.Map == null)
+ return null;
+
+ var map = parent.Map;
+ var faction = parent.Faction;
+
+ // 在全图范围内搜索建筑
+ List availableBuildings = new List();
+ foreach (var building in map.listerBuildings.allBuildingsColonist)
+ {
+ if (building != parent && !building.Destroyed)
+ {
+ // 检查派系(如果需要)
+ if (Props.relayOnlyToSameFaction && building.Faction != faction)
+ continue;
+
+ availableBuildings.Add(building);
+ }
+ }
+
+ // 随机选择一个建筑
+ if (availableBuildings.Count > 0)
+ {
+ return availableBuildings.RandomElement();
+ }
+
+ return null;
+ }
+
+ ///
+ /// 将伤害直接应用到目标建筑的生命值上
+ ///
+ private void ApplyDamageToBuilding(float damageAmount, Building building, DamageInfo originalDinfo)
+ {
+ // 创建新的伤害信息,使用原始伤害类型
+ DamageInfo buildingDamage = new DamageInfo(
+ originalDinfo.Def, // 使用相同的伤害类型
+ damageAmount,
+ originalDinfo.ArmorPenetrationInt,
+ originalDinfo.Angle,
+ originalDinfo.Instigator,
+ originalDinfo.HitPart,
+ originalDinfo.Weapon,
+ originalDinfo.Category,
+ originalDinfo.IntendedTarget
+ );
+
+ // 对建筑造成伤害
+ building.TakeDamage(buildingDamage);
+
+ Log.Message($"[DamageRelay] 对建筑 {building.Label} 造成 {damageAmount} 点伤害,剩余生命值: {building.HitPoints}/{building.MaxHitPoints}");
+ }
+
+ private void OnDamageRelayed(DamageInfo dinfo, float relayDamage, Building targetBuilding)
+ {
+ // 创建传递效果
+ if (Props.relayEffecter != null)
+ {
+ Effecter effect = Props.relayEffecter.Spawn();
+ effect.Trigger(new TargetInfo(parent.Position, parent.Map), new TargetInfo(targetBuilding.Position, parent.Map));
+ effect.Cleanup();
+ }
+
+ // 播放音效
+ if (Props.relaySound != null)
+ {
+ Props.relaySound.PlayOneShot(new TargetInfo(parent.Position, parent.Map));
+ }
+ }
+
+ // 获取组件状态
+ public string GetStatusString()
+ {
+ return $"伤害传递: {Props.damageRelayRatio * 100}%";
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageInterceptor.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageInterceptor.cs
new file mode 100644
index 00000000..e36080f0
--- /dev/null
+++ b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageInterceptor.cs
@@ -0,0 +1,22 @@
+using RimWorld;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ public class CompProperties_DamageInterceptor : CompProperties
+ {
+ public float damageTransferRatio = 1f; // 完全拦截并转移伤害
+ public string targetBuildingDefName = "WULA_Sky_Lock"; // 目标建筑类型
+ public bool requireSameFaction = true; // 是否需要同派系
+ public FloatRange healthThreshold = new FloatRange(0f, 1f); // 生命值阈值范围
+
+ // 效果设置
+ public EffecterDef interceptEffecter;
+ public SoundDef interceptSound;
+
+ public CompProperties_DamageInterceptor()
+ {
+ compClass = typeof(CompDamageInterceptor);
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageRelay.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageRelay.cs
new file mode 100644
index 00000000..5aa0c8ca
--- /dev/null
+++ b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/CompProperties_DamageRelay.cs
@@ -0,0 +1,21 @@
+using RimWorld;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ public class CompProperties_DamageRelay : CompProperties
+ {
+ public float damageRelayRatio = 0.3f; // 继续传递伤害的比例
+ public bool relayOnlyToSameFaction = true; // 是否只传递给同派系建筑
+ public FloatRange healthThreshold = new FloatRange(0.1f, 1f); // 生命值阈值(低于此值才开始传递)
+
+ // 效果设置
+ public EffecterDef relayEffecter;
+ public SoundDef relaySound;
+
+ public CompProperties_DamageRelay()
+ {
+ compClass = typeof(CompDamageRelay);
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/Patch_Pawn_PreApplyDamage.cs b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/Patch_Pawn_PreApplyDamage.cs
new file mode 100644
index 00000000..1c55747e
--- /dev/null
+++ b/Source/WulaFallenEmpire/ThingComp/WULA_DamageTransaction/Patch_Pawn_PreApplyDamage.cs
@@ -0,0 +1,41 @@
+using HarmonyLib;
+using RimWorld;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ [HarmonyPatch(typeof(Pawn), "PreApplyDamage")]
+ public static class Patch_Pawn_PreApplyDamage
+ {
+ [HarmonyPrefix]
+ public static bool Prefix(Pawn __instance, ref DamageInfo dinfo)
+ {
+ // 检查Pawn是否有伤害拦截组件
+ var interceptorComp = __instance.TryGetComp();
+ if (interceptorComp != null)
+ {
+ Log.Message($"[DamageInterceptor] {__instance.LabelShort} 即将受到 {dinfo.Amount} 点伤害,拦截组件激活");
+
+ // 让拦截组件处理伤害
+ return interceptorComp.PreApplyDamage(ref dinfo);
+ }
+
+ return true; // 继续正常处理伤害
+ }
+ }
+
+ [HarmonyPatch(typeof(Pawn), "PostApplyDamage")]
+ public static class Patch_Pawn_PostApplyDamage
+ {
+ [HarmonyPostfix]
+ public static void Postfix(Pawn __instance, DamageInfo dinfo, float totalDamageDealt)
+ {
+ // 记录实际承受的伤害
+ var interceptorComp = __instance.TryGetComp();
+ if (interceptorComp != null && totalDamageDealt == 0f)
+ {
+ Log.Message($"[DamageInterceptor] {__instance.LabelShort} 成功拦截所有伤害,实际承受0点伤害");
+ }
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index b14e0f64..d625f85b 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -270,11 +270,11 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.sai2 b/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.sai2
new file mode 100644
index 00000000..57edad8c
Binary files /dev/null and b/美术与文本源文件/Wula/Building/WULA_Dropping_Building_Cleanzone_Plus.sai2 differ
diff --git a/美术与文本源文件/Wula/Building/WULA_Sky_Lock.sai2 b/美术与文本源文件/Wula/Building/WULA_Sky_Lock.sai2
new file mode 100644
index 00000000..5626ca7b
Binary files /dev/null and b/美术与文本源文件/Wula/Building/WULA_Sky_Lock.sai2 differ