diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 60effdc0..ef4872e6 100644 Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/Defs/AbilityDefs/WULA_Abilities.xml b/1.6/Defs/AbilityDefs/WULA_Abilities.xml index e02ce58f..f36405e7 100644 --- a/1.6/Defs/AbilityDefs/WULA_Abilities.xml +++ b/1.6/Defs/AbilityDefs/WULA_Abilities.xml @@ -1,44 +1,4 @@ - - WULA_SelfSkip - - 将施法者传送到附近的目标位置。 - 4 - UI/Abilities/Skip - True - False - Misc9 - false - - 25 - 0.02 - - - 0.25 - 27.9 - - True - True - True - - - -
  • - WulaFallenEmpire.CompAbilityEffect_SelfSkip - Selected - True - 27.9 - Ability - 10 - Ability - 10 - 18~60 - -15 - False -
  • -
    -
    -
    \ No newline at end of file diff --git a/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml b/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml index 563bbd39..0daff52c 100644 --- a/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml +++ b/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml @@ -5,8 +5,8 @@ WULA_Ritual_TechOffering 乌拉帝国用于交换失落技术的灵能仪式。通过献上高价值的科技产品,帝国可以从时空的裂隙中获得罕见的武器或工具。 - 0.5 - 360 + 2 + 10 BasicPsychicRituals UI/PsychicRituals/PsychicRitual_Default @@ -101,4 +101,26 @@ + + WULA_ImbuePsychicShock + + Imbues the target with a psychic shock. + PsychicShock + The target will gain psychic shock. + 2 + DeathRefusalTarget + BasicPsychicRituals + + + +
  • Bioferrite
  • +
    +
    + 10 +
    + 10 + ChanterAdvanced + UI/PsychicRituals/PsychicRitual_ImbueDeathRefusal +
    + \ No newline at end of file diff --git a/Source/WulaFallenEmpire/PsychicRitualDef_AddHediff.cs b/Source/WulaFallenEmpire/PsychicRitualDef_AddHediff.cs new file mode 100644 index 00000000..a0e63cdb --- /dev/null +++ b/Source/WulaFallenEmpire/PsychicRitualDef_AddHediff.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using Verse; +using Verse.AI.Group; +using RimWorld; + +namespace WulaFallenEmpire +{ + public class PsychicRitualDef_AddHediff : PsychicRitualDef_InvocationCircle + { + public HediffDef hediff; + + public override List CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent) + { + List list = base.CreateToils(psychicRitual, parent); + list.Add(new PsychicRitualToil_AddHediff(TargetRole, hediff)); + list.Add(new PsychicRitualToil_TargetCleanup(InvokerRole, TargetRole)); + return list; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/PsychicRitualToil_AddHediff.cs b/Source/WulaFallenEmpire/PsychicRitualToil_AddHediff.cs new file mode 100644 index 00000000..dd70d763 --- /dev/null +++ b/Source/WulaFallenEmpire/PsychicRitualToil_AddHediff.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using RimWorld; +using Verse; +using Verse.AI.Group; + +namespace WulaFallenEmpire +{ + public class PsychicRitualToil_AddHediff : PsychicRitualToil + { + public PsychicRitualRoleDef targetRole; + public HediffDef hediff; + + private static List tmpTargetPawns = new List(4); + + public PsychicRitualToil_AddHediff() + { + } + + public PsychicRitualToil_AddHediff(PsychicRitualRoleDef targetRole, HediffDef hediff) + { + this.targetRole = targetRole; + this.hediff = hediff; + } + + public override void Start(PsychicRitual psychicRitual, PsychicRitualGraph graph) + { + tmpTargetPawns.Clear(); + tmpTargetPawns.AddRange(psychicRitual.assignments.AssignedPawns(targetRole)); + foreach (Pawn tmpTargetPawn in tmpTargetPawns) + { + ApplyOutcome(psychicRitual, tmpTargetPawn); + } + } + + private void ApplyOutcome(PsychicRitual psychicRitual, Pawn pawn) + { + if (hediff != null) + { + pawn.health.AddHediff(hediff); + } + + if (PawnUtility.ShouldSendNotificationAbout(pawn)) + { + Find.LetterStack.ReceiveLetter("PsychicRitualCompleteLabel".Translate(psychicRitual.def.label), ((PsychicRitualDef_AddHediff)psychicRitual.def).outcomeDescription.Formatted(pawn.Named("PAWN")), LetterDefOf.NeutralEvent, pawn); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Defs.Look(ref targetRole, "targetRole"); + Scribe_Defs.Look(ref hediff, "hediff"); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs b/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs index 39dfd913..47e2ac8b 100644 --- a/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs +++ b/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs @@ -21,9 +21,6 @@ namespace WulaFallenEmpire public class PsychicRitual_TechOffering : PsychicRitualDef_InvocationCircle { - // 仪式持续时间(小时) - public new FloatRange hoursUntilOutcome; - // 从XML加载的额外祭品列表 public List extraOfferings = new List(); @@ -42,48 +39,73 @@ namespace WulaFallenEmpire IntVec3 center = assignments.Target.Cell; Map map = assignments.Target.Map; float offeringRadius = 8f; + var thingsInRadius = GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true).ToList(); - float extraPowerFromOfferings = 0f; - if (!extraOfferings.NullOrEmpty()) + // 创建一个可变的必需品计数器 + var requiredCounts = new Dictionary(); + if (this.requiredOffering != null) { - var offeringThings = new Dictionary(); - foreach(var offering in extraOfferings) + foreach (ThingDef thingDef in this.requiredOffering.filter.AllowedThingDefs) { - offeringThings[offering.thingDef] = offering.power; - } - - foreach (Thing thing in GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true)) - { - if (offeringThings.TryGetValue(thing.def, out float value)) - { - extraPowerFromOfferings += value * thing.stackCount; - } + requiredCounts[thingDef] = (int)this.requiredOffering.GetBaseCount(); } } - if (extraPowerFromOfferings > 0) + float extraPowerFromOfferings = 0f; + int offeringItemsCount = 0; + + if (!extraOfferings.NullOrEmpty()) { + var extraOfferingInfo = extraOfferings.ToDictionary(o => o.thingDef, o => o.power); + + // 遍历仪式范围内的所有物品 + foreach (Thing thing in thingsInRadius) + { + // 检查这个物品是否可以作为额外祭品 + if (extraOfferingInfo.TryGetValue(thing.def, out float powerPerItem)) + { + int countInStack = thing.stackCount; + + // 检查这个物品是否是必需品,并扣除相应数量 + if (requiredCounts.TryGetValue(thing.def, out int requiredCount) && requiredCount > 0) + { + int numToFulfillRequirement = System.Math.Min(countInStack, requiredCount); + requiredCounts[thing.def] -= numToFulfillRequirement; + countInStack -= numToFulfillRequirement; + } + + // 任何剩余的物品都算作额外祭品 + if (countInStack > 0) + { + extraPowerFromOfferings += powerPerItem * countInStack; + offeringItemsCount += countInStack; + } + } + } + + // 添加UI显示元素 powerFactorsOut?.Add(new QualityFactor { label = "WULA_ExtraOfferings".Translate(), - positive = true, + positive = offeringItemsCount > 0, quality = extraPowerFromOfferings, - toolTip = "WULA_ExtraOfferings_Tooltip".Translate() + toolTip = "WULA_ExtraOfferings_Tooltip".Translate(), + count = offeringItemsCount > 0 ? "✓" : "✗" // 使用对勾/叉号来清晰显示状态 }); - power += extraPowerFromOfferings; } - + + power += extraPowerFromOfferings; power = UnityEngine.Mathf.Clamp01(power); } // 重写创建仪式步骤的方法 public override List CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent) { - // 获取基类的仪式步骤 + // 获取基类的仪式步骤,这其中已经包含了等待 hoursUntilOutcome 的逻辑 List toils = base.CreateToils(psychicRitual, parent); - // 在最后添加我们自定义的奖励步骤 - toils.Add(new PsychicRitualToil_TechOfferingOutcome(psychicRitual, this)); + // 在所有基类步骤之后,添加我们自定义的奖励步骤 + toils.Add(new PsychicRitualToil_TechOfferingOutcome(this)); return toils; } @@ -92,26 +114,31 @@ namespace WulaFallenEmpire // 自定义的仪式步骤,用于处理奖励 public class PsychicRitualToil_TechOfferingOutcome : PsychicRitualToil { - private PsychicRitual psychicRitual; - private PsychicRitualDef def; + private PsychicRitual_TechOffering ritualDef; - public PsychicRitualToil_TechOfferingOutcome(PsychicRitual psychicRitual, PsychicRitualDef def) + // 需要一个无参构造函数用于序列化 + public PsychicRitualToil_TechOfferingOutcome() { } + + public PsychicRitualToil_TechOfferingOutcome(PsychicRitual_TechOffering def) { - this.psychicRitual = psychicRitual; - this.def = def; + this.ritualDef = def; + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Defs.Look(ref ritualDef, "ritualDef"); } - public override bool Tick(PsychicRitual psychicRitual, PsychicRitualGraph parent) + public override void Start(PsychicRitual psychicRitual, PsychicRitualGraph graph) { - float power = psychicRitual.power; + float power = psychicRitual.PowerPercent; // 消耗祭品 IntVec3 center = psychicRitual.assignments.Target.Cell; Map map = psychicRitual.assignments.Target.Map; float offeringRadius = 8f; - PsychicRitual_TechOffering ritualDef = (PsychicRitual_TechOffering)def; - if (!ritualDef.extraOfferings.NullOrEmpty()) { var offeringThings = new Dictionary(); @@ -132,32 +159,31 @@ namespace WulaFallenEmpire // 从奖励池中随机选择一个武器 if (ritualDef.rewardWeaponPool.NullOrEmpty()) { - Log.Error($"[WulaFallenEmpire] Reward weapon pool is empty for {def.defName}"); - return true; + Log.Error($"[WulaFallenEmpire] Reward weapon pool is empty for {ritualDef.defName}"); + return; } ThingDef weaponDef = ritualDef.rewardWeaponPool.RandomElement(); if (weaponDef == null) { - Log.Error($"[WulaFallenEmpire] Could not find weapon Def: {weaponDef.defName}"); - return true; + Log.Error($"[WulaFallenEmpire] Could not find weapon Def in reward pool for {ritualDef.defName}"); + return; } // 根据能量值决定物品品质 QualityCategory quality = QualityCategory.Awful; // 默认最低品质 if (!ritualDef.qualityThresholds.NullOrEmpty()) { - // 对阈值列表按阈值从高到低排序 var sortedThresholds = ritualDef.qualityThresholds.OrderByDescending(t => t.threshold).ToList(); foreach (var threshold in sortedThresholds) { if (power >= threshold.threshold) { quality = threshold.quality; - break; // 找到第一个满足的阈值就跳出 + break; } } } - else // 如果XML中没有定义,则使用硬编码的默认值 + else { if (power >= 1.0f) { quality = QualityCategory.Legendary; } else if (power >= 0.8f) { quality = QualityCategory.Masterwork; } @@ -168,8 +194,7 @@ namespace WulaFallenEmpire // 创建物品并设置品质 Thing reward = ThingMaker.MakeThing(weaponDef); - CompQuality compQuality = reward.TryGetComp(); - if (compQuality != null) + if (reward.TryGetComp() is CompQuality compQuality) { compQuality.SetQuality(quality, ArtGenerationContext.Colony); } @@ -184,8 +209,6 @@ namespace WulaFallenEmpire LetterDefOf.PositiveEvent, new LookTargets(psychicRitual.assignments.Target.Cell, map) ); - - return true; } } } \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 8dea8b0f..a443348f 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -121,6 +121,8 @@ + +