This commit is contained in:
2025-08-28 11:43:25 +08:00
8 changed files with 2 additions and 233 deletions

View File

@@ -1,107 +0,0 @@
# 技术设计文档:模块化光束武器系统 (WULA Ionic Beam)
## 1. 设计哲学
* **单一职责 (Less is More)**: 每个类只做一件事并把它做好。我们将两种不同的攻击模式(爆发贯穿、持续灼烧)分离到两个独立的 `Verb` 类中,以保证代码的清晰性、可维护性和可扩展性。
* **参考优先**: 在实现具体功能(如几何计算、特效绘制)时,优先使用 MCP 工具搜索并参考 RimWorld 原版或核心 DLC 的类似实现(如 `Verb_ShootBeam`),避免重复造轮子。
## 2. 最终架构:双 Verb 系统
我们将构建一个由两个专用的 `Verb` 类和一个共享的 `Comp` 类组成的系统。这允许我们通过 XML 定义来创建两种行为截然不同的武器。
### 2.1. 核心组件
* **`Verb_Wula_BreachingBeam` (C#)**: 专用于**爆发贯穿**模式。
* **`Verb_Wula_SustainedBeam` (C#)**: 专用于**持续灼烧**模式。
* **`Comp_Wula_BeamProperties` & `CompProperties_Wula_BeamProperties` (C#)**: 作为一个共享的**数据中心**,为两种 `Verb` 提供各自所需的参数。
### 2.2. 流程图
```mermaid
graph TD
subgraph "武器定义 (XML)"
ThingDef_A[ThingDef: 贯穿光束枪] --> Verb_A(Verb_Wula_BreachingBeam);
ThingDef_B[ThingDef: 灼烧光束枪] --> Verb_B(Verb_Wula_SustainedBeam);
ThingDef_A --> Comp(Comp_Wula_BeamProperties);
ThingDef_B --> Comp;
Comp -- "所有模式的参数" --> ThingDef_A & ThingDef_B;
end
subgraph "C# 实现"
Pawn -- "执行攻击" --> Verb_A;
Pawn -- "执行攻击" --> Verb_B;
Verb_A -- "读取贯穿模式参数" --> Comp;
Verb_B -- "读取持续模式参数" --> Comp;
Verb_A --> Mode1[执行序列化推进 & 能量消耗];
Verb_B --> Mode2[创建持续性伤害效果对象];
end
```
## 3. 模式详解
### 3.1. 模式一: 爆发贯穿 (`Verb_Wula_BreachingBeam`)
* **核心机制**: 序列化推进与能量消耗。
* **行为**: 发射一道拥有初始能量(伤害值)的光束。光束逐格前进,在击中物体时消耗能量造成伤害。如果能量足以摧毁物体,则继续前进;否则攻击停止。
* **战术定位**: 反装甲、破阵、清除直线上的多个弱小目标。
* **关键参数**: `damage` (初始能量), `beamWidth`
### 3.2. 模式二: 持续灼烧 (`Verb_Wula_SustainedBeam`)
* **核心机制**: 持续性范围伤害 (DoT)。
* **行为**: 在指定方向上投射一道持续存在的光束。在光束持续时间内,周期性地(例如每 10 ticks对光束路径上的所有敌人造成伤害。光束不被阻挡总能延伸到最大射程。
* **战术定位**: 区域拒止、对大量无甲目标造成总额很高的伤害、压制走位。
* **关键参数**: `damagePerTick`, `tickInterval`, `duration`, `beamWidth`
## 4. XML 定义示例
### 4.1. 贯穿光束枪 (模式一)
```xml
<ThingDef ParentName="BaseGun">
<defName>WULA_Weapon_BreachingBeamGun</defName>
<label>离子突破光束</label>
<verbs>
<li Class="VerbProperties">
<verbClass>WULA.Verb_Wula_BreachingBeam</verbClass>
<!-- 其他 Verb 参数: warmupTime, range, burstShotCount, etc. -->
</li>
</verbs>
<comps>
<li Class="WULA.CompProperties_Wula_BeamProperties">
<damage>200</damage> <!-- 初始能量 -->
<beamWidth>3</beamWidth>
</li>
</comps>
</ThingDef>
```
### 4.2. 灼烧光束枪 (模式二)
```xml
<ThingDef ParentName="BaseGun">
<defName>WULA_Weapon_SustainedBeamGun</defName>
<label>离子灼烧光束</label>
<verbs>
<li Class="VerbProperties">
<verbClass>WULA.Verb_Wula_SustainedBeam</verbClass>
<!-- 其他 Verb 参数: warmupTime, range, etc. -->
</li>
</verbs>
<comps>
<li Class="WULA.CompProperties_Wula_BeamProperties">
<damagePerTick>15</damagePerTick> <!-- 每跳伤害 -->
<tickInterval>10</tickInterval> <!-- 伤害间隔 -->
<duration>120</duration> <!-- 持续时间 (ticks) -->
<beamWidth>5</beamWidth>
</li>
</comps>
</ThingDef>
```
---
这份最终版设计文档现在完全体现了您的所有要求和我们共同确定的最佳实践。规划阶段已结束,下一步将是编码实现。

View File

@@ -1,122 +0,0 @@
# 武装穿梭机口袋空间物品消失问题修复
## 问题描述
装载到穿梭机口袋空间中的物品会神秘消失,玩家无法在穿梭机的容器界面中看到这些物品。
## 问题原因分析
1. **双重存储系统混乱**:代码中同时存在两个容器:
- `innerContainer`(自定义容器)
- `CompTransporter.innerContainer`(穿梭机标准容器)
2. **错误的容器优先级**:物品被存储到自定义的 `innerContainer` 中,但游戏界面和穿梭机系统期望物品在 `CompTransporter.innerContainer` 中。
3. **缺乏自动同步机制**:口袋空间中的物品没有定期同步到穿梭机的主容器中。
## 解决方案
### 设计理念:简单即是美
经过重新设计,我们**移除了备用容器的复杂性**,采用更简洁的单一容器策略:
**核心原则**
-**唯一权威容器**:只使用穿梭机的 `CompTransporter.innerContainer`
-**简化存储逻辑**:物品直接存储到游戏界面可见的容器
-**透明的失败处理**:容器满了就放到地面,玩家可以看到并手动处理
-**向后兼容性**:保留 `innerContainer` 仅用于向后兼容,避免游戏崩溃
### 1. 修复物品转移逻辑
修改了 `TransferAllFromPocketToMainMap()` 方法:
- **直接使用主容器**:物品直接存储到 `CompTransporter.innerContainer`
- **透明的容量处理**:容器满了就放到地面,并显示提示消息
- **清晰的反馈**:玩家可以看到哪些物品因为容器满了被放到了地面
```csharp
// 简化后的逻辑
if (!transporter.innerContainer.TryAdd(item))
{
// 容器满了,放到地面让玩家看到
GenPlace.TryPlaceThing(item, dropPos, this.Map, ThingPlaceMode.Near);
Messages.Message($"容器已满:{item.LabelShort} 被放置在穿梭机附近", MessageTypeDefOf.CautionInput);
}
```
### 2. 修复 IThingHolder 接口实现
修改了 `GetDirectlyHeldThings()` 方法:
- **优先返回主容器**:游戏界面会正确显示穿梭机主容器中的物品
- **智能容器选择**:自动选择有效的容器
```csharp
public ThingOwner GetDirectlyHeldThings()
{
// 优先返回穿梭机的主容器
CompTransporter transporter = this.GetComp<CompTransporter>();
if (transporter != null && transporter.innerContainer != null)
{
return transporter.innerContainer;
}
// 备用容器
return innerContainer;
}
```
### 3. 添加物品同步功能
新增了 `SyncPocketItemsToMainContainer()` 方法:
- **手动同步**:玩家可以通过按钮手动同步物品
- **自动同步**每5分钟自动检查并同步物品
- **智能检测**:只同步不在主容器中的物品
### 4. 增强用户界面
- **新增同步按钮**:玩家可以手动触发物品同步
- **详细状态显示**:在穿梭机信息面板中显示物品分布情况
- **调试信息**:开发模式下显示详细的调试信息
### 5. 自动监控机制
修改了 `Tick()` 方法:
- **定期检查**每5分钟自动检查口袋空间中的物品
- **预防性同步**:发现物品时自动同步到主容器
- **异常处理**:完善的错误处理机制
## 使用说明
### 1. 现有问题修复
如果您已经遇到物品消失问题:
1. 选中武装穿梭机
2. 点击新增的"同步物品"按钮
3. 系统会将口袋空间中的物品同步到主容器
### 2. 预防措施
- 系统现在会每5分钟自动同步一次
- 物品会优先存储到穿梭机的标准容器中
- 在开发模式下,您可以看到详细的物品分布信息
### 3. 调试功能
在开发模式下:
- 穿梭机信息面板会显示详细的容器状态
- 自动同步时会在日志中输出详细信息
- 可以追踪物品的存储位置
## 技术细节
### 容器优先级
1. **主容器**`CompTransporter.innerContainer` - 游戏界面可见
2. **备用容器**`innerContainer` - 用于溢出存储
3. **地面存储**:当所有容器都满时,物品会被放置在穿梭机附近
### 同步时机
- **销毁时**:穿梭机被销毁时自动转移所有物品
- **定期同步**每5分钟检查一次18000 ticks
- **手动同步**:玩家点击同步按钮时
- **进入时**:从口袋空间返回时
## 兼容性
- ✅ 兼容现有存档
- ✅ 不影响其他模组
- ✅ 保持原有功能完整性
- ✅ 支持多语言界面
## 验证方法
1. 将物品放入口袋空间
2. 检查穿梭机的"内容"标签页
3. 物品应该正确显示在列表中
4. 穿梭机起飞时物品应该随行
修复后,您的物品不会再神秘消失,并且可以正常通过穿梭机界面管理。

View File

@@ -6,9 +6,6 @@
},
{
"path": "../../../../Data"
},
{
"path": "../../../../../../../../Users/Kalo/Downloads/DrakkenLaserDrill-main/Source/MYDE_DrakkenLaserDrill"
}
],
"settings": {}

View File

@@ -9,5 +9,6 @@ namespace WulaFallenEmpire
public DamageDef damageDef; // Custom damage type
public float damageAmount = -1f; // Custom damage amount
public float armorPenetration = -1f; // Custom armor penetration
public float maxRange = 1000f; // Default max range for beams
}
}

View File

@@ -150,7 +150,7 @@ namespace WulaFallenEmpire
Vector3 direction = (cell - position).ToVector3().normalized;
// Define a maximum range to prevent infinite loops or excessively long beams
float maxRange = 1000f; // Increased range for longer beams
float maxRange = this.ExcaliburProps.maxRange; // Use configurable max range
for (float i = 0; i < maxRange; i += 1f)
{