using System.Collections.Generic; using System.Linq; using Verse; using RimWorld; namespace WulaFallenEmpire { // HediffCompProperties,用于在XML中配置组件的属性 public class HediffCompProperties_RegenerateBackstory : HediffCompProperties { public List spawnCategories; // 存储背景故事类别的列表 public bool regenerateChildhood = false; // 控制是否重新生成幼年时期故事,默认为false public HediffCompProperties_RegenerateBackstory() { this.compClass = typeof(HediffComp_RegenerateBackstory); } } // HediffComp的实际逻辑实现 public class HediffComp_RegenerateBackstory : HediffComp { private HediffCompProperties_RegenerateBackstory Props => (HediffCompProperties_RegenerateBackstory)this.props; public override void CompPostMake() { base.CompPostMake(); // 在Hediff被添加到Pawn时立即触发背景故事重新生成 // 使用一个延迟操作,确保Pawn完全初始化后再修改其故事 // 否则可能导致Pawn.story为null LongEventHandler.QueueLongEvent(RegenerateBackstory, "RegeneratingBackstory", false, null); } private void RegenerateBackstory() { Pawn pawn = this.parent.pawn; if (pawn == null || pawn.story == null) { WulaLog.Debug($"[WulaFallenEmpire] HediffComp_RegenerateBackstory: Pawn or Pawn.story is null for hediff {this.parent.def.defName}. Cannot regenerate backstory."); return; } // 获取指定的背景故事类别 List categories = new List(); if (Props.spawnCategories != null && Props.spawnCategories.Any()) { categories = Props.spawnCategories; } else { WulaLog.Debug($"[WulaFallenEmpire] HediffComp_RegenerateBackstory: No spawnCategories specified for hediff {this.parent.def.defName}. Using all available categories."); categories = DefDatabase.AllDefs.SelectMany(bs => bs.spawnCategories).Distinct().ToList(); // 如果没有指定类别,则使用所有类别 } // 尝试重新生成背景故事 BackstoryDef newChildhood = null; BackstoryDef newAdulthood = null; // 根据 regenerateChildhood 的值决定是否重新生成幼年时期故事 if (Props.regenerateChildhood) { // 筛选符合类别的幼年背景故事 List availableChildhoodBackstories = DefDatabase.AllDefsListForReading .Where(bs => bs.slot == BackstorySlot.Childhood && bs.spawnCategories.Any(cat => categories.Contains(cat))) .ToList(); // 随机选择幼年背景故事 if (availableChildhoodBackstories.Any()) { newChildhood = availableChildhoodBackstories.RandomElement(); } else { WulaLog.Debug($"[WulaFallenEmpire] HediffComp_RegenerateBackstory: No childhood backstories found for categories: {string.Join(", ", Props.spawnCategories ?? new List())}."); } } else { // 如果 regenerateChildhood 为 false,则保留原有的幼年时期故事 newChildhood = pawn.story.Childhood; } // 筛选符合类别的成年背景故事 List availableAdulthoodBackstories = DefDatabase.AllDefsListForReading .Where(bs => bs.slot == BackstorySlot.Adulthood && bs.spawnCategories.Any(cat => categories.Contains(cat))) .ToList(); // 随机选择成年背景故事 if (availableAdulthoodBackstories.Any()) { newAdulthood = availableAdulthoodBackstories.RandomElement(); } else { WulaLog.Debug($"[WulaFallenEmpire] HediffComp_RegenerateBackstory: No adulthood backstories found for categories: {string.Join(", ", Props.spawnCategories ?? new List())}."); } // 应用新的背景故事 if (newChildhood != null || newAdulthood != null) { pawn.story.Childhood = newChildhood; pawn.story.Adulthood = newAdulthood; WulaLog.Debug($"[WulaFallenEmpire] Regenerated backstory for {pawn.NameShortColored}: Childhood='{newChildhood?.title ?? "None"}', Adulthood='{newAdulthood?.title ?? "None"}'."); } else { WulaLog.Debug($"[WulaFallenEmpire] HediffComp_RegenerateBackstory: Failed to find any suitable backstories for {pawn.NameShortColored} with categories: {string.Join(", ", Props.spawnCategories ?? new List())}."); } // 删除当前的Hediff pawn.health.RemoveHediff(this.parent); WulaLog.Debug($"[WulaFallenEmpire] Removed hediff {this.parent.def.defName} from {pawn.NameShortColored} after backstory regeneration."); } } }