This commit is contained in:
2026-03-04 17:31:14 +08:00
parent 7a99680fd2
commit b4cdc28939
12 changed files with 340 additions and 29 deletions

View File

@@ -421,27 +421,13 @@
</ResearchProjectDef>
<ResearchProjectDef ParentName="WULAtechBase">
<defName>WULA_Mech_Mobile_Shield_Technology</defName>
<researchViewX>6.00</researchViewX>
<researchViewX>10.00</researchViewX>
<researchViewY>5.60</researchViewY>
<label>放射盾空投许可</label>
<description>允许殖民地申请空投MSm-8"放射盾",乌拉帝国的中型战争机械,一种多足机械体,拥有密不透风的反射盾的同时,还可以灼烧那些企图进入护盾区域内的宵小之辈。</description>
<baseCost>2000</baseCost>
<hiddenPrerequisites>
<li>WULA_Synth_Productor_Technology</li>
</hiddenPrerequisites>
<prerequisites>
<li>WULA_Colony_License_LV2_Technology</li>
</prerequisites>
</ResearchProjectDef>
<ResearchProjectDef ParentName="WULAtechBase">
<defName>WULA_Mech_Mobile_Shield_Teleporter_Technology</defName>
<researchViewX>10.00</researchViewX>
<researchViewY>5.60</researchViewY>
<label>放射盾传送器许可</label>
<description>允许殖民地使用MSm-8"放射盾"内置的传送器,机械乌拉在其覆盖范围内,处于征召状态下进行常规移动时,会以瞬间传送代替步行。</description>
<baseCost>3000</baseCost>
<hiddenPrerequisites>
<li>WULA_Mech_Mobile_Shield_Technology</li>
<li>WULA_Synth_Productor_Technology</li>
</hiddenPrerequisites>
<prerequisites>
<li>WULA_Colony_License_LV3_Technology</li>

View File

@@ -78,11 +78,11 @@
<MaxFlightTime>9999</MaxFlightTime>
<FlightCooldown>0</FlightCooldown>
<ArmorRating_Sharp>1</ArmorRating_Sharp>
<ArmorRating_Blunt>1</ArmorRating_Blunt>
<ArmorRating_Sharp>1.25</ArmorRating_Sharp>
<ArmorRating_Blunt>1.25</ArmorRating_Blunt>
<ArmorRating_Heat>2</ArmorRating_Heat>
<WULA_MechArmor>3</WULA_MechArmor>
<WULA_MechArmor>4</WULA_MechArmor>
</statBases>
<costList Inherit="False">
<WULA_Alloy>300</WULA_Alloy>
@@ -302,7 +302,7 @@
<stageTransitionCooldownTicks>3</stageTransitionCooldownTicks>
<!-- 碰撞区域 -->
<collisionAreaRadius>3</collisionAreaRadius>
<collisionAreaRadius>2</collisionAreaRadius>
<!-- 目标过滤 -->
<onlyAffectEnemies>true</onlyAffectEnemies>
@@ -356,11 +356,11 @@
<MaxFlightTime>9999</MaxFlightTime>
<FlightCooldown>0</FlightCooldown>
<ArmorRating_Sharp>1</ArmorRating_Sharp>
<ArmorRating_Blunt>1</ArmorRating_Blunt>
<ArmorRating_Sharp>1.25</ArmorRating_Sharp>
<ArmorRating_Blunt>1.25</ArmorRating_Blunt>
<ArmorRating_Heat>2</ArmorRating_Heat>
<WULA_MechArmor>3</WULA_MechArmor>
<WULA_MechArmor>4</WULA_MechArmor>
</statBases>
<costList Inherit="False">
<WULA_Alloy>300</WULA_Alloy>
@@ -570,7 +570,7 @@
<stageTransitionCooldownTicks>3</stageTransitionCooldownTicks>
<!-- 碰撞区域 -->
<collisionAreaRadius>3</collisionAreaRadius>
<collisionAreaRadius>2</collisionAreaRadius>
<!-- 目标过滤 -->
<onlyAffectEnemies>true</onlyAffectEnemies>
@@ -598,6 +598,12 @@
<knockbackFlyerDef>PawnFlyer</knockbackFlyerDef>
<!-- <flightEffecterDef>FlyerTakeoff</flightEffecterDef> -->
<landingSound>PawnFlyerLand</landingSound>
<!-- 地形阻挡配置 -->
<narrowTerrainBlocked>true</narrowTerrainBlocked>
<maxBlockPenalty>1</maxBlockPenalty>
<terrainCheckInterval>60</terrainCheckInterval>
<blockedHediff>Wula_TerrainBlocked</blockedHediff>
<!-- 调试 -->
<enableDebugLogging>false</enableDebugLogging>
@@ -616,6 +622,8 @@
<ArmorRating_Sharp>0.5</ArmorRating_Sharp>
<ArmorRating_Blunt>0.5</ArmorRating_Blunt>
<ArmorRating_Heat>2</ArmorRating_Heat>
<WULA_MechArmor>5</WULA_MechArmor>
</statBases>
<costList Inherit="False">
<WULA_Alloy>300</WULA_Alloy>
@@ -649,7 +657,7 @@
</tools>
<comps>
<li Class="WulaFallenEmpire.CompProperties_AreaShield">
<radius>15</radius>
<radius>25</radius>
<baseHitPoints>300</baseHitPoints>
<rechargeDelay>2400</rechargeDelay>
<rechargeHitPointsIntervalTicks>30</rechargeHitPointsIntervalTicks>
@@ -669,13 +677,13 @@
<!-- 反射设置 -->
<canReflect>true</canReflect>
<reflectChance>0.85</reflectChance>
<reflectChance>0.95</reflectChance>
<reflectAngleRange>30</reflectAngleRange>
<reflectCost>0</reflectCost>
<reflectEffecter>Interceptor_BlockedProjectile</reflectEffecter>
</li>
<li Class="WulaFallenEmpire.CompProperties_AreaDamage">
<radius>15</radius>
<radius>25</radius>
<damageIntervalTicks>30</damageIntervalTicks>
<damageDef>Flame</damageDef>
<damageAmount>8</damageAmount>
@@ -687,7 +695,7 @@
<ignoreFactionRelations>false</ignoreFactionRelations>
<startEnabled>false</startEnabled>
<toggleLabel>热辐射</toggleLabel>
<toggleDescription>MSm-8"放射盾"可以打开外壳,蒸发胆敢进入反射立场内的敌军——这同时会使得它伤害附近所有的散落物品</toggleDescription>
<toggleDescription>MSm-8"放射盾"可以打开外壳,蒸发胆敢进入反射立场内的敌军。</toggleDescription>
<toggleIconPath>Wula/UI/Commands/Wula_Psi_Titan_AreaDamage</toggleIconPath>
</li>
<!-- <li Class="WulaFallenEmpire.CompProperties_AreaTeleporter">
@@ -829,12 +837,61 @@
</li>
</pawnKindHediffs>
</li> -->
<li Class="WulaFallenEmpire.CompProperties_HighSpeedCollision">
<!-- 速度阈值 -->
<minSpeedForStage1>0.5</minSpeedForStage1>
<minSpeedForStage2>1.0</minSpeedForStage2>
<speedHistoryFrameCount>15</speedHistoryFrameCount>
<stageTransitionCooldownTicks>6</stageTransitionCooldownTicks>
<!-- 碰撞区域 -->
<collisionAreaRadius>3</collisionAreaRadius>
<!-- 目标过滤 -->
<onlyAffectEnemies>true</onlyAffectEnemies>
<excludeAlliedPawns>true</excludeAlliedPawns>
<!-- 阶段1效果 -->
<stage1DamageDef>Blunt</stage1DamageDef>
<stage1DamageAmount>1</stage1DamageAmount>
<armorPenetration>0.1</armorPenetration>
<!-- <stage1Hediff>Bruise</stage1Hediff>
<stage1HediffDurationTicks>120</stage1HediffDurationTicks>
<stage1HediffPreventsDamage>true</stage1HediffPreventsDamage> -->
<!-- <stage1Effecter>SparkImpact</stage1Effecter> -->
<stage1Sound>MeleeHit_BladelinkZeusHammer</stage1Sound>
<!-- 阶段2效果 -->
<stage2DamageDef>Blunt</stage2DamageDef>
<stage2DamageAmount>20</stage2DamageAmount>
<stage2KnockbackDistance>4</stage2KnockbackDistance>
<requireLineOfSightForKnockback>true</requireLineOfSightForKnockback>
<!-- <stage2Effecter>ExplosionFlash</stage2Effecter> -->
<stage2Sound>MeleeHit_BladelinkZeusHammer</stage2Sound>
<!-- 击飞配置 -->
<knockbackFlyerDef>PawnFlyer</knockbackFlyerDef>
<!-- <flightEffecterDef>FlyerTakeoff</flightEffecterDef> -->
<landingSound>PawnFlyerLand</landingSound>
<!-- 地形阻挡配置 -->
<narrowTerrainBlocked>true</narrowTerrainBlocked>
<maxBlockPenalty>1</maxBlockPenalty>
<terrainCheckInterval>60</terrainCheckInterval>
<blockedHediff>Wula_TerrainBlocked</blockedHediff>
<!-- 调试 -->
<enableDebugLogging>false</enableDebugLogging>
<enableDebugVisuals>false</enableDebugVisuals>
<debugDrawSpeedHistory>false</debugDrawSpeedHistory>
</li>
</comps>
</ThingDef>
<ThingDef ParentName="Wula_MechunitBase">
<defName>Wula_Mech_Mobile_Factory</defName>
<label>MFm-2"陆行舰"</label>
<description>乌拉帝国的大型战争机械,简直就是一座移动堡垒——它不仅装甲厚实、火炮林立,还能在战场上生产大量的辅助战争机械以形成坚实的弹性阵线,生来就是为了粉碎坚固的要塞和顽强的抵抗。</description>
<description>乌拉帝国的大型构装体,简直就是一座移动堡垒——它不仅装甲厚实、火炮林立,还能在战场上生产大量的辅助战争机械以形成坚实的弹性阵线,生来就是为了粉碎坚固的要塞和顽强的抵抗。</description>
<statBases>
<MoveSpeed>1</MoveSpeed>
<EnergyShieldEnergyMax>5</EnergyShieldEnergyMax>
@@ -845,6 +902,8 @@
<ArmorRating_Sharp>1.75</ArmorRating_Sharp>
<ArmorRating_Blunt>1.75</ArmorRating_Blunt>
<ArmorRating_Heat>2</ArmorRating_Heat>
<WULA_MechArmor>10</WULA_MechArmor>
</statBases>
<costList Inherit="False">
<WULA_Alloy>300</WULA_Alloy>
@@ -1287,6 +1346,12 @@
<knockbackFlyerDef>PawnFlyer</knockbackFlyerDef>
<!-- <flightEffecterDef>FlyerTakeoff</flightEffecterDef> -->
<landingSound>PawnFlyerLand</landingSound>
<!-- 地形阻挡配置 -->
<narrowTerrainBlocked>true</narrowTerrainBlocked>
<maxBlockPenalty>1</maxBlockPenalty>
<terrainCheckInterval>60</terrainCheckInterval>
<blockedHediff>Wula_TerrainBlocked</blockedHediff>
<!-- 调试 -->
<enableDebugLogging>false</enableDebugLogging>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 184 KiB

After

Width:  |  Height:  |  Size: 446 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 583 KiB

After

Width:  |  Height:  |  Size: 952 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 136 KiB

After

Width:  |  Height:  |  Size: 408 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 643 KiB

After

Width:  |  Height:  |  Size: 971 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 230 KiB

After

Width:  |  Height:  |  Size: 230 KiB

View File

@@ -0,0 +1,259 @@
using System;
using System.Collections.Generic;
using RimWorld;
using Verse;
using Verse.Sound;
namespace WulaFallenEmpire
{
/// <summary>
/// 支持直击伤害的爆炸弹丸
/// </summary>
public class Projectile_ExplosiveWithDirectHit : Projectile_Explosive
{
// 缓存ModExtension
private ProjectileExtension_DirectHit directHitExtension = null;
// 标记是否已经应用了直击伤害
private bool directDamageApplied = false;
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref directDamageApplied, "directDamageApplied", false);
}
protected override void Impact(Thing hitThing, bool blockedByShield = false)
{
// 获取ModExtension
if (directHitExtension == null)
{
directHitExtension = def.GetModExtension<ProjectileExtension_DirectHit>();
}
// 应用直击伤害(只在有直接击中目标时)
if (hitThing != null && directHitExtension != null &&
directHitExtension.directDamageAmount > 0 &&
!directDamageApplied)
{
ApplyDirectDamage(hitThing, blockedByShield);
directDamageApplied = true;
}
// 调用基类方法处理爆炸
base.Impact(hitThing, blockedByShield);
}
/// <summary>
/// 应用直击伤害
/// </summary>
private void ApplyDirectDamage(Thing hitThing, bool blockedByShield = false)
{
// 如果只在无护盾时生效且有护盾阻挡,则不应用
if (blockedByShield && directHitExtension.applyDirectDamageOnlyWithoutShield)
return;
// 准备伤害信息
DamageInfo damageInfo = CreateDirectDamageInfo();
// 对目标造成伤害
hitThing.TakeDamage(damageInfo);
// 播放效果
PlayDirectImpactEffects(hitThing);
}
/// <summary>
/// 创建直击伤害信息
/// </summary>
private DamageInfo CreateDirectDamageInfo()
{
// 确定伤害类型
DamageDef damageDef = directHitExtension.directDamageDef;
if (damageDef == null)
{
// 默认使用爆炸伤害类型
damageDef = base.DamageDef ?? DamageDefOf.Bomb;
}
// 确定伤害量
int damageAmount = directHitExtension.directDamageAmount;
if (directHitExtension.useEquipmentStatsForDirectDamage && equipment != null)
{
// 使用装备属性计算伤害
damageAmount = def.projectile.GetDamageAmount(equipment);
}
// 确定护甲穿透
float armorPenetration = directHitExtension.directArmorPenetration;
if (directHitExtension.useEquipmentStatsForDirectDamage && equipment != null)
{
armorPenetration = def.projectile.GetArmorPenetration(equipment);
}
// 创建伤害信息
DamageInfo damageInfo = new DamageInfo(
damageDef,
damageAmount,
armorPenetration,
-1f, // 角度
launcher,
null, // 击中部位
equipmentDef,
DamageInfo.SourceCategory.ThingOrUnknown,
intendedTarget.Thing
);
// 添加额外伤害
AddExtraDirectDamages(damageInfo);
return damageInfo;
}
/// <summary>
/// 添加上额外伤害
/// </summary>
private void AddExtraDirectDamages(DamageInfo mainDamage)
{
if (directHitExtension?.extraDirectDamages == null)
return;
foreach (var extraDamage in directHitExtension.extraDirectDamages)
{
if (extraDamage != null && extraDamage.def != null && extraDamage.amount > 0)
{
DamageInfo extraDamageInfo = new DamageInfo(
extraDamage.def,
extraDamage.amount,
extraDamage.armorPenetration,
-1f,
launcher,
null,
equipmentDef,
DamageInfo.SourceCategory.ThingOrUnknown,
intendedTarget.Thing
);
// 应用额外伤害
if (mainDamage.IntendedTarget != null && mainDamage.IntendedTarget != null)
{
mainDamage.IntendedTarget.TakeDamage(extraDamageInfo);
}
}
}
}
/// <summary>
/// 播放直击效果
/// </summary>
private void PlayDirectImpactEffects(Thing hitThing)
{
Map map = base.Map;
if (map == null)
return;
// 播放效果器
if (directHitExtension.directImpactEffecter != null)
{
Effecter effecter = directHitExtension.directImpactEffecter.Spawn();
effecter.Trigger(new TargetInfo(base.Position, map),
new TargetInfo(hitThing.Position, map));
effecter.Cleanup();
}
// 播放音效
if (directHitExtension.directImpactSound != null)
{
directHitExtension.directImpactSound.PlayOneShot(new TargetInfo(base.Position, map));
}
}
/// <summary>
/// 覆盖爆炸方法以添加直击伤害信息
/// </summary>
protected override void Explode()
{
// 在爆炸前确保直击伤害已经应用(如果是延迟爆炸的情况)
if (!directDamageApplied && directHitExtension != null &&
directHitExtension.directDamageAmount > 0 && intendedTarget.Thing != null)
{
ApplyDirectDamage(intendedTarget.Thing, false);
directDamageApplied = true;
}
// 调用基类爆炸方法
base.Explode();
}
/// <summary>
/// 获取调试信息
/// </summary>
public string GetDirectHitDebugInfo()
{
if (directHitExtension == null)
return "No direct hit extension configured.";
string info = "Direct Hit Configuration:\n";
info += $"Damage Def: {directHitExtension.directDamageDef?.defName ?? "None"}\n";
info += $"Damage Amount: {directHitExtension.directDamageAmount}\n";
info += $"Armor Penetration: {directHitExtension.directArmorPenetration}\n";
info += $"Use Equipment Stats: {directHitExtension.useEquipmentStatsForDirectDamage}\n";
info += $"Apply Without Shield Only: {directHitExtension.applyDirectDamageOnlyWithoutShield}\n";
info += $"Extra Damages Count: {directHitExtension.extraDirectDamages?.Count ?? 0}\n";
info += $"Direct Damage Applied: {directDamageApplied}";
return info;
}
}
/// <summary>
/// 直击伤害ModExtension定义
/// </summary>
public class ProjectileExtension_DirectHit : DefModExtension
{
/// <summary>
/// 直击伤害类型(默认为爆炸伤害类型)
/// </summary>
public DamageDef directDamageDef = null;
/// <summary>
/// 直击伤害量
/// </summary>
public int directDamageAmount = 0;
/// <summary>
/// 直击伤害护甲穿透
/// </summary>
public float directArmorPenetration = 0f;
/// <summary>
/// 直击伤害是否受装备影响
/// </summary>
public bool useEquipmentStatsForDirectDamage = false;
/// <summary>
/// 直击伤害额外伤害列表
/// </summary>
public List<ExtraDamage> extraDirectDamages = null;
/// <summary>
/// 直击伤害是否只在击穿护盾后生效
/// </summary>
public bool applyDirectDamageOnlyWithoutShield = false;
/// <summary>
/// 直击伤害效果器
/// </summary>
public EffecterDef directImpactEffecter = null;
/// <summary>
/// 直击伤害音效
/// </summary>
public SoundDef directImpactSound = null;
/// <summary>
/// 是否显示直击伤害日志
/// </summary>
public bool logDirectDamage = false;
}
}

View File

@@ -106,6 +106,7 @@
<Compile Include="Pawn_Comps\MechCrewHolder\CompProperties_MechCrewHolder.cs" />
<Compile Include="Pawn_Comps\PawnRenderExtra\Comp_PawnRenderExtra.cs" />
<Compile Include="Pawn_Comps\HighSpeedCollision\CompHighSpeedCollision.cs" />
<Compile Include="Projectiles\Projectile_ExplosiveWithDirectHit.cs" />
<Compile Include="Verb\Verb_RangeChecker.cs" />
<Compile Include="Verb\Verb_TurretOffestShoot.cs" />
<Compile Include="Work\BoardMech\FloatMenuOptionProvider_BoardMech.cs" />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 KiB

After

Width:  |  Height:  |  Size: 272 KiB