From 2c8166b8327c7d209854703ae303f45d07aa4ee9 Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Mon, 21 Jul 2025 13:45:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=98=E4=B8=80=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 7 + 1.6/Assemblies/WulaFallenEmpire.dll | Bin 38400 -> 40960 bytes 1.6/Assemblies/WulaFallenEmpire.pdb | Bin 118272 -> 130560 bytes .../AbilityDefs/Abilities_WULA_Emergency.xml | 36 ++ .../HediffDefs/Hediffs_BodyParts_WULA.xml | 95 +++-- .../HediffDefs/Hediffs_WULA_Emergency.xml | 35 ++ 1.6/Defs/PawnKinds/PawnKinds_Wula.xml | 28 +- .../Apparel/WULA_ShieldBelt.xml | 0 .../Weapons/WULA_ExplosiveBeamWeapons.xml | 395 +++++++++--------- .../ExplosiveBeamWeapons/开发指南.md | 259 ------------ .../ExplosiveBeamWeapons/测试说明.md | 157 ------- .../ExplosiveBeamWeapons/示例武器.md | 262 ------------ .../ExplosiveBeamWeapons/配置说明.md | 116 ----- Documentation/README.md | 30 -- ...ompAbilityEffect_EmergencyEnergyRestore.cs | 64 +++ ...roperties_AbilityEmergencyEnergyRestore.cs | 17 + .../Hediff_EmergencyEnergyRestore.cs | 71 ++++ .../WulaFallenEmpire/WulaFallenEmpire.csproj | 3 + 18 files changed, 510 insertions(+), 1065 deletions(-) create mode 100644 1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml create mode 100644 1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml create mode 100644 1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml delete mode 100644 Documentation/ExplosiveBeamWeapons/开发指南.md delete mode 100644 Documentation/ExplosiveBeamWeapons/测试说明.md delete mode 100644 Documentation/ExplosiveBeamWeapons/示例武器.md delete mode 100644 Documentation/ExplosiveBeamWeapons/配置说明.md delete mode 100644 Documentation/README.md create mode 100644 Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs create mode 100644 Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs create mode 100644 Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs diff --git a/.gitignore b/.gitignore index dcff767d..2d2bf7ca 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,10 @@ *.log *.cache *.tmp + +# Build outputs and debug files +**/obj/Debug/ +**/obj/Release/ +**/bin/Debug/ +**/bin/Release/ +*.csproj.CoreCompileInputs.cache diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 372405ab146b3274c338c2d245a8c845a6dc3e33..d0d59f337d5309d5bf697bdc51a02a4bcf6950e7 100644 GIT binary patch delta 14335 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 E0ryz9OaK4? delta 11882 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 diff --git a/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml b/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml new file mode 100644 index 00000000..e2bc7ec2 --- /dev/null +++ b/1.6/Defs/AbilityDefs/Abilities_WULA_Emergency.xml @@ -0,0 +1,36 @@ + + + + + WULA_EmergencyEnergyRestore + + 激活紧急能量协议,暂时将能量需求锁定在100%,持续10秒后恢复到原来的能量水平。只能在倒地时使用。 + UI/Abilities/MetalbloodInjection + 72000 + true + true + false + CastAbilityOnThing + false + false + + Verb_CastAbility + 0 + 1 + Psycast_Skip_Entry + + true + false + false + + + +
  • + 600 + WULA_EmergencyEnergyRestore_Hediff + true +
  • +
    +
    + +
    \ No newline at end of file diff --git a/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml b/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml index 2f2f0ad2..edbe0fac 100644 --- a/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml +++ b/1.6/Defs/HediffDefs/Hediffs_BodyParts_WULA.xml @@ -138,7 +138,7 @@ 立刻激活能源炉的超载能力,极大增加近战的命中率和速度,并且不会被敌人的近战减速。 UI/Abilities/MetalbloodInjection - 1800 + 1800 false true false @@ -244,10 +244,13 @@
  • - + 0 + + + 0.5 - + 0.9
  • @@ -310,7 +313,9 @@ WULA_Energy_Furnace_Hediff_DM_Engine 一台由暗物质作为能源驱动的合成人能源炉,拥有永不枯竭的动力,合成人安装后将不再需要充电。 - WULA_Energy_Furnace_DM_Engine + + WULA_Energy_Furnace_DM_Engine + WULA_Energy_Furnace_DM_Engine @@ -334,13 +339,17 @@ WULA_Energy_Furnace_DM_Engine 一台由暗物质作为能源驱动的合成人能源炉,拥有永不枯竭的动力,合成人安装后将不再需要充电。 - Install_WULA_Energy_Furnace_DM_Engine + + Install_WULA_Energy_Furnace_DM_Engine + 100 4 1 -
  • RewardStandardMidFreq
  • + +
  • RewardStandardMidFreq
  • +
    WULA_Synth_Addons_2_Technology @@ -360,7 +369,8 @@ WULA_Energy_Furnace_Hediff_DM_Engine 安装暗物质能源炉中 - + + false
  • @@ -393,7 +403,9 @@ WULA_Energy_Furnace_Hediff_DM_CPU 由填充非交互性暗物质微粒的卡西米尔共振腔构成的处理器,极大增强合成人的意识。 - WULA_Energy_Furnace_DM_CPU + + WULA_Energy_Furnace_DM_CPU + WULA_Energy_Furnace_DM_CPU @@ -414,13 +426,17 @@ WULA_Energy_Furnace_DM_CPU 由填充非交互性暗物质微粒的卡西米尔共振腔构成的处理器,用于替换过时的生物处理器,极大增强合成人的意识。 - Install_WULA_Energy_Furnace_DM_CPU + + Install_WULA_Energy_Furnace_DM_CPU + 100 8 2 -
  • RewardStandardMidFreq
  • + +
  • RewardStandardMidFreq
  • +
    WULA_Synth_Addons_2_Technology @@ -440,7 +456,8 @@ WULA_Energy_Furnace_Hediff_DM_CPU 安装暗物质处理器中 - + + false
  • @@ -474,7 +491,9 @@ Hediff_Implant 利用暗物质压缩而成的内嵌式中子装甲层和结构层,植入机械乌拉的体内时将使得她们获得强大的防御力。 - WULA_Skeleton_Neutronium + + WULA_Skeleton_Neutronium + WULA_Skeleton_Neutronium @@ -502,12 +521,16 @@ WULA_Skeleton_Neutronium 利用暗物质压缩而成的内嵌式中子装甲层和结构层,植入机械乌拉的体内时将使得她们获得强大的防御力。 - Install_WULA_Energy_Furnace_DM_Engine + + Install_WULA_Energy_Furnace_DM_Engine + 100 2 -
  • RewardStandardMidFreq
  • + +
  • RewardStandardMidFreq
  • +
    WULA_Synth_Addons_2_Technology @@ -527,7 +550,8 @@ WULA_Skeleton_Hediff_Neutronium 安装零素骨架中 - + + false
  • @@ -639,7 +663,7 @@ (0.5, 0.8, 1.0) false true - 1 + 1 0 3 True @@ -724,7 +748,7 @@ (0.5, 0.8, 1.0) false true - 1 + 1 0 3 True @@ -791,12 +815,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 1500 3 @@ -830,12 +855,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 3000 7 @@ -869,12 +895,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 3000 7 @@ -908,12 +935,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 1500 3 @@ -947,12 +975,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 1500 3 @@ -994,12 +1023,13 @@ Steel false - + + WULA_Body_Fixed
  • WulaSpecies
  • - + 7000
  • WULA_Repair_All_Technology
  • @@ -1039,7 +1069,7 @@ 这个合成人的破损已被细致地修复。 false true - false + false
  • 1 @@ -1066,7 +1096,8 @@
  • WULA_Synth_Psi_Technology
  • WULA_Soul_Wedge - + + false 2 @@ -1089,7 +1120,7 @@ true true true - true + true Brain
  • diff --git a/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml b/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml new file mode 100644 index 00000000..e8da5c8d --- /dev/null +++ b/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml @@ -0,0 +1,35 @@ + + + + + WULA_EmergencyEnergyRestore_Hediff + + 紧急能量协议激活中,能量需求被暂时锁定在100%。 + WulaFallenEmpire.Hediff_EmergencyEnergyRestore + (0.2, 0.8, 1.0) + false + 1.0 + false + +
  • + 600 + true +
  • +
    + +
  • + +
  • + Consciousness + 1.0 +
  • +
  • + Moving + 1.0 +
  • + + +
    + + + \ No newline at end of file diff --git a/1.6/Defs/PawnKinds/PawnKinds_Wula.xml b/1.6/Defs/PawnKinds/PawnKinds_Wula.xml index 95faad9a..5edc3128 100644 --- a/1.6/Defs/PawnKinds/PawnKinds_Wula.xml +++ b/1.6/Defs/PawnKinds/PawnKinds_Wula.xml @@ -29,7 +29,9 @@
  • Wula_Apparel_Init
  • - + +
  • WULA_EmergencyEnergyRestore
  • +
    0 0 1000~2000 @@ -71,7 +73,9 @@
  • Wula_Apparel_Init
  • - + +
  • WULA_EmergencyEnergyRestore
  • +
    0 @@ -87,7 +91,7 @@ - + Wula_AI_Heavy_Panzer_PawnKind @@ -107,12 +111,12 @@ 99999~99999 - +
  • WULA_AI_Heavy_Panzer_AT_Weapon
  • - 1 + 1
    Wula_AI_Heavy_Panzer_Gunnery_PawnKind @@ -133,14 +137,14 @@ 99999~99999 - +
  • WULA_AI_Heavy_Panzer_Gunner_Weapon
  • - 1 + 1
    - + Mech_WULA_Cat @@ -203,7 +207,7 @@
  • Wula_Constructor_Cat_Weapon
  • - +
  • Wula/Things/WULA_Constructor_Cat/WULA_Cat_Thin @@ -219,7 +223,7 @@ Mech_WULA_Cat_Assault Mech_WULA_Cat_Assault - +
  • Wula/Things/WULA_Assault_Cat/WULA_Cat_Thin @@ -238,7 +242,7 @@ Mech_WULA_Cat_Bomb Mech_WULA_Cat_Bomb - +
  • Wula/Things/WULA_bomb_Cat/WULA_Cat_Thin @@ -265,7 +269,7 @@
  • Wula_Assault_Cat_Weapon
  • - +
  • Wula/Things/WULA_Commander_Cat/WULA_Cat_Thin diff --git a/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml b/1.6/Defs/ThingDefs_Misc/Apparel/WULA_ShieldBelt.xml new file mode 100644 index 00000000..e69de29b diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml index aaa75ef4..37ce988e 100644 --- a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml +++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml @@ -1,204 +1,205 @@ - - - WULA_LightExplosiveBeam - - 乌拉帝国的轻型爆炸射线武器,每发射线都会在目标位置产生小型爆炸。适合对付轻装甲目标。 - Ultra - - Wula/Weapon/WULA_RW_Fractal_AR - Graphic_Single - 1.35 - - Interact_ChargeRifle - -
  • LongShots
  • -
  • RangedHeavy
  • - - - 15000 - 2.8 - 0.6 - 0.85 - 0.7 - 0.45 - 1.2 - - - 120 - 25 - 2 - - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 0.3 - 25 - 4 - 8 - 2 - Burn - BeamGraser_Shooting - Mote_GraserBeamBase - - - true - 1 - 1.8 - Flame - 15 - Explosion_Small - 0.6 -
  • -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Stun_Technology - - 4 - -
    - + + + WULA_LightExplosiveBeam + + 乌拉帝国的轻型爆炸射线武器,每发射线都会在目标位置产生小型爆炸。适合对付轻装甲目标。 + Ultra + + Wula/Weapon/WULA_RW_Fractal_AR + Graphic_Single + 1.35 + + Interact_ChargeRifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 15000 + 2.8 + 0.6 + 0.85 + 0.7 + 0.45 + 1.2 + + + 120 + 25 + 2 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive - - - WULA_HeavyExplosiveBeam - - 乌拉帝国的重型爆炸射线武器,每三发射线会触发一次大威力爆炸,并在爆炸区域留下燃料污渍。 - Ultra - - Wula/Weapon/WULA_RW_Fractal_AR - Graphic_Single - 1.75 - - Interact_ChargeRifle - -
  • LongShots
  • -
  • RangedHeavy
  • - - - 35000 - 4.2 - 0.45 - 0.8 - 0.65 - 0.4 - 2.1 - - - 200 - 60 - 6 - 15 - - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 0.8 - 35 - 9 - 5 - 4 - Stun - BeamGraser_Shooting - Mote_GraserBeamBase - GraserBeam_End - - - true - 3 - 3.2 - Bomb - 35 - 0.4 - Explosion_Bomb - 0.4 - Filth_Fuel - 0.25 - 2 -
  • -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Stun_Technology - - 6 - -
    -
    + + true + 0.3 + 25 + 4 + 8 + Burn - - - WULA_ToxicExplosiveBeam - - 乌拉帝国的毒气射线武器,每两发射线会触发毒气爆炸,在目标区域释放有毒气体。 - Ultra - - Wula/Weapon/WULA_RW_Fractal_AR - Graphic_Single - 1.55 - - Interact_ChargeRifle - -
  • LongShots
  • -
  • RangedHeavy
  • -
    - - 28000 - 3.6 - 0.55 - 0.85 - 0.7 - 0.5 - 1.8 - - - 150 - 40 - 4 - 25 - - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 0.6 - 28 - 6 - 7 - 2.5 - ToxGas - BeamGraser_Shooting - Mote_GraserBeamBase - - - true - 2 - 2.8 - ToxGas - 20 - Explosion_Gas - ToxGas - 0.1 -
  • -
    - - -
  • WULA_Cube_Productor_Energy
  • -
    - WULA_Synth_Weapon_2_Stun_Technology - - 5 - -
    -
    + + 1000 + -1 + 0 + 0 + 0 + + + 0 + BeamGraser_Shooting + Fleck_BeamBurn + 0.32 + Mote_GraserBeamBase + GraserBeam_End + + + 0 + 0 + 0 + + + true + + +
  • (0, 0)
  • +
  • (0.65, 0.4)
  • +
  • (1, 0.75)
  • +
    +
    + + + + true + + + + true + 1 + 1.8 + Flame + 15 + Explosion_Bomb + 0.6 + + + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 4 + +
    + + + + + WULA_HeavyExplosiveBeam + + 乌拉帝国的重型爆炸射线武器,每三发射线会触发一次大威力爆炸,并在爆炸区域留下燃料污渍。 + Ultra + + Wula/Weapon/WULA_RW_Fractal_AR + Graphic_Single + 1.75 + + Interact_ChargeRifle + +
  • LongShots
  • +
  • RangedHeavy
  • +
    + + 35000 + 4.2 + 0.45 + 0.8 + 0.65 + 0.4 + 2.1 + + + 200 + 60 + 6 + 15 + + +
  • + WulaFallenEmpire.Verb_ShootBeamExplosive + + + true + 0.8 + 35 + 9 + 5 + Stun + + + 1000 + -1 + 0 + 0 + 0 + + + 0 + BeamGraser_Shooting + Fleck_BeamBurn + 0.32 + Mote_GraserBeamBase + GraserBeam_End + + + 0 + 0 + 0 + + + true + + +
  • (0, 0)
  • +
  • (0.65, 0.4)
  • +
  • (1, 0.75)
  • + + + + + + true + + + + true + 3 + 3.2 + Bomb + 35 + 0.4 + Explosion_Bomb + 0.4 + Filth_Fuel + 0.25 + 2 + +
    + + +
  • WULA_Cube_Productor_Energy
  • +
    + WULA_Synth_Weapon_2_Stun_Technology + + 6 + +
    +
    \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/开发指南.md b/Documentation/ExplosiveBeamWeapons/开发指南.md deleted file mode 100644 index de01f3b0..00000000 --- a/Documentation/ExplosiveBeamWeapons/开发指南.md +++ /dev/null @@ -1,259 +0,0 @@ -# 爆炸射线武器开发指南 - -## 架构概述 - -爆炸射线武器系统基于RimWorld原版的射线武器系统,通过继承和扩展实现爆炸功能。 - -### 核心类结构 - -``` -Verb (RimWorld原版) -└── Verb_ShootBeam (RimWorld原版) - └── Verb_ShootBeamExplosive (自定义) - -VerbProperties (RimWorld原版) -└── VerbPropertiesExplosiveBeam (自定义) -``` - -## 代码架构 - -### 1. Verb_ShootBeamExplosive.cs - -#### 核心字段 -```csharp -private int explosionShotCounter = 0; // 爆炸计数器 -``` - -#### 关键方法 -- `TryCastShot()`: 重写射击方法,添加爆炸逻辑 -- `TriggerExplosion()`: 触发爆炸的核心方法 -- `ExposeData()`: 保存/加载数据 - -#### 工作流程 -1. 调用基类的 `TryCastShot()` -2. 如果射击成功且启用爆炸,递增计数器 -3. 当计数器达到间隔值时,触发爆炸并重置计数器 - -### 2. VerbPropertiesExplosiveBeam.cs - -#### 配置属性分类 -- **基础控制**: `enableExplosion`, `explosionShotInterval` -- **伤害属性**: `explosionRadius`, `explosionDamage`, `explosionDamageDef` -- **效果属性**: `explosionSound`, `explosionEffecter` -- **后续效果**: `postExplosionSpawn*`, `postExplosionGasType` - -## 扩展开发 - -### 添加新的爆炸类型 - -1. **在VerbPropertiesExplosiveBeam中添加新属性** -```csharp -public bool enableChainExplosion = false; -public int chainExplosionCount = 3; -public float chainExplosionDelay = 0.5f; -``` - -2. **在Verb_ShootBeamExplosive中实现逻辑** -```csharp -private void TriggerChainExplosion(VerbPropertiesExplosiveBeam props) -{ - // 实现连锁爆炸逻辑 -} -``` - -### 添加条件爆炸 - -```csharp -// 基于目标类型的条件爆炸 -private bool ShouldExplodeForTarget(Thing target) -{ - if (target is Pawn pawn) - { - return pawn.RaceProps.Humanlike; - } - return true; -} -``` - -### 添加爆炸延迟 - -```csharp -private void ScheduleDelayedExplosion(IntVec3 pos, float delay) -{ - Find.TickManager.ScheduleCallback(() => { - TriggerExplosion(explosiveProps); - }, (int)(delay * 60)); // 转换为ticks -} -``` - -## 性能优化 - -### 1. 爆炸频率控制 -- 避免每发都爆炸的设计 -- 使用合理的 `explosionShotInterval` -- 考虑武器的射速和爆炸威力平衡 - -### 2. 效果缓存 -```csharp -private static Dictionary cachedEffecters = new Dictionary(); - -private Effecter GetCachedEffecter(EffecterDef def) -{ - string key = def.defName; - if (!cachedEffecters.ContainsKey(key)) - { - cachedEffecters[key] = def.Spawn(); - } - return cachedEffecters[key]; -} -``` - -### 3. 范围检查优化 -```csharp -private bool IsValidExplosionPosition(IntVec3 pos) -{ - return pos.InBounds(caster.Map) && - pos.GetThingList(caster.Map).Any(t => t.def.category == ThingCategory.Pawn); -} -``` - -## 调试技巧 - -### 1. 日志输出 -```csharp -if (Prefs.DevMode) -{ - Log.Message($"[ExplosiveBeam] Shot {explosionShotCounter}/{explosiveProps.explosionShotInterval}"); -} -``` - -### 2. 可视化调试 -```csharp -if (DebugSettings.godMode) -{ - // 在爆炸位置显示调试信息 - MoteMaker.ThrowText(explosionCell.ToVector3(), caster.Map, - $"Explosion: {explosiveProps.explosionDamage}", Color.red); -} -``` - -### 3. 性能监控 -```csharp -private static Stopwatch explosionTimer = new Stopwatch(); - -private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) -{ - explosionTimer.Start(); - // ... 爆炸逻辑 - explosionTimer.Stop(); - - if (explosionTimer.ElapsedMilliseconds > 5) - { - Log.Warning($"Explosion took {explosionTimer.ElapsedMilliseconds}ms"); - } - explosionTimer.Reset(); -} -``` - -## 兼容性考虑 - -### 1. 模组兼容性 -- 使用命名空间避免冲突 -- 检查其他模组的Harmony补丁 -- 提供配置选项禁用功能 - -### 2. 版本兼容性 -```csharp -#if VERSION_1_4 - // 1.4版本特定代码 -#elif VERSION_1_5 - // 1.5版本特定代码 -#endif -``` - -### 3. 保存兼容性 -```csharp -public override void ExposeData() -{ - base.ExposeData(); - - // 向后兼容的数据保存 - if (Scribe.mode == LoadSaveMode.LoadingVars) - { - // 处理旧版本数据 - } - - Scribe_Values.Look(ref explosionShotCounter, "explosionShotCounter", 0); -} -``` - -## 测试框架 - -### 单元测试示例 -```csharp -[Test] -public void TestExplosionInterval() -{ - var verb = new Verb_ShootBeamExplosive(); - var props = new VerbPropertiesExplosiveBeam - { - enableExplosion = true, - explosionShotInterval = 3 - }; - - // 模拟3次射击 - for (int i = 0; i < 3; i++) - { - bool shouldExplode = (i == 2); // 第3发应该爆炸 - Assert.AreEqual(shouldExplode, verb.ShouldTriggerExplosion()); - } -} -``` - -## 最佳实践 - -### 1. 配置验证 -```csharp -public override void PostLoad() -{ - base.PostLoad(); - - if (explosionShotInterval <= 0) - { - Log.Error($"Invalid explosionShotInterval: {explosionShotInterval}"); - explosionShotInterval = 1; - } - - if (explosionRadius < 0) - { - Log.Warning($"Negative explosion radius: {explosionRadius}"); - explosionRadius = 0; - } -} -``` - -### 2. 错误处理 -```csharp -private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) -{ - try - { - // 爆炸逻辑 - } - catch (Exception e) - { - Log.Error($"Error in explosion: {e}"); - // 优雅降级,不影响基础射击功能 - } -} -``` - -### 3. 资源管理 -```csharp -public override void Destroy(DestroyMode mode = DestroyMode.Vanish) -{ - // 清理资源 - cachedEffecters.Clear(); - base.Destroy(mode); -} -``` \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/测试说明.md b/Documentation/ExplosiveBeamWeapons/测试说明.md deleted file mode 100644 index 17acf3e8..00000000 --- a/Documentation/ExplosiveBeamWeapons/测试说明.md +++ /dev/null @@ -1,157 +0,0 @@ -# 爆炸射线武器测试说明 - -## 已实现的功能 - -### 1. 核心功能 -- ✅ 继承自原版 Verb_ShootBeam 的所有功能 -- ✅ 可配置的爆炸触发间隔 -- ✅ 可配置的爆炸伤害、范围、类型 -- ✅ 可配置的音效和特效 -- ✅ 可配置的爆炸后效果(生成物品、气体等) - -### 2. 配置选项 -- `enableExplosion`: 爆炸开关 -- `explosionShotInterval`: 爆炸间隔(每x发触发一次) -- `explosionRadius`: 爆炸半径 -- `explosionDamageDef`: 爆炸伤害类型 -- `explosionDamage`: 爆炸伤害值 -- `explosionSound`: 爆炸音效 -- `chanceToStartFire`: 点燃概率 -- `postExplosionSpawnThingDef`: 爆炸后生成物品 - -### 3. 示例武器 -已创建三个示例武器: -1. **CLa-15"蓝爆"轻型**: 每发都爆炸,火焰伤害 -2. **CLa-16"蓝爆"重型**: 每3发爆炸,炸弹伤害+燃料污渍 -3. **CLa-17"蓝毒"**: 每2发爆炸,毒气伤害+毒气云 - -## 测试步骤 - -### 1. 编译测试 -```bash -dotnet build "Source\WulaFallenEmpire\WulaFallenEmpire.csproj" -``` -✅ 编译成功 - -### 2. 游戏内测试准备 -1. 启动RimWorld -2. 启用开发者模式 (Options -> Dev mode) -3. 加载包含此模组的存档或创建新游戏 -4. 按 `~` 键打开开发者控制台 - -### 3. 生成测试武器 -使用以下命令生成测试武器: -``` -Thing.Spawn WULA_RW_Fractal_AR 1 -Thing.Spawn WULA_LightExplosiveBeam 1 -Thing.Spawn WULA_HeavyExplosiveBeam 1 -Thing.Spawn WULA_ToxicExplosiveBeam 1 -``` - -### 4. 功能验证清单 - -#### 基础射线功能 -- [ ] 射线正常发射和显示 -- [ ] 射线宽度和颜色正确 -- [ ] 射线伤害正常造成 -- [ ] 音效和视觉效果正常 - -#### 爆炸功能 -- [ ] 爆炸按配置间隔触发 -- [ ] 爆炸位置在射线命中点 -- [ ] 爆炸半径和伤害正确 -- [ ] 爆炸音效正常播放 -- [ ] 爆炸视觉效果正常 - -#### 特殊效果 -- [ ] 点燃效果正常工作 -- [ ] 爆炸后生成物品(燃料污渍等) -- [ ] 毒气云正常生成和扩散 -- [ ] 护甲穿透计算正确 - -### 5. 性能测试 -- [ ] 连续射击时帧率稳定 -- [ ] 多个单位同时使用时无卡顿 -- [ ] 内存使用正常,无内存泄漏 - -### 6. 平衡性测试 -- [ ] 武器伤害与成本匹配 -- [ ] 爆炸威力不会过于强大 -- [ ] AI正确使用武器 -- [ ] 友伤风险合理 - -## 测试场景 - -### 场景1:单目标测试 -1. 生成一个敌对的人形目标 -2. 装备测试武器 -3. 射击并观察: - - 射线效果 - - 爆炸触发时机 - - 伤害数值 - - 特殊效果 - -### 场景2:群体目标测试 -1. 生成多个敌对目标(5-10个) -2. 测试爆炸范围伤害 -3. 观察连锁效果(点燃、毒气扩散等) - -### 场景3:建筑物测试 -1. 建造一些墙壁和家具 -2. 测试爆炸对建筑物的影响 -3. 验证射线穿透和爆炸破坏 - -### 场景4:友军测试 -1. 在友军附近使用武器 -2. 验证友伤机制 -3. 测试AI的使用策略 - -## 常见问题排查 - -### 问题1:爆炸不触发 -- 检查 `enableExplosion` 是否为 true -- 检查 `explosionShotInterval` 设置 -- 确认射击确实命中目标 - -### 问题2:爆炸位置错误 -- 检查射线的 `InterpolatedPosition` 计算 -- 确认目标位置在地图范围内 - -### 问题3:音效不播放 -- 检查 `explosionSound` 定义是否正确 -- 确认音效文件存在 - -### 问题4:特效不显示 -- 检查 `explosionEffecter` 定义 -- 确认特效资源文件存在 - -## 调试工具 - -### 开发者命令 -``` -# 生成特定武器 -Thing.Spawn [武器DefName] [数量] - -# 生成敌对目标 -Pawn.Spawn Raider 5 - -# 治疗所有伤害 -Heal.All - -# 清除所有火焰 -Fire.Clear -``` - -### 日志监控 -监控游戏日志文件中的错误信息: -- `Player.log` (Windows) -- 搜索 "WulaFallenEmpire" 相关错误 - -## 报告问题 - -如果发现问题,请记录: -1. 具体的复现步骤 -2. 预期行为 vs 实际行为 -3. 相关的日志错误信息 -4. 游戏版本和模组版本 -5. 其他加载的模组列表 \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/示例武器.md b/Documentation/ExplosiveBeamWeapons/示例武器.md deleted file mode 100644 index eb615367..00000000 --- a/Documentation/ExplosiveBeamWeapons/示例武器.md +++ /dev/null @@ -1,262 +0,0 @@ -# 爆炸射线武器示例 - -本文档展示了不同类型的爆炸射线武器配置示例,涵盖各种使用场景。 - -## 基础示例 - -### 1. 简单爆炸射线 -最基础的爆炸射线武器配置: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 25 - 3 - 2 - Burn - - - true - 1 - 2.0 - Bomb - 20 -
  • -
    -``` - -## 进阶示例 - -### 2. 延迟爆炸射线 -每3发触发一次大威力爆炸: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 0.8 - 30 - 9 - 5 - 3 - Stun - - - true - 3 - 3.5 - Bomb - 40 - 0.5 - Explosion_Bomb - 0.4 -
  • -
    -``` - -### 3. 火焰爆炸射线 -专注于点燃和火焰伤害: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 28 - 6 - 2.5 - Flame - - - true - 2 - 2.8 - Flame - 25 - Explosion_Fire - 0.8 - Filth_Fuel - 0.3 - 3 -
  • -
    -``` - -## 特殊效果示例 - -### 4. 毒气爆炸射线 -产生毒气云的射线武器: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 26 - 4 - 2 - ToxGas - - - true - 2 - 3.0 - ToxGas - 18 - Explosion_Gas - ToxGas - 0.1 -
  • -
    -``` - -### 5. 冰冻爆炸射线 -造成冰冻效果的射线武器: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 24 - 5 - 2.2 - Frostbite - - - true - 2 - 2.5 - Frostbite - 22 - Explosion_Ice - 0.0 - Filth_Water - 0.4 -
  • -
    -``` - -## 高级配置示例 - -### 6. 多效果爆炸射线 -结合多种效果的复杂武器: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 1.2 - 35 - 12 - 4 - 4 - Bomb - - - true - 4 - 4.0 - Bomb - 50 - 0.6 - Explosion_Bomb - - - 0.5 - Filth_Fuel - 0.3 - 4 - Mote_ExplosionFlash - 1.0 - BlindSmoke -
  • -
    -``` - -### 7. 精确爆炸射线 -高精度、低频率爆炸的狙击型武器: - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - true - 2.0 - 45 - 1 - 1 - Bullet - 0.05 - - - true - 1 - 2.2 - Bomb - 60 - 0.8 - Explosion_Sharp - false -
  • -
    -``` - -## 平衡性考虑 - -### 轻型武器平衡 -- 爆炸半径:1.5-2.5 -- 爆炸伤害:15-25 -- 射击间隔:1-2发 -- 成本:低-中等 - -### 中型武器平衡 -- 爆炸半径:2.5-3.5 -- 爆炸伤害:25-40 -- 射击间隔:2-3发 -- 成本:中等-高 - -### 重型武器平衡 -- 爆炸半径:3.5-5.0 -- 爆炸伤害:40-70 -- 射击间隔:3-5发 -- 成本:高-极高 - -## 使用建议 - -### 1. 近战防御武器 -```xml - -15 -1 -3.0 -``` - -### 2. 中距离支援武器 -```xml - -28 -2 -2.5 -``` - -### 3. 远程狙击武器 -```xml - -40 -1 -2.0 -50 -``` - -### 4. 区域控制武器 -```xml - -4.0 -BlindSmoke -0.6 -``` \ No newline at end of file diff --git a/Documentation/ExplosiveBeamWeapons/配置说明.md b/Documentation/ExplosiveBeamWeapons/配置说明.md deleted file mode 100644 index b606c587..00000000 --- a/Documentation/ExplosiveBeamWeapons/配置说明.md +++ /dev/null @@ -1,116 +0,0 @@ -# 爆炸射线武器配置说明 - -## 概述 -新的 `Verb_ShootBeamExplosive` 类扩展了原版的 `Verb_ShootBeam`,添加了可配置的爆炸效果。 - -## 配置属性 - -### 基础爆炸控制 -- `enableExplosion` (bool): 是否启用爆炸效果,默认 false -- `explosionShotInterval` (int): 每x发射击触发一次爆炸,默认 1 - -### 爆炸伤害属性 -- `explosionRadius` (float): 爆炸半径,默认 2.9 -- `explosionDamageDef` (DamageDef): 爆炸伤害类型,null时使用 Bomb -- `explosionDamage` (int): 爆炸伤害值,-1时使用武器默认伤害 -- `explosionArmorPenetration` (float): 爆炸护甲穿透,-1时使用武器默认值 - -### 音效和特效 -- `explosionSound` (SoundDef): 爆炸音效 -- `explosionEffecter` (EffecterDef): 爆炸特效 - -### 爆炸后效果 -- `postExplosionSpawnThingDef` (ThingDef): 爆炸后生成的物品 -- `postExplosionSpawnChance` (float): 生成概率 (0-1) -- `postExplosionSpawnThingCount` (int): 生成数量 - -### 爆炸前效果 -- `preExplosionSpawnThingDef` (ThingDef): 爆炸前生成的物品 -- `preExplosionSpawnChance` (float): 生成概率 (0-1) -- `preExplosionSpawnThingCount` (int): 生成数量 - -### 其他属性 -- `postExplosionGasType` (GasType?): 爆炸后的气体类型 -- `applyDamageToExplosionCellsNeighbors` (bool): 是否对邻近格子造成伤害 -- `chanceToStartFire` (float): 点燃概率 (0-1) -- `damageFalloff` (bool): 是否有伤害衰减 - -## 使用示例 - -```xml - -
  • - WulaFallenEmpire.Verb_ShootBeamExplosive - - - true - 0.5 - 30 - 6 - 3 - Stun - - - true - 3 - 2.5 - Bomb - 25 - Explosion_Bomb - 0.3 - Filth_Fuel - 0.15 -
  • -
    -``` - -## 工作原理 - -1. 武器正常进行射线攻击 -2. 每次成功射击后,计数器递增 -3. 当计数器达到 `explosionShotInterval` 时: - - 在当前射线位置触发爆炸 - - 播放爆炸音效和特效 - - 重置计数器 -4. 爆炸使用配置的参数进行伤害计算 - -## 注意事项 - -- 爆炸位置基于射线的插值位置 -- 如果爆炸位置超出地图边界,爆炸不会触发 -- 音效和特效是可选的,可以设置为 null -- 伤害值为 -1 时会尝试使用武器的默认伤害 -- 这个功能完全向后兼容,不启用爆炸时行为与原版相同 - -## 配置模板 - -### 轻型爆炸武器 -```xml -true -1 -1.8 -Flame -15 -0.6 -``` - -### 重型爆炸武器 -```xml -true -3 -3.2 -Bomb -35 -0.4 -Filth_Fuel -0.25 -``` - -### 毒气武器 -```xml -true -2 -2.8 -ToxGas -ToxGas -``` \ No newline at end of file diff --git a/Documentation/README.md b/Documentation/README.md deleted file mode 100644 index b2215cde..00000000 --- a/Documentation/README.md +++ /dev/null @@ -1,30 +0,0 @@ -# 乌拉帝国模组文档 - -本文件夹包含乌拉帝国模组的所有技术文档和说明。 - -## 文档结构 - -### 📁 ExplosiveBeamWeapons/ -爆炸射线武器系统的相关文档 -- 配置说明 -- 测试指南 -- 使用示例 - -### 📁 Features/ -各种功能特性的文档(未来扩展) - -### 📁 API/ -API文档和开发者指南(未来扩展) - -## 快速导航 - -### 爆炸射线武器系统 -- [📋 配置说明](ExplosiveBeamWeapons/配置说明.md) - 详细的配置参数说明 -- [🧪 测试指南](ExplosiveBeamWeapons/测试说明.md) - 测试步骤和验证清单 -- [👨‍💻 开发指南](ExplosiveBeamWeapons/开发指南.md) - 代码架构和扩展开发 -- [⚔️ 示例武器](ExplosiveBeamWeapons/示例武器.md) - 各种类型的武器配置示例 - -## 版本历史 - -- v1.0: 初始版本,包含基础乌拉帝国内容 -- v1.1: 添加爆炸射线武器系统 \ No newline at end of file diff --git a/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs new file mode 100644 index 00000000..0832f9dc --- /dev/null +++ b/Source/WulaFallenEmpire/CompAbilityEffect_EmergencyEnergyRestore.cs @@ -0,0 +1,64 @@ +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompAbilityEffect_EmergencyEnergyRestore : CompAbilityEffect + { + public new CompProperties_AbilityEmergencyEnergyRestore Props => (CompProperties_AbilityEmergencyEnergyRestore)props; + + public override void Apply(LocalTargetInfo target, LocalTargetInfo dest) + { + base.Apply(target, dest); + + Pawn caster = parent.pawn; + if (caster == null) return; + + // 检查是否是乌拉族 + if (!IsWulaRace(caster)) + { + Messages.Message("只有乌拉族才能使用紧急能量恢复", MessageTypeDefOf.RejectInput, false); + return; + } + + // 检查是否倒地(如果需要的话) + if (Props.requireDowned && !caster.Downed) + { + Messages.Message("只能在倒地时使用紧急能量恢复", MessageTypeDefOf.RejectInput, false); + return; + } + + // 添加Hediff + if (Props.hediffDef != null) + { + var hediff = HediffMaker.MakeHediff(Props.hediffDef, caster); + caster.health.AddHediff(hediff); + + Messages.Message($"{caster.LabelShort}激活了紧急能量恢复协议", MessageTypeDefOf.PositiveEvent, false); + + if (Prefs.DevMode) + { + Log.Message($"[EmergencyEnergyRestore] Applied to {caster.LabelShort}"); + } + } + } + + public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest) + { + bool canApply = base.CanApplyOn(target, dest) && IsWulaRace(parent.pawn); + + if (Props.requireDowned) + { + canApply = canApply && parent.pawn.Downed; + } + + return canApply; + } + + private bool IsWulaRace(Pawn pawn) + { + if (pawn?.def == null) return false; + return pawn.def.defName == "WulaSpecies"; + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs new file mode 100644 index 00000000..d796e9b4 --- /dev/null +++ b/Source/WulaFallenEmpire/CompProperties_AbilityEmergencyEnergyRestore.cs @@ -0,0 +1,17 @@ +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + public class CompProperties_AbilityEmergencyEnergyRestore : CompProperties_AbilityEffect + { + public int durationTicks = 600; // 默认10秒 + public HediffDef hediffDef; + public bool requireDowned = true; // 是否需要倒地才能使用 + + public CompProperties_AbilityEmergencyEnergyRestore() + { + compClass = typeof(CompAbilityEffect_EmergencyEnergyRestore); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs new file mode 100644 index 00000000..e24bf57b --- /dev/null +++ b/Source/WulaFallenEmpire/Hediff_EmergencyEnergyRestore.cs @@ -0,0 +1,71 @@ +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + public class Hediff_EmergencyEnergyRestore : HediffWithComps + { + private float originalEnergyLevel = 0f; + private bool hasStoredOriginalLevel = false; + + public override void PostAdd(DamageInfo? dinfo) + { + base.PostAdd(dinfo); + + // 存储原始能量水平 + var energyNeed = pawn.needs?.TryGetNeed(); + if (energyNeed != null) + { + originalEnergyLevel = energyNeed.CurLevel; + hasStoredOriginalLevel = true; + + // 立即将能量设置为100% + energyNeed.CurLevel = 1.0f; + + if (Prefs.DevMode) + { + Log.Message($"[EmergencyEnergyRestore] Stored original energy: {originalEnergyLevel:F2}, set to 1.0"); + } + } + } + + public override void PostRemoved() + { + base.PostRemoved(); + + // 恢复原始能量水平 + if (hasStoredOriginalLevel) + { + var energyNeed = pawn.needs?.TryGetNeed(); + if (energyNeed != null) + { + energyNeed.CurLevel = originalEnergyLevel; + + if (Prefs.DevMode) + { + Log.Message($"[EmergencyEnergyRestore] Restored energy to: {originalEnergyLevel:F2}"); + } + } + } + } + + public override void Tick() + { + base.Tick(); + + // 确保能量保持在100% + var energyNeed = pawn.needs?.TryGetNeed(); + if (energyNeed != null && energyNeed.CurLevel < 1.0f) + { + energyNeed.CurLevel = 1.0f; + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref originalEnergyLevel, "originalEnergyLevel", 0f); + Scribe_Values.Look(ref hasStoredOriginalLevel, "hasStoredOriginalLevel", false); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 24865da7..6de951e6 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -77,6 +77,9 @@ + + +