兴趣度训练器

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

Binary file not shown.

View File

@@ -513,4 +513,238 @@
</li>
</comps>
</ThingDef>
<!-- ==================== 热情训练器 ==================== -->
<!-- Melee -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Melee</defName>
<label>乌拉帝国兴趣度训练包(格斗)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发格斗兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<!-- 指定要获得兴趣度的技能 -->
<skill>Melee</skill>
<!-- 指定获得的兴趣度等级。可以是 Minor (小火,官方翻译好奇) 或 Major (大火,官方翻译狂热) -->
<passionGained>Major</passionGained>
<!-- 指定随机失去兴趣度的技能数量范围。格式为 min~max -->
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Shooting -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Shooting</defName>
<label>乌拉帝国兴趣度训练包(射击)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发射击兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Shooting</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Construction -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Construction</defName>
<label>乌拉帝国兴趣度训练包(建造)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发建造兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Construction</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Mining -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Mining</defName>
<label>乌拉帝国兴趣度训练包(采矿)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发采矿兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Mining</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Cooking -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Cooking</defName>
<label>乌拉帝国兴趣度训练包(烹饪)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发烹饪兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Cooking</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Plants -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Plants</defName>
<label>乌拉帝国兴趣度训练包(种植)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发种植兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Plants</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Animals -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Animals</defName>
<label>乌拉帝国兴趣度训练包(驯兽)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发驯兽兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Animals</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Crafting -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Crafting</defName>
<label>乌拉帝国兴趣度训练包(手工)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发手工兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Crafting</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Artistic -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Artistic</defName>
<label>乌拉帝国兴趣度训练包(艺术)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发艺术兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Artistic</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Medicine -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Medicine</defName>
<label>乌拉帝国兴趣度训练包(医疗)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发医疗兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Medicine</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Social -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Social</defName>
<label>乌拉帝国兴趣度训练包(社交)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发社交兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Social</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
<!-- Intellectual -->
<ThingDef ParentName="WULA_Syhth_Trainer">
<defName>WULA_Syhth_Passion_Trainer_Intellectual</defName>
<label>乌拉帝国兴趣度训练包(智识)</label>
<comps>
<li Class="CompProperties_Usable">
<useJob>UseNeurotrainer</useJob>
<useLabel>使用数据包激发智识兴趣</useLabel>
<showUseGizmo>true</showUseGizmo>
<userMustHaveHediff>Wula_Synth</userMustHaveHediff>
</li>
<li Class="WulaFallenEmpire.CompProperties_UseEffect_PassionTrainer">
<skill>Intellectual</skill>
<passionGained>Major</passionGained>
<passionsLostRange>0~1</passionsLostRange>
</li>
</comps>
</ThingDef>
</Defs>

View File

@@ -8,4 +8,13 @@
<WULA_MechSerumHealerNotWula>{0}不是机械乌拉,无法使用此修理套件。</WULA_MechSerumHealerNotWula>
<WULA_WulaMechRepairKit>机械乌拉修理套件</WULA_WulaMechRepairKit>
<!-- Passion Trainer Messages -->
<WULA_PassionGained>{0}对{1}技能燃起了新的热情!</WULA_PassionGained>
<WULA_PassionLost>作为代价,{0}失去了对{1}技能的热情。</WULA_PassionLost>
<!-- Vanilla Overrides for Passion Trainer -->
<PawnHasNoSkills>{0}没有技能系统,无法使用。</PawnHasNoSkills>
<SkillTrainerHasNoSkill>该训练器未指定目标技能。</SkillTrainerHasNoSkill>
<SkillDisabled>目标技能已被禁用,无法学习。</SkillDisabled>
</LanguageData>

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" />