Files
WulaFallenEmpireRW/Documentation/ExplosiveBeamWeapons/开发指南.md

259 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 爆炸射线武器开发指南
## 架构概述
爆炸射线武器系统基于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<string, Effecter> cachedEffecters = new Dictionary<string, Effecter>();
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);
}
```