// HediffCompProperties_SwitchableHediff.cs using RimWorld; using Verse; using System.Collections.Generic; using UnityEngine; using System.Text; namespace WulaFallenEmpire { public class HediffCompProperties_SwitchableHediff : HediffCompProperties { // 可切换的hediff列表 public List availableHediffs = new List(); // 默认选择的hediff索引 public int defaultHediffIndex = 0; // Gizmo图标路径 public string gizmoIconPath = "UI/Commands/Default"; // 是否显示当前状态的提示 public bool showStatusInGizmo = true; // 可自定义的标签和描述 public string switchLabel = "WULA_SwitchableHediff_SwitchLabel"; // 默认翻译键 public string switchDesc = "WULA_SwitchableHediff_SwitchDesc"; // 默认翻译键 public string statusLabel = "WULA_SwitchableHediff_StatusLabel"; // 默认翻译键 public string statusDesc = "WULA_SwitchableHediff_StatusDesc"; // 默认翻译键 public HediffCompProperties_SwitchableHediff() { compClass = typeof(HediffComp_SwitchableHediff); } } public class HediffComp_SwitchableHediff : HediffComp { public HediffCompProperties_SwitchableHediff Props => (HediffCompProperties_SwitchableHediff)props; // 当前选择的hediff索引 private int currentHediffIndex = -1; // 当前激活的hediff引用 private Hediff activeHediff; public override void CompPostMake() { base.CompPostMake(); // 初始化当前选择 if (currentHediffIndex == -1 && Props.availableHediffs.Count > 0) { currentHediffIndex = Props.defaultHediffIndex; if (currentHediffIndex >= Props.availableHediffs.Count) currentHediffIndex = 0; // 应用初始hediff ApplySelectedHediff(); } } // 应用当前选择的hediff private void ApplySelectedHediff() { // 移除之前激活的hediff if (activeHediff != null && Pawn.health.hediffSet.hediffs.Contains(activeHediff)) { Pawn.health.RemoveHediff(activeHediff); } activeHediff = null; // 应用新的hediff if (currentHediffIndex >= 0 && currentHediffIndex < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[currentHediffIndex]; if (hediffDef != null) { activeHediff = HediffMaker.MakeHediff(hediffDef, Pawn); activeHediff.Severity = 1f; // 默认严重性为1 Pawn.health.AddHediff(activeHediff); Log.Message($"[SwitchableHediff] Applied {hediffDef.defName} to {Pawn.LabelShort}"); } } } // 切换到特定索引的hediff private void SwitchToHediff(int index) { if (index >= 0 && index < Props.availableHediffs.Count) { currentHediffIndex = index; ApplySelectedHediff(); // 发送切换消息 var hediffDef = Props.availableHediffs[index]; if (hediffDef != null) { Messages.Message("WULA_SwitchableHediff_SwitchedTo".Translate(hediffDef.label), Pawn, MessageTypeDefOf.SilentInput); } } } // 获取当前hediff名称 private string GetCurrentHediffName() { if (currentHediffIndex >= 0 && currentHediffIndex < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[currentHediffIndex]; return hediffDef?.label ?? "WULA_Unknown".Translate(); } return "WULA_None".Translate(); } // 获取当前hediff描述 private string GetCurrentHediffDesc() { if (currentHediffIndex >= 0 && currentHediffIndex < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[currentHediffIndex]; return hediffDef?.description ?? "WULA_NoDescription".Translate(); } return string.Empty; } // 获取特定hediff的描述 private string GetHediffDescription(int index) { if (index >= 0 && index < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[index]; return hediffDef?.description ?? "WULA_NoDescription".Translate(); } return string.Empty; } // 获取特定hediff的详细工具提示(包含效果信息) private string GetHediffDetailedTooltip(int index) { if (index >= 0 && index < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[index]; if (hediffDef == null) return string.Empty; StringBuilder sb = new StringBuilder(); // 添加描述 if (!hediffDef.description.NullOrEmpty()) { sb.AppendLine(hediffDef.description); } return sb.ToString().TrimEndNewlines(); } return string.Empty; } public override IEnumerable CompGetGizmos() { // 只有玩家派系的pawn才显示Gizmo if (Pawn.Faction == Faction.OfPlayer && Props.availableHediffs.Count > 1) { // 主切换按钮 - 显示当前状态 Command_Action mainButton = new Command_Action { // 使用可自定义的标签,如果没有自定义则使用翻译键 defaultLabel = Props.switchLabel.Translate(), defaultDesc = "WULA_SwitchableHediff_CurrentMode".Translate(GetCurrentHediffName()) + "\n" + Props.switchDesc.Translate(), icon = ContentFinder.Get(Props.gizmoIconPath, false) ?? BaseContent.BadTex, action = () => { // 显示选择菜单 ShowHediffSelectionMenu(); }, hotKey = KeyBindingDefOf.Misc2 }; yield return mainButton; // 如果启用了状态显示,添加一个信息Gizmo if (Props.showStatusInGizmo) { Command_Action statusButton = new Command_Action { defaultLabel = Props.statusLabel.Translate(GetCurrentHediffName()), defaultDesc = Props.statusDesc.Translate() + "\n\n" + "WULA_SwitchableHediff_CurrentDesc".Translate(GetCurrentHediffDesc()), icon = ContentFinder.Get("UI/Commands/Info", false) ?? BaseContent.BadTex, action = () => { // 显示当前hediff的详细信息 ShowCurrentHediffInfo(); } }; yield return statusButton; } } } // 显示hediff选择菜单 private void ShowHediffSelectionMenu() { List options = new List(); for (int i = 0; i < Props.availableHediffs.Count; i++) { int index = i; // 捕获当前索引 var hediffDef = Props.availableHediffs[i]; string label = hediffDef?.label ?? "WULA_Unknown".Translate(); string description = GetHediffDetailedTooltip(i); // 获取详细工具提示 // 标记当前选择的项目 string prefix = (i == currentHediffIndex) ? "✓ " : " "; // 创建选项 var option = new FloatMenuOption( prefix + label, () => { SwitchToHediff(index); } ); // 设置工具提示 - 使用详细的描述信息 option.tooltip = description; options.Add(option); } // 显示浮动菜单 if (options.Count > 0) { Find.WindowStack.Add(new FloatMenu(options, "WULA_SwitchableHediff_SelectMode".Translate())); } } // 显示当前hediff的详细信息 private void ShowCurrentHediffInfo() { if (currentHediffIndex >= 0 && currentHediffIndex < Props.availableHediffs.Count) { var hediffDef = Props.availableHediffs[currentHediffIndex]; string description = GetHediffDetailedTooltip(currentHediffIndex); // 使用详细工具提示 Messages.Message( "WULA_SwitchableHediff_CurrentModeInfo".Translate(hediffDef?.label, description), MessageTypeDefOf.SilentInput ); } } public override string CompTipStringExtra { get { string baseTip = base.CompTipStringExtra ?? ""; string currentEffect = "WULA_SwitchableHediff_CurrentEffect".Translate(GetCurrentHediffName()); if (!string.IsNullOrEmpty(baseTip)) return baseTip + "\n" + currentEffect; else return currentEffect; } } public override string CompLabelInBracketsExtra { get { return GetCurrentHediffName(); } } public override void CompExposeData() { base.CompExposeData(); Scribe_Values.Look(ref currentHediffIndex, "currentHediffIndex", -1); // 加载后重新应用hediff if (Scribe.mode == LoadSaveMode.PostLoadInit && currentHediffIndex != -1) { ApplySelectedHediff(); } } // 当父hediff被移除时,也要移除激活的hediff public override void CompPostPostRemoved() { base.CompPostPostRemoved(); if (activeHediff != null && Pawn.health.hediffSet.hediffs.Contains(activeHediff)) { Pawn.health.RemoveHediff(activeHediff); } activeHediff = null; } } }