diff --git a/1.6/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/1.6/Assemblies/WulaFallenEmpire.dll
index 09147844..3ecb920f 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 097f9994..c6ab2ea0 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
@@ -824,6 +824,12 @@
true
Wula_UI_Legion_Reply_1
+
+ 0.8
+ true
+ true
+ Wula_UI_Legion_Reply_1
+
ITab_ContentsTransporter
diff --git a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml
index dfe810f0..8262dc7b 100644
--- a/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml
+++ b/1.6/1.6/Languages/ChineseSimplified (简体中文)/Keyed/Misc_Gameplay.xml
@@ -351,4 +351,23 @@
启用区域传送功能,允许机械乌拉在其覆盖范围内以传送代替常规移动。
禁用传送器
禁用区域传送功能,在其附近的机械乌拉使用常规移动而非传送。
+
+
+ 向舰队贩卖物资
+ 将输送舱发射到乌拉帝国舰队,所有物品的价值按照 {0} 的比率转换为白银储存在舰队物资中
+ 无法贩卖:包含禁止物品或容器为空
+ 没有可贩卖的物品
+ 没有有价值的物品
+ 贩卖价值过低
+ 贩卖取消:包含禁止物品:{0}
+ 成功将价值 {0} 的物品转换为 {1} 白银
+ 成功将价值 {0} 的物品转换为 {1} 白银(转换率:{2})
+ 成功将价值 {0} 的物品转换为 {1} 白银(奖励率:{2})
+ 容器内物品总价值:{0}
+ 可转换白银:{0}
+ 转换率:{0}
+ 转换效率:{0}
+ (有损耗)
+ (有加成)
+ (等值转换)
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/CompLaunchable_ToGlobalStorage.cs b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompLaunchable_ToGlobalStorage.cs
similarity index 100%
rename from Source/WulaFallenEmpire/GlobalWorkTable/CompLaunchable_ToGlobalStorage.cs
rename to Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompLaunchable_ToGlobalStorage.cs
diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/CompProperties_GarbageShield.cs b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompProperties_GarbageShield.cs
similarity index 100%
rename from Source/WulaFallenEmpire/GlobalWorkTable/CompProperties_GarbageShield.cs
rename to Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompProperties_GarbageShield.cs
diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/CompProperties_Launchable_ToGlobalStorage.cs b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompProperties_Launchable_ToGlobalStorage.cs
similarity index 100%
rename from Source/WulaFallenEmpire/GlobalWorkTable/CompProperties_Launchable_ToGlobalStorage.cs
rename to Source/WulaFallenEmpire/GlobalWorkTable/WULA_Launchable_ToGlobalStorage/CompProperties_Launchable_ToGlobalStorage.cs
diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompProperties_ValueConverter.cs b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompProperties_ValueConverter.cs
new file mode 100644
index 00000000..49349226
--- /dev/null
+++ b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompProperties_ValueConverter.cs
@@ -0,0 +1,21 @@
+using RimWorld;
+using Verse;
+
+namespace WulaFallenEmpire
+{
+ public class CompProperties_ValueConverter : CompProperties
+ {
+ public float conversionRate = 1.0f; // 价值转换倍率
+ public ThingDef outputThingDef = null; // 输出物品定义,默认为白银
+ public bool destroyAfterConversion = true; // 转换后是否销毁建筑
+
+ // 垃圾屏蔽配置
+ public bool garbageShieldEnabled = false;
+ public string garbageShieldUIEventDefName = "Wula_UI_Legion_Reply_1";
+
+ public CompProperties_ValueConverter()
+ {
+ this.compClass = typeof(CompValueConverter);
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompValueConverter.cs b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompValueConverter.cs
new file mode 100644
index 00000000..d48bf631
--- /dev/null
+++ b/Source/WulaFallenEmpire/GlobalWorkTable/WULA_ValueConverter/CompValueConverter.cs
@@ -0,0 +1,304 @@
+using RimWorld;
+using System.Collections.Generic;
+using UnityEngine;
+using Verse;
+using Verse.Sound;
+using System.Text;
+using System.Linq;
+using RimWorld.Planet;
+
+
+namespace WulaFallenEmpire
+{
+ public class CompValueConverter : CompLaunchable_TransportPod
+ {
+ public new CompProperties_ValueConverter Props => (CompProperties_ValueConverter)this.props;
+
+ // 获取垃圾屏蔽组件
+ public CompGarbageShield GarbageShieldComp => this.parent.GetComp();
+
+ // 获取容器组件
+ public new CompTransporter Transporter => this.parent.GetComp();
+
+ public override IEnumerable CompGetGizmosExtra()
+ {
+ // 首先处理基类的Gizmo,但过滤掉原版的发射按钮
+ foreach (Gizmo gizmo in base.CompGetGizmosExtra())
+ {
+ // 跳过原版的发射按钮
+ if (gizmo is Command_Action launchCommand &&
+ (launchCommand.defaultDesc == "CommandLaunchGroupDesc".Translate() ||
+ launchCommand.defaultDesc == "CommandLaunchSingleDesc".Translate()))
+ {
+ continue;
+ }
+ yield return gizmo;
+ }
+
+ // 添加我们的转换按钮
+ if (Transporter != null && Transporter.innerContainer.Any)
+ {
+ Command_Action command = new Command_Action();
+ command.defaultLabel = "WULA_ConvertToSilver".Translate();
+ command.defaultDesc = "WULA_ConvertToSilverDesc".Translate(Props.conversionRate.ToStringPercent());
+ command.icon = ContentFinder.Get("UI/Commands/ConvertToSilver");
+ command.action = delegate
+ {
+ this.TryLaunchToSilver();
+ };
+
+ // 添加禁用状态检查
+ if (!CanConvert())
+ {
+ command.Disable("WULA_CannotConvert".Translate());
+ }
+
+ yield return command;
+ }
+ }
+
+ ///
+ /// 检查是否可以执行转换
+ ///
+ private bool CanConvert()
+ {
+ if (Transporter == null || !Transporter.innerContainer.Any)
+ return false;
+
+ // 检查垃圾屏蔽
+ if (GarbageShieldComp != null && GarbageShieldComp.GarbageShieldEnabled)
+ {
+ List forbiddenItems = GarbageShieldComp.GetForbiddenItems(Transporter.innerContainer);
+ if (forbiddenItems.Count > 0)
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// 将物品价值转换为白银
+ ///
+ public void TryLaunchToSilver()
+ {
+ if (!this.parent.Spawned)
+ {
+ Log.Error("Tried to convert value from " + this.parent + " but it's not spawned.");
+ return;
+ }
+
+ var globalStorage = Find.World.GetComponent();
+ if (globalStorage == null)
+ {
+ Log.Error("Could not find GlobalStorageWorldComponent.");
+ return;
+ }
+
+ if (Transporter == null || !Transporter.innerContainer.Any)
+ {
+ Messages.Message("WULA_NoItemsToConvert".Translate(), this.parent, MessageTypeDefOf.RejectInput);
+ return;
+ }
+
+ // 检查垃圾屏蔽
+ if (GarbageShieldComp != null && GarbageShieldComp.GarbageShieldEnabled)
+ {
+ List forbiddenItems = GarbageShieldComp.GetForbiddenItems(Transporter.innerContainer);
+ if (forbiddenItems.Count > 0)
+ {
+ StringBuilder forbiddenList = new StringBuilder();
+ foreach (Thing item in forbiddenItems)
+ {
+ if (forbiddenList.Length > 0) forbiddenList.Append(", ");
+ forbiddenList.Append($"{item.LabelCap} x{item.stackCount}");
+ }
+
+ Messages.Message("WULA_ConversionCancelledDueToForbiddenItems".Translate(forbiddenList.ToString()),
+ this.parent, MessageTypeDefOf.RejectInput);
+
+ GarbageShieldComp.ProcessGarbageShieldTrigger(forbiddenItems);
+ return;
+ }
+ }
+
+ // 计算总价值
+ float totalValue = CalculateTotalValue();
+ if (totalValue <= 0)
+ {
+ Messages.Message("WULA_NoValuableItems".Translate(), this.parent, MessageTypeDefOf.RejectInput);
+ return;
+ }
+
+ // 应用转换倍率
+ int silverAmount = CalculateSilverAmount(totalValue);
+ if (silverAmount <= 0)
+ {
+ Messages.Message("WULA_ConversionValueTooLow".Translate(), this.parent, MessageTypeDefOf.RejectInput);
+ return;
+ }
+
+ // 执行转换
+ PerformConversion(globalStorage, silverAmount, totalValue);
+
+ // 调用基类的发射方法,让它处理动画和销毁
+ // 注意:这里我们发射到当前地图的同一个位置,实际上只是利用发射动画
+ base.TryLaunch(this.parent.Map.Tile, null);
+ }
+
+ ///
+ /// 重写基类的TryLaunch方法,阻止原版发射逻辑
+ ///
+ public new void TryLaunch(PlanetTile destinationTile, TransportersArrivalAction arrivalAction)
+ {
+ // 阻止原版发射逻辑,使用我们的转换逻辑
+ TryLaunchToSilver();
+ }
+
+ ///
+ /// 计算容器内物品的总价值
+ ///
+ private float CalculateTotalValue()
+ {
+ float totalValue = 0f;
+
+ foreach (Thing item in Transporter.innerContainer)
+ {
+ // 计算单个物品的市场价值
+ float itemValue = item.MarketValue * item.stackCount;
+ totalValue += itemValue;
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[ValueConverter] {item.LabelCap} x{item.stackCount}: {item.MarketValue} each, total: {itemValue}");
+ }
+ }
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[ValueConverter] Total value before conversion: {totalValue}");
+ }
+ return totalValue;
+ }
+
+ ///
+ /// 计算转换后的白银数量
+ ///
+ private int CalculateSilverAmount(float totalValue)
+ {
+ // 应用转换倍率
+ float convertedValue = totalValue * Props.conversionRate;
+
+ // 转换为白银(白银的市场价值为1)
+ int silverAmount = Mathf.FloorToInt(convertedValue);
+
+ if (Prefs.DevMode)
+ {
+ Log.Message($"[ValueConverter] After conversion rate ({Props.conversionRate}): {convertedValue}, Silver amount: {silverAmount}");
+ }
+
+ return silverAmount;
+ }
+
+ ///
+ /// 执行转换操作
+ ///
+ private void PerformConversion(GlobalStorageWorldComponent globalStorage, int silverAmount, float originalValue)
+ {
+ // 1. 将白银添加到全局存储器的输入端
+ ThingDef silverDef = Props.outputThingDef ?? ThingDefOf.Silver;
+ globalStorage.AddToInputStorage(silverDef, silverAmount);
+
+ // 2. 显示转换结果消息
+ ShowConversionMessage(silverAmount, originalValue);
+
+ // 4. 清空容器
+ Transporter.innerContainer.ClearAndDestroyContents();
+
+ // 5. 如果配置为转换后销毁,则销毁建筑
+ if (Props.destroyAfterConversion)
+ {
+ this.parent.Destroy(DestroyMode.Vanish);
+ }
+ }
+
+ ///
+ /// 显示转换结果消息
+ ///
+ private void ShowConversionMessage(int silverAmount, float originalValue)
+ {
+ string message;
+
+ if (Props.conversionRate < 1.0f)
+ {
+ message = "WULA_ValueConvertedWithLoss".Translate(
+ originalValue.ToString("F0"),
+ silverAmount,
+ Props.conversionRate.ToStringPercent()
+ );
+ }
+ else if (Props.conversionRate > 1.0f)
+ {
+ message = "WULA_ValueConvertedWithBonus".Translate(
+ originalValue.ToString("F0"),
+ silverAmount,
+ Props.conversionRate.ToStringPercent()
+ );
+ }
+ else
+ {
+ message = "WULA_ValueConverted".Translate(
+ originalValue.ToString("F0"),
+ silverAmount
+ );
+ }
+
+ Messages.Message(message, this.parent, MessageTypeDefOf.PositiveEvent);
+ }
+
+ ///
+ /// 获取转换效率描述(用于界面显示)
+ ///
+ public string GetConversionEfficiencyDescription()
+ {
+ StringBuilder sb = new StringBuilder();
+
+ sb.AppendLine("WULA_ConversionEfficiency".Translate(Props.conversionRate.ToStringPercent()));
+
+ if (Props.conversionRate < 1.0f)
+ {
+ sb.AppendLine("WULA_ConversionEfficiencyLoss".Translate());
+ }
+ else if (Props.conversionRate > 1.0f)
+ {
+ sb.AppendLine("WULA_ConversionEfficiencyBonus".Translate());
+ }
+ else
+ {
+ sb.AppendLine("WULA_ConversionEfficiencyNormal".Translate());
+ }
+
+ return sb.ToString();
+ }
+
+ ///
+ /// 在检查器中显示转换信息
+ ///
+ public override string CompInspectStringExtra()
+ {
+ StringBuilder sb = new StringBuilder();
+
+ if (Transporter != null && Transporter.innerContainer.Any)
+ {
+ // 显示容器内物品总价值
+ float currentValue = CalculateTotalValue();
+ int potentialSilver = CalculateSilverAmount(currentValue);
+
+ sb.AppendLine("WULA_CurrentValueInContainer".Translate(currentValue.ToString("F0")));
+ sb.AppendLine("WULA_PotentialSilver".Translate(potentialSilver));
+ sb.AppendLine("WULA_ConversionRate".Translate(Props.conversionRate.ToStringPercent()));
+ }
+
+ return sb.ToString().TrimEndNewlines();
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index 962491da..b22f59c6 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -171,8 +171,10 @@
-
+
+
+
@@ -180,8 +182,8 @@
-
-
+
+