修仪式
This commit is contained in:
Binary file not shown.
@@ -1,44 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
<Defs>
|
<Defs>
|
||||||
|
|
||||||
<AbilityDef ParentName="PsycastBaseSkip">
|
|
||||||
<defName>WULA_SelfSkip</defName>
|
|
||||||
<label>自身折跃</label>
|
|
||||||
<description>将施法者传送到附近的目标位置。</description>
|
|
||||||
<level>4</level>
|
|
||||||
<iconPath>UI/Abilities/Skip</iconPath>
|
|
||||||
<writeCombatLog>True</writeCombatLog>
|
|
||||||
<showPsycastEffects>False</showPsycastEffects>
|
|
||||||
<hotKey>Misc9</hotKey>
|
|
||||||
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
|
|
||||||
<statBases>
|
|
||||||
<Ability_EntropyGain>25</Ability_EntropyGain>
|
|
||||||
<Ability_PsyfocusCost>0.02</Ability_PsyfocusCost>
|
|
||||||
</statBases>
|
|
||||||
<verbProperties>
|
|
||||||
<warmupTime>0.25</warmupTime>
|
|
||||||
<range>27.9</range>
|
|
||||||
<targetParams>
|
|
||||||
<canTargetSelf>True</canTargetSelf>
|
|
||||||
<canTargetAnimals>True</canTargetAnimals>
|
|
||||||
<canTargetItems>True</canTargetItems>
|
|
||||||
</targetParams>
|
|
||||||
</verbProperties>
|
|
||||||
<comps>
|
|
||||||
<li Class="CompProperties_AbilityTeleport">
|
|
||||||
<compClass>WulaFallenEmpire.CompAbilityEffect_SelfSkip</compClass>
|
|
||||||
<destination>Selected</destination>
|
|
||||||
<requiresLineOfSight>True</requiresLineOfSight>
|
|
||||||
<range>27.9</range>
|
|
||||||
<clamorType>Ability</clamorType>
|
|
||||||
<clamorRadius>10</clamorRadius>
|
|
||||||
<destClamorType>Ability</destClamorType>
|
|
||||||
<destClamorRadius>10</destClamorRadius>
|
|
||||||
<stunTicks>18~60</stunTicks>
|
|
||||||
<goodwillImpact>-15</goodwillImpact>
|
|
||||||
<applyGoodwillImpactToLodgers>False</applyGoodwillImpactToLodgers>
|
|
||||||
</li>
|
|
||||||
</comps>
|
|
||||||
</AbilityDef>
|
|
||||||
|
|
||||||
</Defs>
|
</Defs>
|
||||||
@@ -5,8 +5,8 @@
|
|||||||
<defName>WULA_Ritual_TechOffering</defName>
|
<defName>WULA_Ritual_TechOffering</defName>
|
||||||
<label>帝国技术献祭</label>
|
<label>帝国技术献祭</label>
|
||||||
<description>乌拉帝国用于交换失落技术的灵能仪式。通过献上高价值的科技产品,帝国可以从时空的裂隙中获得罕见的武器或工具。</description>
|
<description>乌拉帝国用于交换失落技术的灵能仪式。通过献上高价值的科技产品,帝国可以从时空的裂隙中获得罕见的武器或工具。</description>
|
||||||
<hoursUntilOutcome>0.5</hoursUntilOutcome>
|
<hoursUntilOutcome>2</hoursUntilOutcome>
|
||||||
<cooldownHours>360</cooldownHours>
|
<cooldownHours>10</cooldownHours>
|
||||||
<researchPrerequisite>BasicPsychicRituals</researchPrerequisite>
|
<researchPrerequisite>BasicPsychicRituals</researchPrerequisite>
|
||||||
<iconPath>UI/PsychicRituals/PsychicRitual_Default</iconPath>
|
<iconPath>UI/PsychicRituals/PsychicRitual_Default</iconPath>
|
||||||
|
|
||||||
@@ -101,4 +101,26 @@
|
|||||||
|
|
||||||
</WulaFallenEmpire.PsychicRitual_TechOffering>
|
</WulaFallenEmpire.PsychicRitual_TechOffering>
|
||||||
|
|
||||||
|
<WulaFallenEmpire.PsychicRitualDef_AddHediff>
|
||||||
|
<defName>WULA_ImbuePsychicShock</defName>
|
||||||
|
<label>imbue psychic shock</label>
|
||||||
|
<description>Imbues the target with a psychic shock.</description>
|
||||||
|
<hediff>PsychicShock</hediff>
|
||||||
|
<outcomeDescription>The target will gain psychic shock.</outcomeDescription>
|
||||||
|
<hoursUntilOutcome>2</hoursUntilOutcome>
|
||||||
|
<targetRole>DeathRefusalTarget</targetRole> <!-- We can reuse this role -->
|
||||||
|
<researchPrerequisite>BasicPsychicRituals</researchPrerequisite>
|
||||||
|
<requiredOffering>
|
||||||
|
<filter>
|
||||||
|
<thingDefs>
|
||||||
|
<li>Bioferrite</li>
|
||||||
|
</thingDefs>
|
||||||
|
</filter>
|
||||||
|
<count>10</count>
|
||||||
|
</requiredOffering>
|
||||||
|
<cooldownHours>10</cooldownHours>
|
||||||
|
<chanterRole>ChanterAdvanced</chanterRole>
|
||||||
|
<iconPath>UI/PsychicRituals/PsychicRitual_ImbueDeathRefusal</iconPath>
|
||||||
|
</WulaFallenEmpire.PsychicRitualDef_AddHediff>
|
||||||
|
|
||||||
</Defs>
|
</Defs>
|
||||||
20
Source/WulaFallenEmpire/PsychicRitualDef_AddHediff.cs
Normal file
20
Source/WulaFallenEmpire/PsychicRitualDef_AddHediff.cs
Normal file
@@ -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<PsychicRitualToil> CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent)
|
||||||
|
{
|
||||||
|
List<PsychicRitualToil> list = base.CreateToils(psychicRitual, parent);
|
||||||
|
list.Add(new PsychicRitualToil_AddHediff(TargetRole, hediff));
|
||||||
|
list.Add(new PsychicRitualToil_TargetCleanup(InvokerRole, TargetRole));
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
55
Source/WulaFallenEmpire/PsychicRitualToil_AddHediff.cs
Normal file
55
Source/WulaFallenEmpire/PsychicRitualToil_AddHediff.cs
Normal file
@@ -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<Pawn> tmpTargetPawns = new List<Pawn>(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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,9 +21,6 @@ namespace WulaFallenEmpire
|
|||||||
|
|
||||||
public class PsychicRitual_TechOffering : PsychicRitualDef_InvocationCircle
|
public class PsychicRitual_TechOffering : PsychicRitualDef_InvocationCircle
|
||||||
{
|
{
|
||||||
// 仪式持续时间(小时)
|
|
||||||
public new FloatRange hoursUntilOutcome;
|
|
||||||
|
|
||||||
// 从XML加载的额外祭品列表
|
// 从XML加载的额外祭品列表
|
||||||
public List<OfferingItem> extraOfferings = new List<OfferingItem>();
|
public List<OfferingItem> extraOfferings = new List<OfferingItem>();
|
||||||
|
|
||||||
@@ -42,48 +39,73 @@ namespace WulaFallenEmpire
|
|||||||
IntVec3 center = assignments.Target.Cell;
|
IntVec3 center = assignments.Target.Cell;
|
||||||
Map map = assignments.Target.Map;
|
Map map = assignments.Target.Map;
|
||||||
float offeringRadius = 8f;
|
float offeringRadius = 8f;
|
||||||
|
var thingsInRadius = GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true).ToList();
|
||||||
|
|
||||||
float extraPowerFromOfferings = 0f;
|
// 创建一个可变的必需品计数器
|
||||||
if (!extraOfferings.NullOrEmpty())
|
var requiredCounts = new Dictionary<ThingDef, int>();
|
||||||
|
if (this.requiredOffering != null)
|
||||||
{
|
{
|
||||||
var offeringThings = new Dictionary<ThingDef, float>();
|
foreach (ThingDef thingDef in this.requiredOffering.filter.AllowedThingDefs)
|
||||||
foreach(var offering in extraOfferings)
|
|
||||||
{
|
{
|
||||||
offeringThings[offering.thingDef] = offering.power;
|
requiredCounts[thingDef] = (int)this.requiredOffering.GetBaseCount();
|
||||||
}
|
|
||||||
|
|
||||||
foreach (Thing thing in GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true))
|
|
||||||
{
|
|
||||||
if (offeringThings.TryGetValue(thing.def, out float value))
|
|
||||||
{
|
|
||||||
extraPowerFromOfferings += value * thing.stackCount;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
powerFactorsOut?.Add(new QualityFactor
|
||||||
{
|
{
|
||||||
label = "WULA_ExtraOfferings".Translate(),
|
label = "WULA_ExtraOfferings".Translate(),
|
||||||
positive = true,
|
positive = offeringItemsCount > 0,
|
||||||
quality = extraPowerFromOfferings,
|
quality = extraPowerFromOfferings,
|
||||||
toolTip = "WULA_ExtraOfferings_Tooltip".Translate()
|
toolTip = "WULA_ExtraOfferings_Tooltip".Translate(),
|
||||||
|
count = offeringItemsCount > 0 ? "✓" : "✗" // 使用对勾/叉号来清晰显示状态
|
||||||
});
|
});
|
||||||
power += extraPowerFromOfferings;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
power += extraPowerFromOfferings;
|
||||||
power = UnityEngine.Mathf.Clamp01(power);
|
power = UnityEngine.Mathf.Clamp01(power);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 重写创建仪式步骤的方法
|
// 重写创建仪式步骤的方法
|
||||||
public override List<PsychicRitualToil> CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent)
|
public override List<PsychicRitualToil> CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent)
|
||||||
{
|
{
|
||||||
// 获取基类的仪式步骤
|
// 获取基类的仪式步骤,这其中已经包含了等待 hoursUntilOutcome 的逻辑
|
||||||
List<PsychicRitualToil> toils = base.CreateToils(psychicRitual, parent);
|
List<PsychicRitualToil> toils = base.CreateToils(psychicRitual, parent);
|
||||||
|
|
||||||
// 在最后添加我们自定义的奖励步骤
|
// 在所有基类步骤之后,添加我们自定义的奖励步骤
|
||||||
toils.Add(new PsychicRitualToil_TechOfferingOutcome(psychicRitual, this));
|
toils.Add(new PsychicRitualToil_TechOfferingOutcome(this));
|
||||||
|
|
||||||
return toils;
|
return toils;
|
||||||
}
|
}
|
||||||
@@ -92,26 +114,31 @@ namespace WulaFallenEmpire
|
|||||||
// 自定义的仪式步骤,用于处理奖励
|
// 自定义的仪式步骤,用于处理奖励
|
||||||
public class PsychicRitualToil_TechOfferingOutcome : PsychicRitualToil
|
public class PsychicRitualToil_TechOfferingOutcome : PsychicRitualToil
|
||||||
{
|
{
|
||||||
private PsychicRitual psychicRitual;
|
private PsychicRitual_TechOffering ritualDef;
|
||||||
private PsychicRitualDef def;
|
|
||||||
|
|
||||||
public PsychicRitualToil_TechOfferingOutcome(PsychicRitual psychicRitual, PsychicRitualDef def)
|
// 需要一个无参构造函数用于序列化
|
||||||
|
public PsychicRitualToil_TechOfferingOutcome() { }
|
||||||
|
|
||||||
|
public PsychicRitualToil_TechOfferingOutcome(PsychicRitual_TechOffering def)
|
||||||
{
|
{
|
||||||
this.psychicRitual = psychicRitual;
|
this.ritualDef = def;
|
||||||
this.def = 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;
|
IntVec3 center = psychicRitual.assignments.Target.Cell;
|
||||||
Map map = psychicRitual.assignments.Target.Map;
|
Map map = psychicRitual.assignments.Target.Map;
|
||||||
float offeringRadius = 8f;
|
float offeringRadius = 8f;
|
||||||
|
|
||||||
PsychicRitual_TechOffering ritualDef = (PsychicRitual_TechOffering)def;
|
|
||||||
|
|
||||||
if (!ritualDef.extraOfferings.NullOrEmpty())
|
if (!ritualDef.extraOfferings.NullOrEmpty())
|
||||||
{
|
{
|
||||||
var offeringThings = new Dictionary<ThingDef, float>();
|
var offeringThings = new Dictionary<ThingDef, float>();
|
||||||
@@ -132,32 +159,31 @@ namespace WulaFallenEmpire
|
|||||||
// 从奖励池中随机选择一个武器
|
// 从奖励池中随机选择一个武器
|
||||||
if (ritualDef.rewardWeaponPool.NullOrEmpty())
|
if (ritualDef.rewardWeaponPool.NullOrEmpty())
|
||||||
{
|
{
|
||||||
Log.Error($"[WulaFallenEmpire] Reward weapon pool is empty for {def.defName}");
|
Log.Error($"[WulaFallenEmpire] Reward weapon pool is empty for {ritualDef.defName}");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
ThingDef weaponDef = ritualDef.rewardWeaponPool.RandomElement();
|
ThingDef weaponDef = ritualDef.rewardWeaponPool.RandomElement();
|
||||||
if (weaponDef == null)
|
if (weaponDef == null)
|
||||||
{
|
{
|
||||||
Log.Error($"[WulaFallenEmpire] Could not find weapon Def: {weaponDef.defName}");
|
Log.Error($"[WulaFallenEmpire] Could not find weapon Def in reward pool for {ritualDef.defName}");
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据能量值决定物品品质
|
// 根据能量值决定物品品质
|
||||||
QualityCategory quality = QualityCategory.Awful; // 默认最低品质
|
QualityCategory quality = QualityCategory.Awful; // 默认最低品质
|
||||||
if (!ritualDef.qualityThresholds.NullOrEmpty())
|
if (!ritualDef.qualityThresholds.NullOrEmpty())
|
||||||
{
|
{
|
||||||
// 对阈值列表按阈值从高到低排序
|
|
||||||
var sortedThresholds = ritualDef.qualityThresholds.OrderByDescending(t => t.threshold).ToList();
|
var sortedThresholds = ritualDef.qualityThresholds.OrderByDescending(t => t.threshold).ToList();
|
||||||
foreach (var threshold in sortedThresholds)
|
foreach (var threshold in sortedThresholds)
|
||||||
{
|
{
|
||||||
if (power >= threshold.threshold)
|
if (power >= threshold.threshold)
|
||||||
{
|
{
|
||||||
quality = threshold.quality;
|
quality = threshold.quality;
|
||||||
break; // 找到第一个满足的阈值就跳出
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // 如果XML中没有定义,则使用硬编码的默认值
|
else
|
||||||
{
|
{
|
||||||
if (power >= 1.0f) { quality = QualityCategory.Legendary; }
|
if (power >= 1.0f) { quality = QualityCategory.Legendary; }
|
||||||
else if (power >= 0.8f) { quality = QualityCategory.Masterwork; }
|
else if (power >= 0.8f) { quality = QualityCategory.Masterwork; }
|
||||||
@@ -168,8 +194,7 @@ namespace WulaFallenEmpire
|
|||||||
|
|
||||||
// 创建物品并设置品质
|
// 创建物品并设置品质
|
||||||
Thing reward = ThingMaker.MakeThing(weaponDef);
|
Thing reward = ThingMaker.MakeThing(weaponDef);
|
||||||
CompQuality compQuality = reward.TryGetComp<CompQuality>();
|
if (reward.TryGetComp<CompQuality>() is CompQuality compQuality)
|
||||||
if (compQuality != null)
|
|
||||||
{
|
{
|
||||||
compQuality.SetQuality(quality, ArtGenerationContext.Colony);
|
compQuality.SetQuality(quality, ArtGenerationContext.Colony);
|
||||||
}
|
}
|
||||||
@@ -184,8 +209,6 @@ namespace WulaFallenEmpire
|
|||||||
LetterDefOf.PositiveEvent,
|
LetterDefOf.PositiveEvent,
|
||||||
new LookTargets(psychicRitual.assignments.Target.Cell, map)
|
new LookTargets(psychicRitual.assignments.Target.Cell, map)
|
||||||
);
|
);
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,6 +121,8 @@
|
|||||||
<Compile Include="PsychicRitual_TechOffering.cs" />
|
<Compile Include="PsychicRitual_TechOffering.cs" />
|
||||||
<Compile Include="CompPsychicScaling.cs" />
|
<Compile Include="CompPsychicScaling.cs" />
|
||||||
<Compile Include="HarmonyPatches\HealthTracker_PreApplyDamage_Patch.cs" />
|
<Compile Include="HarmonyPatches\HealthTracker_PreApplyDamage_Patch.cs" />
|
||||||
|
<Compile Include="PsychicRitualDef_AddHediff.cs" />
|
||||||
|
<Compile Include="PsychicRitualToil_AddHediff.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
<!-- 自定义清理任务,删除obj文件夹中的临时文件 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user