兴趣度训练器

This commit is contained in:
2025-07-24 14:14:58 +08:00
parent a02373059d
commit b6fb9dfd4c
6 changed files with 331 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
using RimWorld;
using Verse;
using System.Collections.Generic;
using System.Linq;
namespace WulaFallenEmpire
{
public class CompProperties_UseEffect_PassionTrainer : CompProperties_UseEffect
{
public SkillDef skill;
public Passion passionGained = Passion.Major; // 可配置获得的热情等级,默认为大火
public IntRange passionsLostRange = new IntRange(1, 1); // 可配置失去热情的技能数量范围
public CompProperties_UseEffect_PassionTrainer()
{
compClass = typeof(CompUseEffect_PassionTrainer);
}
}
public class CompUseEffect_PassionTrainer : CompUseEffect
{
public CompProperties_UseEffect_PassionTrainer Props => (CompProperties_UseEffect_PassionTrainer)props;
public override void DoEffect(Pawn usedBy)
{
base.DoEffect(usedBy);
if (usedBy.skills == null || Props.skill == null)
{
return;
}
// 1. 为指定技能设置热情
SkillRecord targetSkillRecord = usedBy.skills.GetSkill(Props.skill);
if (targetSkillRecord != null && !targetSkillRecord.TotallyDisabled)
{
if (targetSkillRecord.passion != Props.passionGained)
{
targetSkillRecord.passion = Props.passionGained;
Messages.Message("WULA_PassionGained".Translate(usedBy.LabelShort, targetSkillRecord.def.label), usedBy, MessageTypeDefOf.PositiveEvent);
}
}
// 2. 确定要移除的热情数量
int numToLose = Props.passionsLostRange.RandomInRange;
if (numToLose <= 0)
{
return; // 如果随机到0或更少则不移除任何热情
}
// 3. 找到所有其他拥有热情的技能
List<SkillRecord> skillsWithPassion = usedBy.skills.skills
.Where(s => s.def != Props.skill && s.passion > Passion.None && !s.TotallyDisabled)
.ToList();
skillsWithPassion.Shuffle(); // 打乱列表以实现随机性
// 4. 移除指定数量技能的热情
int passionsRemoved = 0;
foreach (var skillToLosePassion in skillsWithPassion)
{
if (passionsRemoved >= numToLose) break;
skillToLosePassion.passion = Passion.None;
Messages.Message("WULA_PassionLost".Translate(usedBy.LabelShort, skillToLosePassion.def.label), usedBy, MessageTypeDefOf.NegativeEvent);
passionsRemoved++;
}
}
public override AcceptanceReport CanBeUsedBy(Pawn p)
{
if (p.skills == null)
{
return "PawnHasNoSkills".Translate(p.LabelShort);
}
if (Props.skill == null)
{
return "SkillTrainerHasNoSkill".Translate(parent.LabelShort);
}
if (p.skills.GetSkill(Props.skill).TotallyDisabled)
{
return "SkillDisabled".Translate();
}
return base.CanBeUsedBy(p);
}
}
}

View File

@@ -86,6 +86,7 @@
<Compile Include="JobDriver_FeedWulaPatient.cs" />
<Compile Include="WulaStatDefOf.cs" />
<Compile Include="CompUseEffect_WulaSkillTrainer.cs" />
<Compile Include="CompUseEffect_PassionTrainer.cs" />
<Compile Include="CompUseEffect_FixAllHealthConditions.cs" />
<Compile Include="Recipe_AdministerWulaMechRepairKit.cs" />
<Compile Include="Verb_ShootBeamExplosive.cs" />