各种更新

This commit is contained in:
2025-09-26 17:08:25 +08:00
parent f337d58ef2
commit bb634af947
12 changed files with 319 additions and 10 deletions

Binary file not shown.

View File

@@ -842,7 +842,7 @@
<AbilityDef>
<defName>ARA_TerrainHeal_Ability</defName>
<label>护士装疗愈</label>
<description>治疗目标,使其在一段时间内快速愈合。</description>
<description>从菌毯的营养管线抽取生物质,快速合成治愈素治疗目标,使其在一段时间内快速愈合。</description>
<iconPath>UI/Abilities/Longjump</iconPath>
<cooldownTicksRange>3800</cooldownTicksRange>
<cooldownPerCharge>true</cooldownPerCharge>
@@ -867,19 +867,19 @@
</targetParams>
</verbProperties>
<comps>
<li Class="CompProperties_AbilityGiveHediff">
<compClass>CompAbilityEffect_GiveHediff</compClass>
<hediffDef>ARA_Heal_By_Nurse_Hediff</hediffDef>
<replaceExisting>true</replaceExisting>
<durationSecondsOverride>20~30</durationSecondsOverride>
<applicableToMechs>False</applicableToMechs>
<li Class="ArachnaeSwarm.CompProperties_AbilityGiveHediffWithSkillDuration">
<hediffDef>ARA_Heal_By_Nurse_Hediff</hediffDef>
<baseDurationSeconds>30</baseDurationSeconds>
<skillDef>Medicine</skillDef>
<extraSecondsPerSkillLevel>5</extraSecondsPerSkillLevel>
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityTerrainRestriction">
<terrainDefs>
<li>ARA_InsectCreep</li>
<li>ARA_InsectCreepFloor</li>
</terrainDefs>
<casterTerrainFailMessage>在阿拉克涅菌毯上才能使用此技能</casterTerrainFailMessage>
<disabledReasonKey>不在阿拉克涅菌毯上</disabledReasonKey>
<!-- <casterTerrainFailMessage>在阿拉克涅菌毯上才能使用此技能</casterTerrainFailMessage>
<disabledReasonKey>不在阿拉克涅菌毯上</disabledReasonKey> -->
</li>
</comps>
</AbilityDef>

View File

@@ -17,6 +17,7 @@
<!--<li>SterileTile</li> 无菌地砖 -->
<!-- 您可以在这里添加更多地形, 比如: -->
<li>ARA_InsectCreep</li>
<li>ARA_InsectCreepFloor</li>
</terrainDefs>
<!-- 站在目标地形上时,每次检查的严重性变化量 -->

View File

@@ -33,6 +33,7 @@
<fertility>0.5</fertility>
<affordances Inherit="False">
<li>ARA_Creep</li>
<li>Walkable</li>
<li>Light</li>
<li>Medium</li>
<li>Heavy</li>
@@ -48,6 +49,53 @@
<li>Insect</li>
</tags> -->
</TerrainDef>
<TerrainDef ParentName="FloorBase">
<defName>ARA_InsectCreepFloor</defName>
<label>阿拉克涅强固菌毯</label>
<description>由阿拉克涅虫族所铺设的由真菌、甲壳素分泌物混合得到的地面,性质类似于阿拉克涅菌毯,不过可以在支撑结构上蔓延。</description>
<texturePath>Terrain/Surfaces/InsectSludge</texturePath>
<color>(233, 96, 34)</color>
<designationCategory>ARA_Buildings</designationCategory>
<fertility>0</fertility>
<edgeType>FadeRough</edgeType>
<renderPrecedence>399</renderPrecedence>
<constructEffect>ConstructMetal</constructEffect>
<isPaintable>true</isPaintable>
<designationCategory>ARA_Buildings</designationCategory>
<isFoundation>true</isFoundation>
<preventCraters>true</preventCraters>
<designationHotKey>Misc9</designationHotKey>
<affordances>
<li>ARA_Creep</li>
<li>Substructure</li>
</affordances>
<statBases>
<Beauty>-6</Beauty>
<CleaningTimeFactor>0.25</CleaningTimeFactor>
<Cleanliness>0</Cleanliness>
<Flammability>0</Flammability>
<WorkToBuild>100</WorkToBuild>
</statBases>
<costList>
<GravlitePanel>1</GravlitePanel>
<ARA_Carapace>4</ARA_Carapace>
</costList>
<uiOrder>1000</uiOrder>
<requireInspectedGravEngine>true</requireInspectedGravEngine>
<terrainAffordanceNeeded>Walkable</terrainAffordanceNeeded>
<resourcesFractionWhenDeconstructed>1</resourcesFractionWhenDeconstructed>
<tags>
<li>ARA_Creep</li>
<li>Substructure</li>
</tags>
<placeWorkers>
<li>PlaceWorker_InSubstructureFootprint</li>
<li>PlaceWorker_BuildingsValidOverSubstructure</li>
</placeWorkers>
</TerrainDef>
<ThingDef ParentName="Wall">
<defName>ARA_InsectWall</defName>
<label>阿拉克涅甲壳墙</label>

View File

@@ -1083,6 +1083,10 @@
<ThingDef>ARA_PheromoneSolvent</ThingDef>
</descriptionHyperlinks>
<researchPrerequisites>
<li>ARA_Technology_1MED</li>
</researchPrerequisites>
<comps>
<!-- The new, GrowthVat-style fuel component -->
<li Class="ArachnaeSwarm.CompProperties_RefuelableNutrition">

View File

@@ -100,6 +100,9 @@
</li>
</comps>
<designationCategory>ARA_Buildings</designationCategory>
<researchPrerequisites Inherit="False">
<li>ARA_Technology_1NPT</li>
</researchPrerequisites>
</ThingDef>
<!-- 3. 主建筑 "生物孵化池" -->
@@ -427,6 +430,9 @@
<graphicClass>Graphic_Single</graphicClass>
</li>
</modExtensions>
<researchPrerequisites Inherit="False">
<li>ARA_Technology_2NPT</li>
</researchPrerequisites>
</ThingDef>
<ThingDef ParentName="BuildingBase">
<defName>ARANutrientDispenser</defName>

View File

@@ -29,4 +29,10 @@
<delivery>{PAWN}生成了{THING}。</delivery>
<AbilitySkillChanged>{USER_labelShort}通过进化将{1}技能从{2}级转变至{3}级,并改变了热情。</AbilitySkillChanged>
<AbilityMustBeOnTerrain>必须在{0}上才能使用此能力。</AbilityMustBeOnTerrain>
<AbilityDisabledNotOnTerrain>禁用:不在{0}上</AbilityDisabledNotOnTerrain>
<AbilityTerrainRestrictionTip>只能在以下地形使用:{0}</AbilityTerrainRestrictionTip>
<AbilitySkillDurationBonus>基于{0}技能(等级{1})延长{2}秒,总持续时间:{3}秒</AbilitySkillDurationBonus>
</LanguageData>

View File

@@ -2,6 +2,14 @@
"Version": 1,
"WorkspaceRootPath": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\",
"Documents": [
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_givehediffwithskillduration\\compabilityeffect_givehediffwithskillduration.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_givehediffwithskillduration\\compabilityeffect_givehediffwithskillduration.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_givehediffwithskillduration\\compproperties_givehediffwithskillduration.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_givehediffwithskillduration\\compproperties_givehediffwithskillduration.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|d:\\steamlibrary\\steamapps\\common\\rimworld\\mods\\arachnaeswarm\\source\\arachnaeswarm\\abilities\\ara_terrainrestriction\\compabilityeffect_terrainrestriction .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:abilities\\ara_terrainrestriction\\compabilityeffect_terrainrestriction .cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -14,15 +22,41 @@
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": 1,
"SelectedChildIndex": 2,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:0:0:{1c4feeaa-4718-4aa9-859d-94ce25d182ba}"
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "CompProperties_GiveHediffWithSkillDuration.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_GiveHediffWithSkillDuration\\CompProperties_GiveHediffWithSkillDuration.cs",
"RelativeDocumentMoniker": "Abilities\\ARA_GiveHediffWithSkillDuration\\CompProperties_GiveHediffWithSkillDuration.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_GiveHediffWithSkillDuration\\CompProperties_GiveHediffWithSkillDuration.cs*",
"RelativeToolTip": "Abilities\\ARA_GiveHediffWithSkillDuration\\CompProperties_GiveHediffWithSkillDuration.cs*",
"ViewState": "AgIAAAEAAAAAAAAAAAAiwC4AAAAFAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-26T06:01:20.721Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "CompAbilityEffect_GiveHediffWithSkillDuration.cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_GiveHediffWithSkillDuration\\CompAbilityEffect_GiveHediffWithSkillDuration.cs",
"RelativeDocumentMoniker": "Abilities\\ARA_GiveHediffWithSkillDuration\\CompAbilityEffect_GiveHediffWithSkillDuration.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_GiveHediffWithSkillDuration\\CompAbilityEffect_GiveHediffWithSkillDuration.cs*",
"RelativeToolTip": "Abilities\\ARA_GiveHediffWithSkillDuration\\CompAbilityEffect_GiveHediffWithSkillDuration.cs*",
"ViewState": "AgIAACYAAAAAAAAAAAAqwEgAAAAnAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2025-09-26T06:00:59.354Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"Title": "CompAbilityEffect_TerrainRestriction .cs",
"DocumentMoniker": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Abilities\\ARA_TerrainRestriction\\CompAbilityEffect_TerrainRestriction .cs",
"RelativeDocumentMoniker": "Abilities\\ARA_TerrainRestriction\\CompAbilityEffect_TerrainRestriction .cs",

View File

@@ -0,0 +1,160 @@
using RimWorld;
using Verse;
using System.Text;
namespace ArachnaeSwarm
{
public class CompAbilityEffect_GiveHediffWithSkillDuration : CompAbilityEffect_WithDuration
{
public new CompProperties_AbilityGiveHediffWithSkillDuration Props => (CompProperties_AbilityGiveHediffWithSkillDuration)props;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
if (!Props.ignoreSelf || target.Pawn != parent.pawn)
{
if (!Props.onlyApplyToSelf && Props.applyToTarget)
{
ApplyToTarget(target.Pawn, parent.pawn);
}
if (Props.applyToSelf || Props.onlyApplyToSelf)
{
ApplyToTarget(parent.pawn, target.Pawn);
}
}
}
private void ApplyToTarget(Pawn target, Pawn other)
{
if (target == null) return;
if (TryResist(target))
{
MoteMaker.ThrowText(target.DrawPos, target.Map, "Resisted".Translate());
return;
}
if (Props.replaceExisting)
{
Hediff existingHediff = target.health.hediffSet.GetFirstHediffOfDef(Props.hediffDef);
if (existingHediff != null)
{
target.health.RemoveHediff(existingHediff);
}
}
Hediff hediff = HediffMaker.MakeHediff(Props.hediffDef, target, Props.onlyBrain ? target.health.hediffSet.GetBrain() : null);
HediffComp_Disappears disappearsComp = hediff.TryGetComp<HediffComp_Disappears>();
if (disappearsComp != null)
{
disappearsComp.ticksToDisappear = GetDurationWithSkillBonus(target).SecondsToTicks();
}
if (Props.severity >= 0f)
{
hediff.Severity = Props.severity;
}
HediffComp_Link linkComp = hediff.TryGetComp<HediffComp_Link>();
if (linkComp != null)
{
linkComp.other = other;
linkComp.drawConnection = target == parent.pawn;
}
target.health.AddHediff(hediff);
}
private float GetDurationWithSkillBonus(Pawn target)
{
// 使用基类的durationSeconds作为基础值
float baseDuration = Props.ActualBaseDurationSeconds;
if (Props.skillDef != null && parent.pawn != null && parent.pawn.skills != null)
{
SkillRecord skill = parent.pawn.skills.GetSkill(Props.skillDef);
if (skill != null)
{
int effectiveLevel = skill.Level;
if (Props.maxBonusLevels > 0 && effectiveLevel > Props.maxBonusLevels)
{
effectiveLevel = Props.maxBonusLevels;
}
return baseDuration + (effectiveLevel * Props.extraSecondsPerSkillLevel);
}
}
return baseDuration;
}
protected virtual bool TryResist(Pawn pawn)
{
return false;
}
// 在工具提示中显示技能加成信息
public override string ExtraTooltipPart()
{
StringBuilder stringBuilder = new StringBuilder();
// 先添加基类的工具提示
string baseTooltip = base.ExtraTooltipPart();
if (!string.IsNullOrEmpty(baseTooltip))
{
stringBuilder.AppendLine(baseTooltip);
}
// 添加技能加成信息
if (Props.showSkillBonusInTooltip && Props.skillDef != null && parent.pawn != null)
{
SkillRecord skill = parent.pawn.skills?.GetSkill(Props.skillDef);
if (skill != null)
{
stringBuilder.AppendLine("AbilitySkillDurationBonus".Translate(
Props.skillDef.LabelCap,
skill.Level,
GetSkillBonusDuration(),
GetTotalDuration()
));
}
}
return stringBuilder.ToString().TrimEndNewlines();
}
// 获取技能加成的持续时间
private float GetSkillBonusDuration()
{
if (Props.skillDef == null || parent.pawn == null) return 0f;
SkillRecord skill = parent.pawn.skills.GetSkill(Props.skillDef);
if (skill == null) return 0f;
int effectiveLevel = skill.Level;
if (Props.maxBonusLevels > 0 && effectiveLevel > Props.maxBonusLevels)
{
effectiveLevel = Props.maxBonusLevels;
}
return effectiveLevel * Props.extraSecondsPerSkillLevel;
}
// 获取总持续时间
private float GetTotalDuration()
{
return Props.ActualBaseDurationSeconds + GetSkillBonusDuration();
}
public override bool AICanTargetNow(LocalTargetInfo target)
{
if (parent.pawn.Faction == Faction.OfPlayer)
{
return false;
}
return target.Pawn != null;
}
}
}

View File

@@ -0,0 +1,48 @@
using RimWorld;
using Verse;
namespace ArachnaeSwarm
{
public class CompProperties_AbilityGiveHediffWithSkillDuration : CompProperties_AbilityGiveHediff
{
public SkillDef skillDef; // 影响持续时间的技能
public float baseDurationSeconds = -1f; // 基础持续时间(秒),-1表示使用基类的durationSeconds
public float extraSecondsPerSkillLevel = 10f; // 每级技能增加的秒数
public int maxBonusLevels = 10; // 最大可获加成的技能等级
public bool showSkillBonusInTooltip = true; // 是否在提示中显示技能加成
public CompProperties_AbilityGiveHediffWithSkillDuration()
{
this.compClass = typeof(CompAbilityEffect_GiveHediffWithSkillDuration);
}
// 在属性类中添加这个方法来安全地获取持续时间
public float GetBaseDuration()
{
// 如果设置了自定义基础持续时间,使用它
if (baseDurationSeconds >= 0)
return baseDurationSeconds;
// 否则使用基类的durationSeconds字段
// 使用反射来访问基类的私有字段
var field = typeof(CompProperties_AbilityEffectWithDuration).GetField("durationSeconds",
System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
if (field != null)
{
return (float)field.GetValue(this);
}
// 如果反射失败,返回默认值
return 60f;
}
// 添加一个属性来获取实际的基础持续时间
public float ActualBaseDurationSeconds
{
get
{
return GetBaseDuration();
}
}
}
}

View File

@@ -73,6 +73,8 @@
<Compile Include="Abilities\ARA_AbilitySwitch\WeaponSwitch.cs" />
<Compile Include="Abilities\ARA_AddExtraExp\CompAbilityEffect_AddExtraExp.cs" />
<Compile Include="Abilities\ARA_AddExtraExp\CompProperties_AddExtraExp.cs" />
<Compile Include="Abilities\ARA_GiveHediffWithSkillDuration\CompAbilityEffect_GiveHediffWithSkillDuration.cs" />
<Compile Include="Abilities\ARA_GiveHediffWithSkillDuration\CompProperties_GiveHediffWithSkillDuration.cs" />
<Compile Include="Abilities\ARA_HuggingFace\CompAbilityEffect_Possess.cs" />
<Compile Include="Abilities\ARA_HuggingFace\CompProperties_AbilityPossess.cs" />
<Compile Include="Abilities\ARA_HuggingFace\Hediff_Possession.cs" />