This commit is contained in:
2026-03-25 17:28:46 +08:00
parent 3d9f748b7d
commit aee86c6310
10 changed files with 228 additions and 56 deletions

Binary file not shown.

View File

@@ -1904,4 +1904,87 @@
</li> </li>
</comps> </comps>
</AbilityDef> </AbilityDef>
<!-- 变异 -->
<AbilityDef>
<defName>ARA_Incubator_5_EliteReward_Jump</defName>
<label>力大砖飞</label>
<description>该阿拉克涅督虫变异过的恐怖肌肉可以像弹簧一样将其弹射出去。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Fighter_Invisibility_jump</iconPath>
<cooldownTicksRange>6000</cooldownTicksRange>
<hostile>false</hostile>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<verbProperties>
<verbClass>Verb_CastAbilityJump</verbClass>
<violent>false</violent>
<forceNormalTimeSpeed>false</forceNormalTimeSpeed>
<!-- <warmupTime>0.5</warmupTime> -->
<range>18</range>
<requireLineOfSight>false</requireLineOfSight>
<soundCast>Longjump_Jump</soundCast>
<soundLanding>Longjump_Land</soundLanding>
<targetParams>
<canTargetLocations>true</canTargetLocations>
<canTargetPawns>false</canTargetPawns>
<canTargetBuildings>false</canTargetBuildings>
</targetParams>
</verbProperties>
<jobDef>CastJump</jobDef>
<comps>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<customLabel>饮食</customLabel>
<showProgressBar>true</showProgressBar>
<needDef>Food</needDef>
<needCost>0.1</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
</comps>
</AbilityDef>
<AbilityDef>
<defName>ARA_Incubator_5_EliteReward_Charge</defName>
<label>无畏冲击</label>
<description>对目标发起蓄势冲撞,对路径上的一切造成伤害。在冲击中途经的距离越远,伤害越高。</description>
<iconPath>ArachnaeSwarm/UI/Abilities/ARA_Ability_TrackingCharge</iconPath> <!-- Placeholder Icon -->
<cooldownTicksRange>6000</cooldownTicksRange>
<cooldownPerCharge>true</cooldownPerCharge>
<aiCanUse>false</aiCanUse>
<verbProperties>
<verbClass>ArachnaeSwarm.Verb_CastAbilityTrackingCharge</verbClass>
<label>追踪冲撞</label>
<requireLineOfSight>false</requireLineOfSight>
<targetParams>
<canTargetPawns>true</canTargetPawns>
<canTargetBuildings>true</canTargetBuildings>
<canTargetAnimals>true</canTargetAnimals>
<canTargetMechs>true</canTargetMechs>
<canTargetSelf>false</canTargetSelf>
</targetParams>
<range>16</range>
<warmupTime>1.0</warmupTime>
</verbProperties>
<comps>
<li Class="ArachnaeSwarm.CompProperties_TrackingCharge">
<homingSpeed>1.5</homingSpeed>
<initialDamage>10</initialDamage>
<damagePerTile>1.2</damagePerTile>
<inertiaDistance>6</inertiaDistance>
<collisionDamageDef>Demolish</collisionDamageDef>
<flyerDef>ARA_Flyer_TrackingCharge</flyerDef>
<collisionRadius>1.5</collisionRadius> <!-- Larger collision radius -->
<impactSound>Pawn_Melee_BigBash_HitPawn</impactSound>
<damageHostileOnly>true</damageHostileOnly> <!-- Set to false to damage everyone in the path -->
</li>
<li Class="CompProperties_AbilityEffecterOnCaster">
<effecterDef>WarTrumpet</effecterDef>
<maintainTicks>20</maintainTicks> <!-- Long enough for the "2nd wave" to spawn -->
</li>
<li Class="ArachnaeSwarm.CompProperties_AbilityNeedCost">
<customLabel>饮食</customLabel>
<showProgressBar>true</showProgressBar>
<needDef>Food</needDef>
<needCost>0.2</needCost>
<failMessage>营养值不足,需要进食</failMessage>
</li>
</comps>
</AbilityDef>
</Defs> </Defs>

View File

@@ -331,6 +331,7 @@
<comps> <comps>
<li Class="ArachnaeSwarmVerse.HediffCompProperties_ReflectMeleeDamage"> <li Class="ArachnaeSwarmVerse.HediffCompProperties_ReflectMeleeDamage">
<reflectMultiplier>3</reflectMultiplier> <reflectMultiplier>3</reflectMultiplier>
<fixedDamageDefName>ARA_AcidBurn</fixedDamageDefName>
</li> </li>
</comps> </comps>
</HediffDef> </HediffDef>
@@ -393,4 +394,28 @@
</li> </li>
</stages> </stages>
</HediffDef> </HediffDef>
<HediffDef>
<defName>ARA_Incubator_5_EliteReward_Hediffs</defName>
<label>异变肌群</label>
<description>该阿拉克涅督虫的肌群强壮得已经无法使用常理解释了,似乎只需要轻轻地挥动鳌爪,最坚固的城墙也会被劈开裂口——督虫还藉由这种强大的生理能力获得了多个体术技能。\n\n这个稀有突变是强壮肌肉的变种。</description>
<hediffClass>HediffWithComps</hediffClass>
<isBad>false</isBad>
<defaultLabelColor>(0.8, 0.6, 0.0)</defaultLabelColor>
<scenarioCanAdd>true</scenarioCanAdd>
<stages>
<li>
<statFactors>
<MeleeDamageFactor>5</MeleeDamageFactor>
</statFactors>
</li>
</stages>
<comps>
<li Class="HediffCompProperties_GiveAbility">
<abilityDefs>
<li>ARA_Incubator_5_EliteReward_Jump</li>
<li>ARA_Incubator_5_EliteReward_Charge</li>
</abilityDefs>
</li>
</comps>
</HediffDef>
</Defs> </Defs>

View File

@@ -190,6 +190,7 @@
<maxGenerationAge>2</maxGenerationAge> <maxGenerationAge>2</maxGenerationAge>
<minGenerationAge>1</minGenerationAge> <minGenerationAge>1</minGenerationAge>
<canBeScattered>false</canBeScattered> <canBeScattered>false</canBeScattered>
<nameMaker>ARA_Normal_Node_NameMaker</nameMaker>
<abilities> <abilities>
<li>ARA_Suicide_Ability</li> <li>ARA_Suicide_Ability</li>
<li>ARA_RaceBaseSwarmProduceOff</li> <li>ARA_RaceBaseSwarmProduceOff</li>
@@ -699,4 +700,52 @@
<li>ARA_Ability_SlayerCharge</li> <li>ARA_Ability_SlayerCharge</li>
</abilities> </abilities>
</PawnKindDef> </PawnKindDef>
</Defs>
<RulePackDef>
<defName>ARA_Normal_Node_NameMaker</defName>
<rulePack>
<rulesStrings>
<li>r_name->[ARA_Normal_Node_FirstName] '[ARA_Normal_Node_nickName]' [ARA_Normal_Node_LastName]</li>
<li>ARA_Normal_Node_nickName->[ARA_Normal_Node_nickName_Sub]</li>
<li>ARA_Normal_Node_FirstName->Nodeunit</li>
<li>ARA_Normal_Node_LastName->Arachnae</li>
<li>ARA_Normal_Node_nickName_Sub->[ARA_Normal_Node_nickName_A][ARA_Normal_Node_nickName_B]-[ARA_Normal_Node_nickName_C][ARA_Normal_Node_nickName_D][ARA_Normal_Node_nickName_E]</li>
<li>ARA_Normal_Node_nickName_A->P</li>
<li>ARA_Normal_Node_nickName_A->R</li>
<li>ARA_Normal_Node_nickName_A->X</li>
<li>ARA_Normal_Node_nickName_A->H</li>
<li>ARA_Normal_Node_nickName_A->D</li>
<li>ARA_Normal_Node_nickName_B->A</li>
<li>ARA_Normal_Node_nickName_B->C</li>
<li>ARA_Normal_Node_nickName_B->I</li>
<li>ARA_Normal_Node_nickName_B->Y</li>
<li>ARA_Normal_Node_nickName_C->1</li>
<li>ARA_Normal_Node_nickName_C->2</li>
<li>ARA_Normal_Node_nickName_C->3</li>
<li>ARA_Normal_Node_nickName_C->4</li>
<li>ARA_Normal_Node_nickName_C->5</li>
<li>ARA_Normal_Node_nickName_C->6</li>
<li>ARA_Normal_Node_nickName_D->1</li>
<li>ARA_Normal_Node_nickName_D->2</li>
<li>ARA_Normal_Node_nickName_D->3</li>
<li>ARA_Normal_Node_nickName_D->4</li>
<li>ARA_Normal_Node_nickName_D->5</li>
<li>ARA_Normal_Node_nickName_D->6</li>
<li>ARA_Normal_Node_nickName_D->7</li>
<li>ARA_Normal_Node_nickName_D->8</li>
<li>ARA_Normal_Node_nickName_D->9</li>
<li>ARA_Normal_Node_nickName_D->0</li>
<li>ARA_Normal_Node_nickName_E->1</li>
<li>ARA_Normal_Node_nickName_E->2</li>
<li>ARA_Normal_Node_nickName_E->3</li>
<li>ARA_Normal_Node_nickName_E->4</li>
<li>ARA_Normal_Node_nickName_E->5</li>
<li>ARA_Normal_Node_nickName_E->6</li>
<li>ARA_Normal_Node_nickName_E->7</li>
<li>ARA_Normal_Node_nickName_E->8</li>
<li>ARA_Normal_Node_nickName_E->9</li>
<li>ARA_Normal_Node_nickName_E->0</li>
</rulesStrings>
</rulePack>
</RulePackDef>
</Defs>

View File

@@ -610,6 +610,7 @@
<canFlyInVacuum>false</canFlyInVacuum> <canFlyInVacuum>false</canFlyInVacuum>
<!-- 身形大小,略大于常规人类 --> <!-- 身形大小,略大于常规人类 -->
<baseBodySize>1</baseBodySize> <baseBodySize>1</baseBodySize>
<ageGenerationCurve Inherit="False" IsNull="True"/>
</race> </race>
<recipes Inherit="False"> <recipes Inherit="False">

View File

@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8" ?>
<LanguageData>
<ARA_Normal_Node_NameMaker.rulePack.rulesStrings>
<li>r_name->[ARA_Normal_Node_FirstName] '[ARA_Normal_Node_nickName]' [ARA_Normal_Node_LastName]</li>
<li>ARA_Normal_Node_nickName->[ARA_Normal_Node_nickName_Sub]</li>
<li>ARA_Normal_Node_FirstName->节点生物</li>
<li>ARA_Normal_Node_LastName->阿拉克涅</li>
<li>ARA_Normal_Node_nickName_Sub->[ARA_Normal_Node_nickName_A][ARA_Normal_Node_nickName_B]-[ARA_Normal_Node_nickName_C][ARA_Normal_Node_nickName_D][ARA_Normal_Node_nickName_E]</li>
<li>ARA_Normal_Node_nickName_A->P</li>
<li>ARA_Normal_Node_nickName_A->R</li>
<li>ARA_Normal_Node_nickName_A->X</li>
<li>ARA_Normal_Node_nickName_A->H</li>
<li>ARA_Normal_Node_nickName_A->D</li>
<li>ARA_Normal_Node_nickName_B->A</li>
<li>ARA_Normal_Node_nickName_B->C</li>
<li>ARA_Normal_Node_nickName_B->I</li>
<li>ARA_Normal_Node_nickName_B->Y</li>
<li>ARA_Normal_Node_nickName_C->1</li>
<li>ARA_Normal_Node_nickName_C->2</li>
<li>ARA_Normal_Node_nickName_C->3</li>
<li>ARA_Normal_Node_nickName_C->4</li>
<li>ARA_Normal_Node_nickName_C->5</li>
<li>ARA_Normal_Node_nickName_C->6</li>
<li>ARA_Normal_Node_nickName_D->1</li>
<li>ARA_Normal_Node_nickName_D->2</li>
<li>ARA_Normal_Node_nickName_D->3</li>
<li>ARA_Normal_Node_nickName_D->4</li>
<li>ARA_Normal_Node_nickName_D->5</li>
<li>ARA_Normal_Node_nickName_D->6</li>
<li>ARA_Normal_Node_nickName_D->7</li>
<li>ARA_Normal_Node_nickName_D->8</li>
<li>ARA_Normal_Node_nickName_D->9</li>
<li>ARA_Normal_Node_nickName_D->0</li>
<li>ARA_Normal_Node_nickName_E->1</li>
<li>ARA_Normal_Node_nickName_E->2</li>
<li>ARA_Normal_Node_nickName_E->3</li>
<li>ARA_Normal_Node_nickName_E->4</li>
<li>ARA_Normal_Node_nickName_E->5</li>
<li>ARA_Normal_Node_nickName_E->6</li>
<li>ARA_Normal_Node_nickName_E->7</li>
<li>ARA_Normal_Node_nickName_E->8</li>
<li>ARA_Normal_Node_nickName_E->9</li>
<li>ARA_Normal_Node_nickName_E->0</li>
</ARA_Normal_Node_NameMaker.rulePack.rulesStrings>
</LanguageData>

View File

@@ -7,11 +7,11 @@
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_reflectmeleedamage.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:hediffs\\hediffcomp_reflectmeleedamage.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\\ara_defof.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\\ara_defof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_defof.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:ara_defof.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\\jobs\\jobdriver_supercarry\\jobdriver_supercarry.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\\jobs\\jobdriver_supercarry\\jobdriver_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_supercarry\\jobdriver_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{EAE0DB6B-E282-C812-7F5A-6D13E9D24581}|ArachnaeSwarm.csproj|solutionrelative:jobs\\jobdriver_supercarry\\jobdriver_supercarry.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
@@ -122,8 +122,7 @@
"RelativeToolTip": "ARA_DefOf.cs", "RelativeToolTip": "ARA_DefOf.cs",
"ViewState": "AgIAAFQAAAAAAAAAAAAUwGcAAAAmAAAAAAAAAA==", "ViewState": "AgIAAFQAAAAAAAAAAAAUwGcAAAAmAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-24T08:34:43.383Z", "WhenOpened": "2026-03-24T08:34:43.383Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
@@ -133,7 +132,7 @@
"RelativeDocumentMoniker": "Hediffs\\HediffComp_ReflectMeleeDamage.cs", "RelativeDocumentMoniker": "Hediffs\\HediffComp_ReflectMeleeDamage.cs",
"ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_ReflectMeleeDamage.cs", "ToolTip": "D:\\SteamLibrary\\steamapps\\common\\RimWorld\\Mods\\ArachnaeSwarm\\Source\\ArachnaeSwarm\\Hediffs\\HediffComp_ReflectMeleeDamage.cs",
"RelativeToolTip": "Hediffs\\HediffComp_ReflectMeleeDamage.cs", "RelativeToolTip": "Hediffs\\HediffComp_ReflectMeleeDamage.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAwAAAA4AAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAABIAAAAoAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-24T08:33:52.75Z", "WhenOpened": "2026-03-24T08:33:52.75Z",
"EditorCaption": "" "EditorCaption": ""
@@ -148,8 +147,7 @@
"RelativeToolTip": "Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs", "RelativeToolTip": "Jobs\\JobDriver_SuperCarry\\JobDriver_SuperCarry.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAA3AAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAAAA8AAAA3AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-03-06T03:21:58.524Z", "WhenOpened": "2026-03-06T03:21:58.524Z"
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",

View File

@@ -13,11 +13,11 @@ namespace ArachnaeSwarmVerse
public class HediffCompProperties_ReflectMeleeDamage : HediffCompProperties public class HediffCompProperties_ReflectMeleeDamage : HediffCompProperties
{ {
public float reflectMultiplier = 3.0f; // 反射倍数默认300% public float reflectMultiplier = 3.0f; // 反射倍数默认300%
public bool showReflectionEffect = true; // 是否显示反射效果
public bool reflectOnlyMelee = true; // 是否只反射近战伤害 public bool reflectOnlyMelee = true; // 是否只反射近战伤害
public bool includeToolBasedRanged = false; // 是否包含使用工具的远程伤害 public bool includeToolBasedRanged = false; // 是否包含使用工具的远程伤害
public float minDamageToReflect = 0.1f; // 最小反射伤害阈值 public float minDamageToReflect = 0.1f; // 最小反射伤害阈值
public string fixedDamageDefName = null; // 固定伤害类型的def名称如果不为null则反射伤害将使用此def
public HediffCompProperties_ReflectMeleeDamage() public HediffCompProperties_ReflectMeleeDamage()
{ {
this.compClass = typeof(HediffComp_ReflectMeleeDamage); this.compClass = typeof(HediffComp_ReflectMeleeDamage);
@@ -127,7 +127,8 @@ namespace ArachnaeSwarmVerse
{ {
isProcessingReflection = true; isProcessingReflection = true;
lastReflectionTick = Find.TickManager.TicksGame; lastReflectionTick = Find.TickManager.TicksGame;
DamageDef damageDef = originalDinfo.Def;
// 计算反射伤害 // 计算反射伤害
float reflectedAmount = originalDinfo.Amount * ReflectMultiplier; float reflectedAmount = originalDinfo.Amount * ReflectMultiplier;
@@ -143,10 +144,23 @@ namespace ArachnaeSwarmVerse
{ {
return; return;
} }
if (Props.fixedDamageDefName != null)
{
DamageDef fixedDef = DefDatabase<DamageDef>.GetNamedSilentFail(Props.fixedDamageDefName);
if (fixedDef != null)
{
damageDef = fixedDef;
}
else
{
Log.Warning($"[ReflectMeleeDamage] Could not find DamageDef with name '{Props.fixedDamageDefName}' for reflection. Using original damage def.");
}
}
// 创建反射伤害信息 // 创建反射伤害信息
DamageInfo reflectedDinfo = new DamageInfo( DamageInfo reflectedDinfo = new DamageInfo(
def: originalDinfo.Def, def: damageDef,
amount: reflectedAmount, amount: reflectedAmount,
armorPenetration: originalDinfo.ArmorPenetrationInt, armorPenetration: originalDinfo.ArmorPenetrationInt,
angle: Rand.Range(0, 359), angle: Rand.Range(0, 359),
@@ -177,12 +191,6 @@ namespace ArachnaeSwarmVerse
// 对攻击者造成伤害 // 对攻击者造成伤害
attacker.TakeDamage(reflectedDinfo); attacker.TakeDamage(reflectedDinfo);
// 显示反射效果
if (Props.showReflectionEffect)
{
ShowReflectionEffect(pawn, attacker);
}
// 发送消息 // 发送消息
if (pawn.Faction == Faction.OfPlayer && attacker.Faction != Faction.OfPlayer) if (pawn.Faction == Faction.OfPlayer && attacker.Faction != Faction.OfPlayer)
{ {
@@ -207,43 +215,6 @@ namespace ArachnaeSwarmVerse
} }
} }
/// <summary>
/// 显示反射效果
/// </summary>
private void ShowReflectionEffect(Pawn pawn, Thing attacker)
{
try
{
// 显示反弹粒子
if (pawn.Spawned && attacker.Spawned && pawn.Map == attacker.Map)
{
Vector3 startPos = pawn.DrawPos;
Vector3 endPos = attacker.DrawPos;
// 创建一个从反射者到攻击者的弹道效果
for (int i = 0; i < 3; i++)
{
MoteThrown mote = (MoteThrown)ThingMaker.MakeThing(ARA_ThingDefOf.Mote_SparkSimple, null);
mote.Scale = Rand.Range(0.5f, 0.8f);
mote.exactPosition = startPos + new Vector3(
Rand.Range(-0.3f, 0.3f),
0f,
Rand.Range(-0.3f, 0.3f)
);
mote.SetVelocity(
(endPos - startPos).normalized.x * Rand.Range(15f, 25f),
0f
);
GenSpawn.Spawn(mote, pawn.Position, pawn.Map);
}
}
}
catch (Exception ex)
{
Log.Error($"[ReflectMeleeDamage] Error showing reflection effect: {ex}");
}
}
/// <summary> /// <summary>
/// 在Pawn受到伤害后调用 /// 在Pawn受到伤害后调用
/// </summary> /// </summary>