diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll
index 88228e85..ad92913e 100644
Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Sample_Weapon.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Sample_Weapon.xml
new file mode 100644
index 00000000..4ee608a1
--- /dev/null
+++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Sample_Weapon.xml
@@ -0,0 +1,95 @@
+
+
+
+
+ WULA_RW_DM_AR_Arc
+
+ 乌拉帝国一线部队所使用的由暗物质驱动的常规步枪,暗物质经由螺旋结构形成自旋极化光束,可以在远距离上连锁传导伤害性光束,仍在试验阶段。
+ Ultra
+
+
+ Wula/Weapon/WULA_RW_DM_AR
+ Graphic_Single
+ 1.2
+
+
+ Wula_Ranged_Weapon_T4
+
+ 0.9
+ Interact_ChargeRifle
+
+
+ WULA_Cube_Productor_Energy
+
+ WULA_Synth_Weapon_4_DM_Base_Technology
+ UnfinishedWeapon
+
+
+ 400
+ 200
+ 4
+
+
+ 40000
+ 4.5
+ 1
+ 1
+ 1
+ 1
+ 1
+
+
+
+ WulaFallenEmpire.Verb_ShootArc
+ true
+ Wula_Darm_Matter_Beam
+ 20
+ 20
+ 0.5
+ 34.9
+ 25
+ 1.0
+ Shot_BeamRepeater
+ GunTail_Medium
+ 9
+
+ true
+
+ True
+ False
+ 4
+ WULA_ArcBeam
+
+
+ None
+
+
+
+ WULA_ArcBeam
+ MoteDualAttached
+ MoteOverhead
+
+ 0
+ 0.4
+ 0.4
+ False
+ True
+ True
+ False
+
+ true
+
+ Things/Mote/GraserBeam
+ (188, 112, 255, 255)
+ Graphic_MoteWithAgeSecs
+ MoteBeam
+
+ <_ExtraTexA>/Things/Mote/BeamSecondaryNoise_A
+ <_ExtraTexB>/Things/Mote/BeamSecondaryNoise_B
+ <_ScrollSpeedA>-4
+ <_ScrollSpeedB>3
+ <_Intensity>2
+
+
+
+
\ No newline at end of file
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo
index 8b21885f..d2045a8f 100644
Binary files a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo and b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo differ
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
index 402b3821..6fc89b93 100644
--- a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
+++ b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/DocumentLayout.json
@@ -3,13 +3,17 @@
"WorkspaceRootPath": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\",
"Documents": [
{
- "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\verb\\trackingbullet.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:verb\\trackingbullet.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\verb\\shootarc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:verb\\shootarc.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\verb\\propershotgun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:verb\\propershotgun.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
+ {
+ "AbsoluteMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|c:\\steam\\steamapps\\common\\rimworld\\mods\\3516260226\\source\\wulafallenempire\\verb\\trackingbullet.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{F5AE8C3B-0221-4C16-A128-9A62D521A8FF}|WulaFallenEmpire.csproj|solutionrelative:verb\\trackingbullet.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
{
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\VerbPropertiesExplosiveBeam.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Verb\\VerbPropertiesExplosiveBeam.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -59,6 +63,19 @@
{
"$type": "Document",
"DocumentIndex": 0,
+ "Title": "ShootArc.cs",
+ "DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\ShootArc.cs",
+ "RelativeDocumentMoniker": "Verb\\ShootArc.cs",
+ "ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\ShootArc.cs",
+ "RelativeToolTip": "Verb\\ShootArc.cs",
+ "ViewState": "AQIAAAAAAAAAAAAAAAAAAAwAAAAFAAAA",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2025-08-01T04:09:11.909Z",
+ "EditorCaption": ""
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
"Title": "Trackingbullet.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\Trackingbullet.cs",
"RelativeDocumentMoniker": "Verb\\Trackingbullet.cs",
@@ -77,13 +94,14 @@
"RelativeDocumentMoniker": "Verb\\ProperShotgun.cs",
"ToolTip": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\ProperShotgun.cs",
"RelativeToolTip": "Verb\\ProperShotgun.cs",
- "ViewState": "AQIAABUAAAAAAAAAAAAIwAgAAAAaAAAA",
+ "ViewState": "AQIAAAAAAAAAAAAAAAAAAAgAAAAaAAAA",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2025-07-31T17:19:04.819Z"
+ "WhenOpened": "2025-07-31T17:19:04.819Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 2,
+ "DocumentIndex": 3,
"Title": "VerbPropertiesExplosiveBeam.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\VerbPropertiesExplosiveBeam.cs",
"RelativeDocumentMoniker": "Verb\\VerbPropertiesExplosiveBeam.cs",
@@ -95,7 +113,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 9,
+ "DocumentIndex": 10,
"Title": "Verb_ShootBeamExplosive.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\Verb\\Verb_ShootBeamExplosive.cs",
"RelativeDocumentMoniker": "Verb\\Verb_ShootBeamExplosive.cs",
@@ -107,7 +125,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 7,
+ "DocumentIndex": 8,
"Title": "Effect.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\Effect.cs",
"RelativeDocumentMoniker": "EventSystem\\Effect.cs",
@@ -119,7 +137,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 5,
+ "DocumentIndex": 6,
"Title": "CompOpenCustomUI.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\CompOpenCustomUI.cs",
"RelativeDocumentMoniker": "EventSystem\\CompOpenCustomUI.cs",
@@ -131,7 +149,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 3,
+ "DocumentIndex": 4,
"Title": "Dialog_CustomDisplay.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\Dialog_CustomDisplay.cs",
"RelativeDocumentMoniker": "EventSystem\\Dialog_CustomDisplay.cs",
@@ -143,7 +161,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 6,
+ "DocumentIndex": 7,
"Title": "DebugActions.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\DebugActions.cs",
"RelativeDocumentMoniker": "EventSystem\\DebugActions.cs",
@@ -155,7 +173,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 8,
+ "DocumentIndex": 9,
"Title": "CustomUIDef.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\CustomUIDef.cs",
"RelativeDocumentMoniker": "EventSystem\\CustomUIDef.cs",
@@ -167,7 +185,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 4,
+ "DocumentIndex": 5,
"Title": "Condition.cs",
"DocumentMoniker": "C:\\Steam\\steamapps\\common\\RimWorld\\Mods\\3516260226\\Source\\WulaFallenEmpire\\EventSystem\\Condition.cs",
"RelativeDocumentMoniker": "EventSystem\\Condition.cs",
diff --git a/Source/WulaFallenEmpire/Verb/ShootArc.cs b/Source/WulaFallenEmpire/Verb/ShootArc.cs
new file mode 100644
index 00000000..77633315
--- /dev/null
+++ b/Source/WulaFallenEmpire/Verb/ShootArc.cs
@@ -0,0 +1,486 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using RimWorld;
+using UnityEngine;
+using Verse;
+using Verse.Sound;
+
+namespace WulaFallenEmpire
+{
+ public class VerbProperties_Arc : VerbProperties
+ {
+ public DamageDef damageDef;
+
+ public float EMPDamageAmount = -1f;
+
+ public int damageAmount = -1;
+
+ public float armorPenetration = -1f;
+
+ public float affectedAngle;
+
+ public bool isConductible = false;
+
+ public int conductNum;
+
+ public bool conductFriendly = false;
+ }
+
+ public class Verb_ShootArc : Verb
+ {
+ private VerbProperties_Arc Props
+ {
+ get
+ {
+ return (VerbProperties_Arc)this.verbProps;
+ }
+ }
+
+ private int damageAmount
+ {
+ get
+ {
+ return (this.Props.damageAmount > 0) ? this.Props.damageAmount : this.verbProps.beamDamageDef.defaultDamage;
+ }
+ }
+
+ private float armorPenetration
+ {
+ get
+ {
+ return (this.Props.armorPenetration > 0f) ? this.Props.armorPenetration : this.verbProps.beamDamageDef.defaultArmorPenetration;
+ }
+ }
+
+ public override void WarmupComplete()
+ {
+ this.TryCastShot();
+ }
+
+ protected override bool TryCastShot()
+ {
+ this.MakeExplosion();
+ bool flag = this.verbProps.soundCast != null;
+ bool flag3 = flag;
+ if (flag3)
+ {
+ this.verbProps.soundCast.PlayOneShot(new TargetInfo(this.caster.Position, this.caster.MapHeld, false));
+ }
+ bool flag2 = this.verbProps.soundCastTail != null;
+ bool flag4 = flag2;
+ if (flag4)
+ {
+ this.verbProps.soundCastTail.PlayOneShotOnCamera(this.caster.Map);
+ }
+ return true;
+ }
+
+ private bool IsTargetImmobile(LocalTargetInfo target)
+ {
+ Thing thing = target.Thing;
+ Pawn pawn = thing as Pawn;
+ return pawn != null && !pawn.Downed && pawn.GetPosture() == PawnPosture.Standing;
+ }
+
+ public override bool CanHitTarget(LocalTargetInfo targ)
+ {
+ bool flag = this.caster == null || !this.caster.Spawned;
+ bool flag2 = flag;
+ return !flag2 && (targ == this.caster || this.CanHitTargetFrom(this.caster.Position, targ));
+ }
+
+ protected void MakeExplosion()
+ {
+ Pawn casterPawn = this.CasterPawn;
+ bool spawned = casterPawn.Spawned;
+ bool flag11 = spawned;
+ if (flag11)
+ {
+ Thing targetThing = this.currentTarget.Thing;
+ bool flag = targetThing != null && this.IsTargetImmobile(this.currentTarget) && casterPawn.skills != null;
+ bool flag12 = flag;
+ if (flag12)
+ {
+ casterPawn.skills.Learn(SkillDefOf.Shooting, 250f * this.verbProps.AdjustedFullCycleTime(this, casterPawn), false, false);
+ }
+ bool flag2 = this.Props != null;
+ bool flag13 = flag2;
+ if (flag13)
+ {
+ List cells = Verb_ShootArc.circularSectorCellsStartedCaster(casterPawn.Position, casterPawn.Map, this.currentTarget.Cell, this.Props.range, this.Props.affectedAngle, false).ToList();
+ HashSet hashSet = this.HashSetConverter(cells);
+ this.pawnConduct.Add(casterPawn);
+ float weaponDamageMultiplier = base.EquipmentSource.GetStatValue(StatDefOf.RangedWeapon_DamageMultiplier, true, -1);
+ int damageMultiplier = this.GetDamageAmount(weaponDamageMultiplier, null);
+ float armorPenetrationMultiplier = this.GetArmorPenetration(weaponDamageMultiplier, null);
+ foreach (IntVec3 cell in hashSet)
+ {
+ List list = casterPawn.Map.thingGrid.ThingsListAt(cell);
+ for (int num = list.Count - 1; num >= 0; num--)
+ {
+ if (list[num] is Pawn p)
+ {
+ // 新增友方过滤逻辑
+ bool isFriendly = p.Faction != null
+ && casterPawn.Faction != null
+ && !p.Faction.HostileTo(casterPawn.Faction);
+
+ if (!Props.conductFriendly && isFriendly)
+ {
+ continue; // 跳过友方目标
+ }
+
+ // 原有姿势检查
+ bool isInvalidPosture = p.GetPosture() != PawnPosture.Standing
+ && this.currentTarget.Thing != p;
+
+ if (!isInvalidPosture)
+ {
+ this.pawnConduct.Add(p);
+ }
+ }
+ }
+ }
+ bool isConductible = this.Props.isConductible;
+ bool flag17 = isConductible;
+ if (flag17)
+ {
+ for (int i = 0; i < this.Props.conductNum; i++)
+ {
+ bool flag6 = i > this.pawnConduct.Count - 2;
+ bool flag18 = flag6;
+ if (flag18)
+ {
+ break;
+ }
+ bool flag7 = this.Props.EMPDamageAmount > 0f;
+ bool flag19 = flag7;
+ if (flag19)
+ {
+ this.TargetTakeDamage(casterPawn, this.pawnConduct[i + 1], DamageDefOf.EMP, this.Props.EMPDamageAmount, -1f);
+ }
+ this.TargetTakeDamage(casterPawn, this.pawnConduct[i + 1], this.Props.damageDef, (float)damageMultiplier, armorPenetrationMultiplier);
+ bool flag8 = this.verbProps.beamMoteDef != null;
+ bool flag20 = flag8;
+ if (flag20)
+ {
+ MoteMaker.MakeInteractionOverlay(this.verbProps.beamMoteDef, new TargetInfo(this.pawnConduct[i].Position, this.caster.Map, false), new TargetInfo(this.pawnConduct[i + 1].Position, this.caster.Map, false));
+ }
+ }
+ }
+ else
+ {
+ IntVec3 position = this.caster.Position;
+ float num2 = Mathf.Atan2(-(float)(this.currentTarget.Cell.z - position.z), (float)(this.currentTarget.Cell.x - position.x)) * 57.29578f;
+ bool flag9 = num2 - this.Props.affectedAngle < -180f || num2 + this.Props.affectedAngle > 180f;
+ bool flag21 = flag9;
+ if (flag21)
+ {
+ FloatRange? affectedAngle = new FloatRange?(new FloatRange(Verb_ShootArc.AngleWrapped(num2 - this.Props.affectedAngle), 180f));
+ // 修正后的爆炸调用(参数通过命名对齐)
+ GenExplosion.DoExplosion(
+ center: casterPawn.Position,
+ map: this.caster.MapHeld,
+ radius: this.verbProps.range,
+ damType: this.Props.damageDef,
+ instigator: null,
+ damAmount: damageMultiplier,
+ armorPenetration: armorPenetrationMultiplier,
+ explosionSound: null,
+ weapon: this.CasterPawn.equipment.Primary.def,
+ projectile: null,
+ intendedTarget: null,
+ postExplosionSpawnThingDef: ThingDefOf.Filth_FlammableBile,
+ postExplosionSpawnChance: 0f,
+ postExplosionSpawnThingCount: 1,
+ postExplosionGasType: null,
+ postExplosionGasRadiusOverride: null,
+ postExplosionGasAmount: 0,
+ applyDamageToExplosionCellsNeighbors: false,
+ preExplosionSpawnThingDef: null,
+ preExplosionSpawnChance: 0f,
+ preExplosionSpawnThingCount: 1,
+ chanceToStartFire: 0f,
+ damageFalloff: false,
+ direction: null,
+ ignoredThings: null,
+ affectedAngle: affectedAngle,
+ doVisualEffects: true,
+ propagationSpeed: 0.6f,
+ excludeRadius: 0f,
+ doSoundEffects: false,
+ postExplosionSpawnThingDefWater: null,
+ screenShakeFactor: 1f,
+ flammabilityChanceCurve: null,
+ overrideCells: null,
+ postExplosionSpawnSingleThingDef: null,
+ preExplosionSpawnSingleThingDef: null
+ );
+
+ affectedAngle = new FloatRange?(new FloatRange(-180f, Verb_ShootArc.AngleWrapped(num2 + this.Props.affectedAngle)));
+ // 第二次爆炸调用(参数结构相同)
+ GenExplosion.DoExplosion(
+ center: casterPawn.Position,
+ map: this.caster.MapHeld,
+ radius: this.verbProps.range,
+ damType: this.Props.damageDef,
+ instigator: null,
+ damAmount: damageMultiplier,
+ armorPenetration: armorPenetrationMultiplier,
+ explosionSound: null,
+ weapon: this.CasterPawn.equipment.Primary.def,
+ projectile: null,
+ intendedTarget: null,
+ postExplosionSpawnThingDef: ThingDefOf.Filth_FlammableBile,
+ postExplosionSpawnChance: 0f,
+ postExplosionSpawnThingCount: 1,
+ postExplosionGasType: null,
+ postExplosionGasRadiusOverride: null,
+ postExplosionGasAmount: 0,
+ applyDamageToExplosionCellsNeighbors: false,
+ preExplosionSpawnThingDef: null,
+ preExplosionSpawnChance: 0f,
+ preExplosionSpawnThingCount: 1,
+ chanceToStartFire: 0f,
+ damageFalloff: false,
+ direction: null,
+ ignoredThings: null,
+ affectedAngle: affectedAngle,
+ doVisualEffects: true,
+ propagationSpeed: 0.6f,
+ excludeRadius: 0f,
+ doSoundEffects: false,
+ postExplosionSpawnThingDefWater: null,
+ screenShakeFactor: 1f,
+ flammabilityChanceCurve: null,
+ overrideCells: null,
+ postExplosionSpawnSingleThingDef: null,
+ preExplosionSpawnSingleThingDef: null
+ );
+ }
+ else
+ {
+ FloatRange? affectedAngle2 = new FloatRange?(new FloatRange(num2 - this.Props.affectedAngle, num2 + this.Props.affectedAngle));
+ GenExplosion.DoExplosion(
+ center: casterPawn.Position,
+ map: this.caster.MapHeld,
+ radius: this.verbProps.range,
+ damType: this.Props.damageDef,
+ instigator: null,
+ damAmount: damageMultiplier,
+ armorPenetration: armorPenetrationMultiplier,
+ explosionSound: null,
+ weapon: this.CasterPawn.equipment.Primary.def,
+ projectile: null,
+ intendedTarget: null,
+ postExplosionSpawnThingDef: ThingDefOf.Filth_FlammableBile,
+ postExplosionSpawnChance: 0f,
+ postExplosionSpawnThingCount: 1,
+ postExplosionGasType: null,
+ postExplosionGasRadiusOverride: null,
+ postExplosionGasAmount: 0,
+ applyDamageToExplosionCellsNeighbors: false,
+ preExplosionSpawnThingDef: null,
+ preExplosionSpawnChance: 0f,
+ preExplosionSpawnThingCount: 1,
+ chanceToStartFire: 0f,
+ damageFalloff: false,
+ direction: null,
+ ignoredThings: null,
+ affectedAngle: affectedAngle2,
+ doVisualEffects: true,
+ propagationSpeed: 0.6f,
+ excludeRadius: 0f,
+ doSoundEffects: false,
+ postExplosionSpawnThingDefWater: null,
+ screenShakeFactor: 1f,
+ flammabilityChanceCurve: null,
+ overrideCells: null,
+ postExplosionSpawnSingleThingDef: null,
+ preExplosionSpawnSingleThingDef: null
+ );
+ }
+ for (int j = 1; j < this.pawnConduct.Count(); j++)
+ {
+ bool flag10 = this.Props.EMPDamageAmount > 0f;
+ bool flag22 = flag10;
+ if (flag22)
+ {
+ this.TargetTakeDamage(casterPawn, this.pawnConduct[j], DamageDefOf.EMP, this.Props.EMPDamageAmount, -1f);
+ }
+ }
+ }
+ this.pawnConduct.Clear();
+ }
+ }
+ }
+
+
+ public override void DrawHighlight(LocalTargetInfo target)
+ {
+ base.DrawHighlight(target);
+ bool isValid = target.IsValid;
+ bool flag = isValid;
+ if (flag)
+ {
+ IntVec3 position = this.caster.Position;
+ float num = Mathf.Atan2(-(float)(target.Cell.z - position.z), (float)(target.Cell.x - position.x)) * 57.29578f;
+ Verb_ShootArc.RenderPredictedAreaOfEffect(this.caster.Position, this.Props.range, this.verbProps.explosionRadiusRingColor, new FloatRange(num - this.Props.affectedAngle, num + this.Props.affectedAngle));
+ }
+ }
+
+ public static void RenderPredictedAreaOfEffect(IntVec3 loc, float radius, Color color, FloatRange affectedAngle)
+ {
+ bool flag = affectedAngle.min < -180f || affectedAngle.max > 180f;
+ bool flag2 = flag;
+ List cellsSum;
+ if (flag2)
+ {
+ DamageWorker worker = DamageDefOf.Bomb.Worker;
+ Map currentMap = Find.CurrentMap;
+ FloatRange? affectedAngle2 = new FloatRange?(new FloatRange(Verb_ShootArc.AngleWrapped(affectedAngle.min), 180f));
+ List cells = worker.ExplosionCellsToHit(loc, currentMap, radius, null, null, affectedAngle2).ToList();
+ DamageWorker worker2 = DamageDefOf.Bomb.Worker;
+ Map currentMap2 = Find.CurrentMap;
+ affectedAngle2 = new FloatRange?(new FloatRange(-180f, Verb_ShootArc.AngleWrapped(affectedAngle.max)));
+ List cells2 = worker2.ExplosionCellsToHit(loc, currentMap2, radius, null, null, affectedAngle2).ToList();
+ cellsSum = cells.Concat(cells2).ToList();
+ }
+ else
+ {
+ DamageWorker worker3 = DamageDefOf.Bomb.Worker;
+ Map currentMap3 = Find.CurrentMap;
+ FloatRange? affectedAngle3 = new FloatRange?(affectedAngle);
+ cellsSum = worker3.ExplosionCellsToHit(loc, currentMap3, radius, null, null, affectedAngle3).ToList();
+ }
+ GenDraw.DrawFieldEdges(cellsSum, color, null);
+ }
+
+ public static float AngleWrapped(float angle)
+ {
+ while (angle > 180f)
+ {
+ angle -= 360f;
+ }
+ while (angle < -180f)
+ {
+ angle += 360f;
+ }
+ return (angle == 180f) ? -180f : angle;
+ }
+
+ private static IEnumerable circularSectorCellsStartedCaster(IntVec3 center, Map map, IntVec3 target, float radius, float angle, bool useCenter = false)
+ {
+ float num = Mathf.Atan2(-(float)(target.z - center.z), (float)(target.x - center.x)) * 57.29578f;
+ FloatRange affectedAngle = new FloatRange(num - angle, num + angle);
+ bool flag = affectedAngle.min < -180f || affectedAngle.max > 180f;
+ bool flag2 = flag;
+ List cellsSum;
+ if (flag2)
+ {
+ DamageWorker worker = DamageDefOf.Bomb.Worker;
+ FloatRange? affectedAngle2 = new FloatRange?(new FloatRange(Verb_ShootArc.AngleWrapped(affectedAngle.min), 180f));
+ List cells = worker.ExplosionCellsToHit(center, map, radius, null, null, affectedAngle2).ToList();
+ DamageWorker worker2 = DamageDefOf.Bomb.Worker;
+ affectedAngle2 = new FloatRange?(new FloatRange(-180f, Verb_ShootArc.AngleWrapped(affectedAngle.max)));
+ List cells2 = worker2.ExplosionCellsToHit(center, map, radius, null, null, affectedAngle2).ToList();
+ cellsSum = cells.Concat(cells2).ToList();
+ }
+ else
+ {
+ DamageWorker worker3 = DamageDefOf.Bomb.Worker;
+ FloatRange? affectedAngle3 = new FloatRange?(affectedAngle);
+ cellsSum = worker3.ExplosionCellsToHit(center, map, radius, null, null, affectedAngle3).ToList();
+ }
+ return cellsSum;
+ }
+
+ protected virtual HashSet HashSetConverter(IEnumerable points)
+ {
+ HashSet hashSet = new HashSet();
+ bool flag = points.Any();
+ bool flag2 = flag;
+ if (flag2)
+ {
+ foreach (IntVec3 point in points)
+ {
+ hashSet.Add(point);
+ }
+ }
+ return hashSet;
+ }
+
+ private void TargetTakeDamage(Pawn caster, Pawn target, DamageDef damageDef, float damageAmount, float armorPenetration = -1f)
+ {
+ bool flag = caster == null || target == null;
+ bool flag2 = flag;
+ if (flag2)
+ {
+ Log.Error("TargetTakeDamage has null caster or target");
+ }
+ else
+ {
+ float angleFlat = (this.currentTarget.Cell - caster.Position).AngleFlat;
+ BattleLogEntry_RangedImpact log = new BattleLogEntry_RangedImpact(caster, target, this.currentTarget.Thing, base.EquipmentSource.def, null, null);
+ DamageInfo dinfo = new DamageInfo(damageDef, damageAmount, armorPenetration, angleFlat, caster, null, base.EquipmentSource.def, DamageInfo.SourceCategory.ThingOrUnknown, this.currentTarget.Thing, true, true, QualityCategory.Normal, true);
+ target.TakeDamage(dinfo).AssociateWithLog(log);
+ }
+ }
+
+ public int GetDamageAmount(float weaponDamageMultiplier, StringBuilder explanation = null)
+ {
+ int num = this.damageAmount;
+ bool flag = explanation != null;
+ bool flag3 = flag;
+ if (flag3)
+ {
+ explanation.AppendLine("StatsReport_BaseValue".Translate() + ": " + num.ToString());
+ explanation.Append("StatsReport_QualityMultiplier".Translate() + ": " + weaponDamageMultiplier.ToStringPercent());
+ }
+ num = Mathf.RoundToInt((float)num * weaponDamageMultiplier);
+ bool flag2 = explanation != null;
+ bool flag4 = flag2;
+ if (flag4)
+ {
+ explanation.AppendLine();
+ explanation.AppendLine();
+ explanation.Append("StatsReport_FinalValue".Translate() + ": " + num.ToString());
+ }
+ return num;
+ }
+
+ public float GetArmorPenetration(float weaponDamageMultiplier, StringBuilder explanation = null)
+ {
+ float num = this.armorPenetration;
+ bool flag = num < 0f;
+ bool flag4 = flag;
+ if (flag4)
+ {
+ num = (float)this.damageAmount * 0.015f;
+ }
+ bool flag2 = explanation != null;
+ bool flag5 = flag2;
+ if (flag5)
+ {
+ explanation.AppendLine("StatsReport_BaseValue".Translate() + ": " + num.ToStringPercent());
+ explanation.AppendLine();
+ explanation.Append("StatsReport_QualityMultiplier".Translate() + ": " + weaponDamageMultiplier.ToStringPercent());
+ }
+ num *= weaponDamageMultiplier;
+ bool flag3 = explanation != null;
+ bool flag6 = flag3;
+ if (flag6)
+ {
+ explanation.AppendLine();
+ explanation.AppendLine();
+ explanation.Append("StatsReport_FinalValue".Translate() + ": " + num.ToStringPercent());
+ }
+ return num;
+ }
+
+ public List pawnConduct = new List();
+ }
+}
+
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index 1d22d695..1237c021 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -73,6 +73,7 @@
+