diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 83d99d55..372405ab 100644 Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/Assemblies/WulaFallenEmpire.pdb b/1.6/Assemblies/WulaFallenEmpire.pdb index 071f63bb..bfb305f9 100644 Binary files a/1.6/Assemblies/WulaFallenEmpire.pdb and b/1.6/Assemblies/WulaFallenEmpire.pdb differ diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml new file mode 100644 index 00000000..aaa75ef4 --- /dev/null +++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_ExplosiveBeamWeapons.xml @@ -0,0 +1,204 @@ + + + + + + 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_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 + +
    +
    + + + + 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 + +
    +
    + +
    \ No newline at end of file diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml index e283cf9d..80fe6956 100644 --- a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml +++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_Weapon.xml @@ -1,4 +1,4 @@ - + diff --git a/Documentation/ExplosiveBeamWeapons/开发指南.md b/Documentation/ExplosiveBeamWeapons/开发指南.md new file mode 100644 index 00000000..de01f3b0 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/开发指南.md @@ -0,0 +1,259 @@ +# 爆炸射线武器开发指南 + +## 架构概述 + +爆炸射线武器系统基于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 new file mode 100644 index 00000000..17acf3e8 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/测试说明.md @@ -0,0 +1,157 @@ +# 爆炸射线武器测试说明 + +## 已实现的功能 + +### 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 new file mode 100644 index 00000000..eb615367 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/示例武器.md @@ -0,0 +1,262 @@ +# 爆炸射线武器示例 + +本文档展示了不同类型的爆炸射线武器配置示例,涵盖各种使用场景。 + +## 基础示例 + +### 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 new file mode 100644 index 00000000..b606c587 --- /dev/null +++ b/Documentation/ExplosiveBeamWeapons/配置说明.md @@ -0,0 +1,116 @@ +# 爆炸射线武器配置说明 + +## 概述 +新的 `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 new file mode 100644 index 00000000..b2215cde --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,30 @@ +# 乌拉帝国模组文档 + +本文件夹包含乌拉帝国模组的所有技术文档和说明。 + +## 文档结构 + +### 📁 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/VerbPropertiesExplosiveBeam.cs b/Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs new file mode 100644 index 00000000..cd033e97 --- /dev/null +++ b/Source/WulaFallenEmpire/VerbPropertiesExplosiveBeam.cs @@ -0,0 +1,49 @@ +using RimWorld; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class VerbPropertiesExplosiveBeam : VerbProperties + { + // 爆炸开关 + public bool enableExplosion = false; + + // 每x个shotcount触发一次爆炸 + public int explosionShotInterval = 1; + + // 爆炸基础属性 + public float explosionRadius = 2.9f; + public DamageDef explosionDamageDef = null; // null时使用默认的Bomb + public int explosionDamage = -1; // -1时使用武器默认伤害 + public float explosionArmorPenetration = -1f; // -1时使用武器默认穿甲 + + // 爆炸音效和特效 + public SoundDef explosionSound = null; + public EffecterDef explosionEffecter = null; + + // 爆炸后生成物品 + public ThingDef postExplosionSpawnThingDef = null; + public float postExplosionSpawnChance = 0f; + public int postExplosionSpawnThingCount = 1; + + // 爆炸前生成物品 + public ThingDef preExplosionSpawnThingDef = null; + public float preExplosionSpawnChance = 0f; + public int preExplosionSpawnThingCount = 1; + + // 气体效果 + public GasType? postExplosionGasType = null; + + // 其他爆炸属性 + public bool applyDamageToExplosionCellsNeighbors = true; + public float chanceToStartFire = 0f; + public bool damageFalloff = true; + + public VerbPropertiesExplosiveBeam() + { + // 设置默认值 + verbClass = typeof(Verb_ShootBeamExplosive); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs b/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs new file mode 100644 index 00000000..a10a9812 --- /dev/null +++ b/Source/WulaFallenEmpire/Verb_ShootBeamExplosive.cs @@ -0,0 +1,92 @@ +using System.Collections.Generic; +using RimWorld; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace WulaFallenEmpire +{ + public class Verb_ShootBeamExplosive : Verse.Verb_ShootBeam + { + private int explosionShotCounter = 0; + + protected override bool TryCastShot() + { + bool result = base.TryCastShot(); + + if (result && verbProps is VerbPropertiesExplosiveBeam explosiveProps && explosiveProps.enableExplosion) + { + explosionShotCounter++; + + if (explosionShotCounter >= explosiveProps.explosionShotInterval) + { + explosionShotCounter = 0; + TriggerExplosion(explosiveProps); + } + } + + return result; + } + + private void TriggerExplosion(VerbPropertiesExplosiveBeam explosiveProps) + { + Vector3 explosionPos = InterpolatedPosition; + IntVec3 explosionCell = explosionPos.ToIntVec3(); + + if (!explosionCell.InBounds(caster.Map)) + return; + + // 播放爆炸音效 + if (explosiveProps.explosionSound != null) + { + explosiveProps.explosionSound.PlayOneShot(new TargetInfo(explosionCell, caster.Map)); + } + + // 生成爆炸 + GenExplosion.DoExplosion( + center: explosionCell, + map: caster.Map, + radius: explosiveProps.explosionRadius, + damType: explosiveProps.explosionDamageDef ?? DamageDefOf.Bomb, + instigator: caster, + damAmount: explosiveProps.explosionDamage > 0 ? explosiveProps.explosionDamage : verbProps.defaultProjectile?.projectile?.GetDamageAmount(EquipmentSource) ?? 20, + armorPenetration: explosiveProps.explosionArmorPenetration >= 0 ? explosiveProps.explosionArmorPenetration : verbProps.defaultProjectile?.projectile?.GetArmorPenetration(EquipmentSource) ?? 0.3f, + explosionSound: null, // 我们已经手动播放了音效 + weapon: base.EquipmentSource?.def, + projectile: null, + intendedTarget: currentTarget.Thing, + postExplosionSpawnThingDef: explosiveProps.postExplosionSpawnThingDef, + postExplosionSpawnChance: explosiveProps.postExplosionSpawnChance, + postExplosionSpawnThingCount: explosiveProps.postExplosionSpawnThingCount, + postExplosionGasType: explosiveProps.postExplosionGasType, + applyDamageToExplosionCellsNeighbors: explosiveProps.applyDamageToExplosionCellsNeighbors, + preExplosionSpawnThingDef: explosiveProps.preExplosionSpawnThingDef, + preExplosionSpawnChance: explosiveProps.preExplosionSpawnChance, + preExplosionSpawnThingCount: explosiveProps.preExplosionSpawnThingCount, + chanceToStartFire: explosiveProps.chanceToStartFire, + damageFalloff: explosiveProps.damageFalloff, + direction: null, + ignoredThings: null, + affectedAngle: null, + doVisualEffects: true, + propagationSpeed: 0.6f, + excludeRadius: 0f, + doSoundEffects: false // 我们手动处理音效 + ); + + // 生成额外的视觉效果 + if (explosiveProps.explosionEffecter != null) + { + Effecter effecter = explosiveProps.explosionEffecter.Spawn(explosionCell, caster.Map); + effecter.Trigger(new TargetInfo(explosionCell, caster.Map), TargetInfo.Invalid); + effecter.Cleanup(); + } + } + + public override void ExposeData() + { + base.ExposeData(); + Scribe_Values.Look(ref explosionShotCounter, "explosionShotCounter", 0); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 7173a617..24865da7 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -75,6 +75,8 @@ + +