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 @@ - - + +