From f087d995bb5ddd9be1383c04762da801a6bc64ce Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Fri, 1 Aug 2025 21:27:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/Assemblies/WulaFallenEmpire.dll | Bin 108544 -> 111616 bytes .../WULA_FallenEmpire_Rituals.xml | 86 ++++ .../WULA_FallenEmpire_Buildings_Ritual.xml | 90 ++++ .../Keyed/WULA_Ritual_Keys.xml | 10 + .../PsychicRitual_TechOffering.cs | 188 +++++++ Source/WulaFallenEmpire/Verb/ShootArc.cs | 322 ++++-------- .../WulaFallenEmpire/WulaFallenEmpire.csproj | 1 + 美术与文本源文件/故障的arc代码之扇形攻击.txt | 486 ++++++++++++++++++ 8 files changed, 970 insertions(+), 213 deletions(-) create mode 100644 1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml create mode 100644 1.6/Defs/ThingDefs_Buildings/WULA_FallenEmpire_Buildings_Ritual.xml create mode 100644 Languages/ChineseSimplified (简体中文)/Keyed/WULA_Ritual_Keys.xml create mode 100644 Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs create mode 100644 美术与文本源文件/故障的arc代码之扇形攻击.txt diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index dda1f49ba750a29d58262a6fe629f30e93dee208..7b2e5af361740922414a93342a3c28054ca40165 100644 GIT binary patch delta 50445 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 y{Eu(zb6PPie*A6ywpLQETOY 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 z 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 O)7!P@$v327g8aWuehv=+ diff --git a/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml b/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml new file mode 100644 index 00000000..5a80c1ee --- /dev/null +++ b/1.6/Defs/PsychicRitualDefs/WULA_FallenEmpire_Rituals.xml @@ -0,0 +1,86 @@ + + + + + WULA_Ritual_TechOffering + + 乌拉帝国用于交换失落技术的灵能仪式。通过献上高价值的科技产品,帝国可以从时空的裂隙中获得罕见的武器或工具。 + 1800 + 15 + BasicPsychicRituals + UI/PsychicRituals/PsychicRitual_Default + + + + +
  • TechprofSubpersonaCore
  • +
    +
    + 1 +
    + + +
  • + Gold + 0.005 +
  • +
  • + Plasteel + 0.01 +
  • +
  • + Uranium + 0.015 +
  • +
  • + ComponentSpacer + 0.05 +
  • +
  • + TechprofSubpersonaCore + 0.2 +
  • +
    + + +
  • WULA_MW_Breaker_Bar
  • +
  • WULA_MW_Charge_Mace
  • +
  • WULA_MW_Lance
  • +
  • WULA_MW_ChainSword
  • +
  • WULA_MW_Glaive
  • +
  • WULA_RW_Fractal_AR
  • +
  • WULA_RW_StarDrift_SG
  • +
  • WULA_RW_Sphene_MG
  • +
  • WULA_RW_Handle_Cannon
  • +
  • WULA_RW_AutoCannon
  • +
  • WULA_RW_Auto_GL
  • +
  • WULA_RW_DM_AR
  • +
  • WULA_RW_DM_Cannon
  • +
    + + +
  • + 1.0 + Legendary +
  • +
  • + 0.8 + Masterwork +
  • +
  • + 0.5 + Excellent +
  • +
  • + 0.2 + Normal +
  • +
  • + 0.0 + Poor +
  • +
    + +
    + +
    \ No newline at end of file diff --git a/1.6/Defs/ThingDefs_Buildings/WULA_FallenEmpire_Buildings_Ritual.xml b/1.6/Defs/ThingDefs_Buildings/WULA_FallenEmpire_Buildings_Ritual.xml new file mode 100644 index 00000000..cac34dca --- /dev/null +++ b/1.6/Defs/ThingDefs_Buildings/WULA_FallenEmpire_Buildings_Ritual.xml @@ -0,0 +1,90 @@ + + + + + WULA_OfferingPedestal + + 一个用于进行灵能献祭的华丽基座。它可以作为灵能的冥想焦点,并能通过附近的灵能设施获得强化。它是启动帝国科技献祭仪式的关键建筑。 + Normal + Standable + false + + SupportPlantsOnly + false + false + false + false + +
  • Anomaly
  • +
    +
    + 200 + + Things/Building/PsychicRitualSpot + Graphic_Single + (3, 3) + + (3, 3) + Light + +
  • PsychicRituals
  • +
    + +
  • ITab_Entity
  • +
    + Misc + FloorEmplacement + true + false + + 0 + 0.08 + + false + +
  • PlaceWorker_NeverAdjacentUnstandableRadial
  • +
    + True + +
  • + WULA_FallenEmpire_TechOffering + 10 +
  • +
  • + +
  • ShardBeacon
  • +
  • VoidSculpture
  • + + +
  • + MeditationFocusStrength + +
  • Void
  • + + +
  • + +
  • ShardBeacon
  • +
    + 0.02 + 9.9 + 4 + MeditationFocusPerBuilding + MeditationFocusPerBuildingAbstract + +
  • + +
  • VoidSculpture
  • + + 0.02 + 9.9 + 6 + MeditationFocusPerBuilding + MeditationFocusPerBuildingAbstract + + + + + + + \ No newline at end of file diff --git a/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Ritual_Keys.xml b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Ritual_Keys.xml new file mode 100644 index 00000000..f418a32b --- /dev/null +++ b/Languages/ChineseSimplified (简体中文)/Keyed/WULA_Ritual_Keys.xml @@ -0,0 +1,10 @@ + + + + 献祭的回报 + 你们的献祭得到了回应。虚空吐出了一件物品作为奖赏:{0} (品质: {1})。 + + 额外祭品 + 在仪式中心附近放置的贵重物品提升了仪式的品质。这些物品将在仪式完成时被消耗。 + + \ No newline at end of file diff --git a/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs b/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs new file mode 100644 index 00000000..df372cef --- /dev/null +++ b/Source/WulaFallenEmpire/PsychicRitual_TechOffering.cs @@ -0,0 +1,188 @@ +using System.Collections.Generic; +using System.Linq; +using RimWorld; +using Verse; +using Verse.AI.Group; + +namespace WulaFallenEmpire +{ + // 用于在XML中定义祭品 + public class OfferingItem + { + public ThingDef thingDef; + public float power; + } + + public class QualityThreshold + { + public float threshold; + public QualityCategory quality; + } + + public class PsychicRitual_TechOffering : PsychicRitualDef_InvocationCircle + { + // 从XML加载的额外祭品列表 + public List extraOfferings = new List(); + + // 从XML加载的奖励池 + public List rewardWeaponPool = new List(); + + // 从XML加载的品质阈值 + public List qualityThresholds = new List(); + + // 重写计算最大能量的方法 + public override void CalculateMaxPower(PsychicRitualRoleAssignments assignments, List powerFactorsOut, out float power) + { + // 首先调用基类方法 + base.CalculateMaxPower(assignments, powerFactorsOut, out power); + + IntVec3 center = assignments.Target.Cell; + Map map = assignments.Target.Map; + float offeringRadius = 8f; + + float extraPowerFromOfferings = 0f; + if (!extraOfferings.NullOrEmpty()) + { + var offeringThings = new Dictionary(); + foreach(var offering in extraOfferings) + { + offeringThings[offering.thingDef] = offering.power; + } + + foreach (Thing thing in GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true)) + { + if (offeringThings.TryGetValue(thing.def, out float value)) + { + extraPowerFromOfferings += value * thing.stackCount; + } + } + } + + if (extraPowerFromOfferings > 0) + { + powerFactorsOut?.Add(new QualityFactor + { + label = "WULA_ExtraOfferings".Translate(), + positive = true, + quality = extraPowerFromOfferings, + toolTip = "WULA_ExtraOfferings_Tooltip".Translate() + }); + power += extraPowerFromOfferings; + } + + power = UnityEngine.Mathf.Clamp01(power); + } + + // 重写创建仪式步骤的方法 + public override List CreateToils(PsychicRitual psychicRitual, PsychicRitualGraph parent) + { + // 获取基类的仪式步骤 + List toils = base.CreateToils(psychicRitual, parent); + + // 在最后添加我们自定义的奖励步骤 + toils.Add(new PsychicRitualToil_TechOfferingOutcome(psychicRitual, this)); + + return toils; + } + } + + // 自定义的仪式步骤,用于处理奖励 + public class PsychicRitualToil_TechOfferingOutcome : PsychicRitualToil + { + private PsychicRitual psychicRitual; + private PsychicRitualDef def; + + public PsychicRitualToil_TechOfferingOutcome(PsychicRitual psychicRitual, PsychicRitualDef def) + { + this.psychicRitual = psychicRitual; + this.def = def; + } + + public override bool Tick(PsychicRitual psychicRitual, PsychicRitualGraph parent) + { + float power = psychicRitual.power; + + // 消耗祭品 + IntVec3 center = psychicRitual.assignments.Target.Cell; + Map map = psychicRitual.assignments.Target.Map; + float offeringRadius = 8f; + + PsychicRitual_TechOffering ritualDef = (PsychicRitual_TechOffering)def; + + if (!ritualDef.extraOfferings.NullOrEmpty()) + { + var offeringThings = new Dictionary(); + foreach(var offering in ritualDef.extraOfferings) + { + offeringThings[offering.thingDef] = offering.power; + } + + foreach (Thing thing in GenRadial.RadialDistinctThingsAround(center, map, offeringRadius, useCenter: true)) + { + if (offeringThings.ContainsKey(thing.def)) + { + thing.Destroy(DestroyMode.Vanish); + } + } + } + + // 从奖励池中随机选择一个武器 + if (ritualDef.rewardWeaponPool.NullOrEmpty()) + { + Log.Error($"[WulaFallenEmpire] Reward weapon pool is empty for {def.defName}"); + return true; + } + ThingDef weaponDef = ritualDef.rewardWeaponPool.RandomElement(); + if (weaponDef == null) + { + Log.Error($"[WulaFallenEmpire] Could not find weapon Def: {weaponDef.defName}"); + return true; + } + + // 根据能量值决定物品品质 + QualityCategory quality = QualityCategory.Awful; // 默认最低品质 + if (!ritualDef.qualityThresholds.NullOrEmpty()) + { + // 对阈值列表按阈值从高到低排序 + var sortedThresholds = ritualDef.qualityThresholds.OrderByDescending(t => t.threshold).ToList(); + foreach (var threshold in sortedThresholds) + { + if (power >= threshold.threshold) + { + quality = threshold.quality; + break; // 找到第一个满足的阈值就跳出 + } + } + } + else // 如果XML中没有定义,则使用硬编码的默认值 + { + if (power >= 1.0f) { quality = QualityCategory.Legendary; } + else if (power >= 0.8f) { quality = QualityCategory.Masterwork; } + else if (power >= 0.5f) { quality = QualityCategory.Excellent; } + else if (power >= 0.2f) { quality = QualityCategory.Normal; } + else { quality = QualityCategory.Poor; } + } + + // 创建物品并设置品质 + Thing reward = ThingMaker.MakeThing(weaponDef); + CompQuality compQuality = reward.TryGetComp(); + if (compQuality != null) + { + compQuality.SetQuality(quality, ArtGenerationContext.Colony); + } + + // 在仪式中心点生成奖励物品 + GenPlace.TryPlaceThing(reward, psychicRitual.assignments.Target.Cell, map, ThingPlaceMode.Near); + + // 发送消息通知玩家 + Find.LetterStack.ReceiveLetter( + "WULA_RitualReward_Label".Translate(), + "WULA_RitualReward_Description".Translate(reward.Label, quality.GetLabel()), + LetterDefOf.PositiveEvent, + new LookTargets(psychicRitual.assignments.Target.Cell, map) + ); + + return true; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb/ShootArc.cs b/Source/WulaFallenEmpire/Verb/ShootArc.cs index 77633315..e31a1ef5 100644 --- a/Source/WulaFallenEmpire/Verb/ShootArc.cs +++ b/Source/WulaFallenEmpire/Verb/ShootArc.cs @@ -94,227 +94,123 @@ namespace WulaFallenEmpire protected void MakeExplosion() { Pawn casterPawn = this.CasterPawn; - bool spawned = casterPawn.Spawned; - bool flag11 = spawned; - if (flag11) + if (!casterPawn.Spawned || this.Props == null) { - Thing targetThing = this.currentTarget.Thing; - bool flag = targetThing != null && this.IsTargetImmobile(this.currentTarget) && casterPawn.skills != null; - bool flag12 = flag; - if (flag12) + return; + } + + // 技能学习逻辑 (只在目标是站立Pawn时) + if (this.currentTarget.Thing is Pawn targetPawn && !targetPawn.Downed && targetPawn.GetPosture() == PawnPosture.Standing && casterPawn.skills != null) + { + casterPawn.skills.Learn(SkillDefOf.Shooting, 250f * verbProps.AdjustedFullCycleTime(this, casterPawn), false, false); + } + + float weaponDamageMultiplier = base.EquipmentSource.GetStatValue(StatDefOf.RangedWeapon_DamageMultiplier, true, -1); + int damageMultiplier = this.GetDamageAmount(weaponDamageMultiplier, null); + float armorPenetrationMultiplier = this.GetArmorPenetration(weaponDamageMultiplier, null); + + // 总是先收集范围内的Pawn,为后续决策做准备 + 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); + + foreach (IntVec3 cell in hashSet) + { + List list = casterPawn.Map.thingGrid.ThingsListAt(cell); + for (int num = list.Count - 1; num >= 0; num--) { - 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) + if (list[num] is Pawn p) { - List list = casterPawn.Map.thingGrid.ThingsListAt(cell); - for (int num = list.Count - 1; num >= 0; num--) + bool isFriendly = p.Faction != null && casterPawn.Faction != null && !p.Faction.HostileTo(casterPawn.Faction); + if (!this.Props.conductFriendly && isFriendly) { - 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); - } - } + 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(); } } + + // 决策:如果设为导电模式且有至少一个传导目标,则进行链式攻击 + if (this.Props.isConductible && this.pawnConduct.Count > 1) + { + for (int i = 0; i < this.Props.conductNum && i < this.pawnConduct.Count - 1; i++) + { + if (this.Props.EMPDamageAmount > 0f) + { + 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); + if (this.verbProps.beamMoteDef != null) + { + 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 + { + Thing primaryTarget = this.currentTarget.Thing; + if (primaryTarget != null) + { + float angle = (primaryTarget.Position - this.caster.Position).AngleFlat; + DamageInfo dinfo = new DamageInfo(this.Props.damageDef, (float)damageMultiplier, armorPenetrationMultiplier, angle, this.caster, null, base.EquipmentSource.def, DamageInfo.SourceCategory.ThingOrUnknown, this.currentTarget.Thing); + primaryTarget.TakeDamage(dinfo); + } + + // 无论是否命中,都显示视觉效果 + if (this.verbProps.beamMoteDef != null) + { + MoteMaker.MakeInteractionOverlay(this.verbProps.beamMoteDef, new TargetInfo(this.caster.Position, this.caster.Map, false), new TargetInfo(this.currentTarget.Cell, this.caster.Map, false)); + } + } + this.pawnConduct.Clear(); + } + + private void DoExplosion(Pawn casterPawn, int damAmount, float armorPenetration, FloatRange? affectedAngle) + { + GenExplosion.DoExplosion( + center: casterPawn.Position, + map: this.caster.MapHeld, + radius: this.verbProps.range, + damType: this.Props.damageDef, + instigator: casterPawn, // Corrected + damAmount: damAmount, + armorPenetration: armorPenetration, + explosionSound: null, + weapon: this.CasterPawn.equipment?.Primary?.def, // Safety check + projectile: null, + intendedTarget: this.currentTarget.Thing, // Corrected + postExplosionSpawnThingDef: null, // Simplified + 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 + ); } diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 589cf25e..1a6de663 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -118,6 +118,7 @@ + diff --git a/美术与文本源文件/故障的arc代码之扇形攻击.txt b/美术与文本源文件/故障的arc代码之扇形攻击.txt new file mode 100644 index 00000000..e837ec66 --- /dev/null +++ b/美术与文本源文件/故障的arc代码之扇形攻击.txt @@ -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(); + } +} +