342 lines
12 KiB
Markdown
342 lines
12 KiB
Markdown
# 随机事件系统
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
|
||
- [GameEvent.ts](file://assets/script/game/common/config/GameEvent.ts)
|
||
- [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts)
|
||
- [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts)
|
||
</cite>
|
||
|
||
## 目录
|
||
1. [概述](#概述)
|
||
2. [项目结构](#项目结构)
|
||
3. [核心组件](#核心组件)
|
||
4. [架构概览](#架构概览)
|
||
5. [详细组件分析](#详细组件分析)
|
||
6. [依赖关系分析](#依赖关系分析)
|
||
7. [性能考虑](#性能考虑)
|
||
8. [故障排除指南](#故障排除指南)
|
||
9. [结论](#结论)
|
||
|
||
## 概述
|
||
|
||
随机事件系统是肉鸽模式(Roguelike)游戏的核心机制之一,它为玩家提供了不可预测的游戏体验。本文档详细分析了RogueConfig.ts中实现的随机事件机制,包括事件类型定义、概率配置、触发逻辑以及与游戏流程的集成方式。
|
||
|
||
该系统通过EventType枚举定义了四种基本事件类型:宝箱事件(Treasure)、陷阱事件(Trap)、增益事件(Buff)和减益事件(Debuff),并通过EventConfig配置对象实现了灵活的概率控制和效果描述。
|
||
|
||
## 项目结构
|
||
|
||
随机事件系统的核心文件位于游戏的地图模块中,主要包含以下关键组件:
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "随机事件系统架构"
|
||
RogueConfig["RogueConfig.ts<br/>核心配置与算法"]
|
||
MissionMonComp["MissionMonComp.ts<br/>事件处理控制器"]
|
||
GameEvent["GameEvent.ts<br/>事件通信系统"]
|
||
HeroAttrs["HeroAttrs.ts<br/>属性系统"]
|
||
end
|
||
subgraph "UI反馈系统"
|
||
GameUIConfig["GameUIConfig.ts<br/>界面配置"]
|
||
MessageSystem["消息系统"]
|
||
end
|
||
RogueConfig --> MissionMonComp
|
||
MissionMonComp --> GameEvent
|
||
MissionMonComp --> HeroAttrs
|
||
GameEvent --> MessageSystem
|
||
MessageSystem --> GameUIConfig
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L30)
|
||
|
||
## 核心组件
|
||
|
||
### EventType枚举定义
|
||
|
||
系统定义了四种基本的随机事件类型,每种类型都有明确的业务含义:
|
||
|
||
| 事件类型 | 描述 | 业务含义 |
|
||
|---------|------|----------|
|
||
| TREASURE | 宝箱事件 | 提供额外奖励,增加玩家收益 |
|
||
| TRAP | 陷阱事件 | 造成伤害,增加游戏风险 |
|
||
| BUFF | 增益事件 | 提供临时能力提升,改善玩家状态 |
|
||
| DEBUFF | 减益事件 | 降低玩家能力,增加挑战难度 |
|
||
|
||
### EventConfig配置对象
|
||
|
||
每个事件类型都通过EventConfig对象进行详细配置,包含触发概率和效果描述:
|
||
|
||
| 配置项 | 宝箱事件 | 陷阱事件 | 增益事件 | 减益事件 |
|
||
|--------|----------|----------|----------|----------|
|
||
| 触发概率 | 30% | 25% | 25% | 20% |
|
||
| 效果描述 | 获得额外奖励 | 受到一定伤害 | 获得临时增益效果 | 受到临时减益效果 |
|
||
|
||
### StageType事件关卡
|
||
|
||
事件关卡(StageType.EVENT)作为特殊的关卡类型,具有独特的触发条件和游戏流程融合方式。
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L40-L85)
|
||
|
||
## 架构概览
|
||
|
||
随机事件系统采用分层架构设计,确保了良好的模块化和可扩展性:
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant Player as "玩家"
|
||
participant MissionComp as "MissionMonComp"
|
||
participant RogueConfig as "RogueConfig"
|
||
participant GameEvent as "GameEvent系统"
|
||
participant UI as "UI反馈"
|
||
Player->>MissionComp : 进入关卡
|
||
MissionComp->>RogueConfig : getStageType()
|
||
RogueConfig-->>MissionComp : 返回关卡类型
|
||
MissionComp->>RogueConfig : getRandomEvent()
|
||
RogueConfig-->>MissionComp : 返回事件类型
|
||
MissionComp->>MissionComp : processRandomEvent()
|
||
MissionComp->>GameEvent : 触发事件
|
||
GameEvent->>UI : 显示事件效果
|
||
Note over Player,UI : 随机事件处理流程
|
||
```
|
||
|
||
**图表来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||
|
||
## 详细组件分析
|
||
|
||
### getRandomEvent函数实现
|
||
|
||
getRandomEvent函数是随机事件系统的核心算法,基于累积概率算法实现加权随机选择:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始随机事件选择]) --> InitRandom["生成随机数<br/>random = Math.random()"]
|
||
InitRandom --> ResetCumulative["重置累积概率<br/>cumulativeProbability = 0"]
|
||
ResetCumulative --> LoopEvents["遍历EventConfig中的事件类型"]
|
||
LoopEvents --> AddProbability["累积概率<br/>cumulativeProbability += probability"]
|
||
AddProbability --> CheckCondition{"random <= cumulativeProbability?"}
|
||
CheckCondition --> |是| ReturnEvent["返回事件类型"]
|
||
CheckCondition --> |否| NextEvent["检查下一个事件"]
|
||
NextEvent --> LoopEvents
|
||
ReturnEvent --> End([结束])
|
||
style Start fill:#e1f5fe
|
||
style End fill:#e8f5e8
|
||
style ReturnEvent fill:#fff3e0
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||
|
||
该算法的关键特性:
|
||
- **累积概率计算**:通过逐步累加各事件的概率,实现加权随机选择
|
||
- **边界条件处理**:确保所有事件都有被选中的机会
|
||
- **性能优化**:O(n)时间复杂度,其中n为事件类型数量
|
||
|
||
### getStageType关卡类型判断
|
||
|
||
关卡类型判断逻辑实现了复杂的触发条件:
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
Start([开始关卡类型判断]) --> CheckStageNumber{"stageNumber % 5 == 0?"}
|
||
CheckStageNumber --> |是| CheckLevel{"level == 3?"}
|
||
CheckLevel --> |是| ReturnEvent["返回EVENT类型"]
|
||
CheckLevel --> |否| ContinueCheck["继续检查"]
|
||
CheckStageNumber --> |否| CheckTen{"stageNumber % 10 == 0?"}
|
||
CheckTen --> |是| CheckTenLevel{"level == 5?"}
|
||
CheckTenLevel --> |是| ReturnBoss["返回BOSS类型"]
|
||
CheckTenLevel --> |否| CheckFour{"level == 4?"}
|
||
CheckFour --> |是| ReturnElite["返回ELITE类型"]
|
||
CheckFour --> |否| ReturnNormal["返回NORMAL类型"]
|
||
CheckTen --> |否| CheckOneToNine{"1 <= stageNumber <= 9?"}
|
||
CheckOneToNine --> |是| CheckFive{"level == 5?"}
|
||
CheckFive --> |是| ReturnElite2["返回ELITE类型"]
|
||
CheckFive --> |否| ReturnNormal2["返回NORMAL类型"]
|
||
ContinueCheck --> CheckTen
|
||
ReturnEvent --> End([结束])
|
||
ReturnBoss --> End
|
||
ReturnElite --> End
|
||
ReturnNormal --> End
|
||
ReturnElite2 --> End
|
||
ReturnNormal2 --> End
|
||
style Start fill:#e1f5fe
|
||
style End fill:#e8f5e8
|
||
style ReturnEvent fill:#fff3e0
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L140-L170)
|
||
|
||
### 事件处理流程
|
||
|
||
事件处理通过MissionMonComp组件实现,包含完整的生命周期管理:
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class MissionMonComp {
|
||
-currentEvent : EventType | null
|
||
-eventProcessed : boolean
|
||
+do_mon_wave() : void
|
||
+processRandomEvent() : void
|
||
-generateMonstersFromStageConfig() : void
|
||
-addToStageSpawnQueue() : void
|
||
}
|
||
class EventType {
|
||
<<enumeration>>
|
||
TREASURE
|
||
TRAP
|
||
BUFF
|
||
DEBUFF
|
||
}
|
||
class RogueConfig {
|
||
+getRandomEvent() : EventType | null
|
||
+getStageType() : StageType
|
||
+calculateMonsterCount() : number
|
||
+calculateMonsterStrengthMultiplier() : number
|
||
}
|
||
MissionMonComp --> EventType : "使用"
|
||
MissionMonComp --> RogueConfig : "调用"
|
||
RogueConfig --> EventType : "返回"
|
||
```
|
||
|
||
**图表来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L15-L35)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L40-L85)
|
||
|
||
**章节来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L169)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||
|
||
## 依赖关系分析
|
||
|
||
随机事件系统的依赖关系体现了清晰的分层架构:
|
||
|
||
```mermaid
|
||
graph LR
|
||
subgraph "外部依赖"
|
||
ECS[ECS框架]
|
||
OopsFramework[Oops Framework]
|
||
GameEngine[Cocos Creator引擎]
|
||
end
|
||
subgraph "核心模块"
|
||
RogueConfig[RogueConfig.ts]
|
||
MissionMonComp[MissionMonComp.ts]
|
||
GameEvent[GameEvent.ts]
|
||
end
|
||
subgraph "配置模块"
|
||
HeroAttrs[HeroAttrs.ts]
|
||
GameUIConfig[GameUIConfig.ts]
|
||
end
|
||
ECS --> MissionMonComp
|
||
OopsFramework --> GameEvent
|
||
GameEngine --> ECS
|
||
RogueConfig --> MissionMonComp
|
||
MissionMonComp --> GameEvent
|
||
GameEvent --> GameUIConfig
|
||
HeroAttrs --> MissionMonComp
|
||
style RogueConfig fill:#e3f2fd
|
||
style MissionMonComp fill:#f3e5f5
|
||
style GameEvent fill:#e8f5e8
|
||
```
|
||
|
||
**图表来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L15)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L20)
|
||
|
||
**章节来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L20)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L20)
|
||
|
||
## 性能考虑
|
||
|
||
随机事件系统在设计时充分考虑了性能优化:
|
||
|
||
### 算法复杂度分析
|
||
- **getRandomEvent函数**:O(n)时间复杂度,其中n为事件类型数量
|
||
- **getStageType函数**:O(1)时间复杂度,固定条件判断
|
||
- **事件处理**:单次事件处理时间复杂度为O(1)
|
||
|
||
### 内存使用优化
|
||
- 事件配置采用静态常量定义,避免运行时内存分配
|
||
- 事件类型使用枚举,减少字符串比较开销
|
||
- 事件状态管理简洁,避免不必要的状态保存
|
||
|
||
### 扩展性设计
|
||
- 新增事件类型只需修改EventType枚举和EventConfig配置
|
||
- 事件效果处理采用switch语句,便于添加新的处理逻辑
|
||
- 关卡类型判断逻辑支持未来扩展新的触发条件
|
||
|
||
## 故障排除指南
|
||
|
||
### 常见问题及解决方案
|
||
|
||
#### 事件触发概率异常
|
||
**问题描述**:事件触发概率不符合预期
|
||
**可能原因**:
|
||
- EventConfig中的概率设置错误
|
||
- 累积概率计算逻辑异常
|
||
|
||
**解决方案**:
|
||
1. 检查EventConfig中各事件的概率总和是否为1
|
||
2. 验证getRandomEvent函数的累积概率计算逻辑
|
||
3. 添加调试日志输出随机数和累积概率值
|
||
|
||
#### 事件关卡触发时机错误
|
||
**问题描述**:事件关卡在非预期关卡触发
|
||
**可能原因**:
|
||
- getStageType函数的关卡判断逻辑错误
|
||
- 关卡参数传递不正确
|
||
|
||
**解决方案**:
|
||
1. 检查关卡号和等级参数的传递
|
||
2. 验证getStageType函数中的模运算逻辑
|
||
3. 添加关卡类型判断的日志输出
|
||
|
||
#### 事件效果未生效
|
||
**问题描述**:事件发生但效果未体现
|
||
**可能原因**:
|
||
- 事件处理逻辑缺失
|
||
- UI反馈未正确触发
|
||
|
||
**解决方案**:
|
||
1. 检查MissionMonComp中的processRandomEvent函数
|
||
2. 验证GameEvent系统的事件分发机制
|
||
3. 确认UI层的消息接收和处理逻辑
|
||
|
||
**章节来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L120-L169)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L280-L311)
|
||
|
||
## 结论
|
||
|
||
随机事件系统通过精心设计的架构和算法,为肉鸽模式游戏提供了丰富且可控的随机体验。系统的主要优势包括:
|
||
|
||
### 设计优势
|
||
- **模块化架构**:清晰的职责分离,便于维护和扩展
|
||
- **灵活的概率控制**:支持动态调整事件触发概率
|
||
- **完善的事件处理**:从触发到效果呈现的完整流程
|
||
- **良好的性能表现**:高效的算法实现和内存使用
|
||
|
||
### 扩展建议
|
||
1. **新增事件类型**:可以轻松添加复活、传送等新事件类型
|
||
2. **概率动态调整**:可以根据游戏进程动态调整事件概率
|
||
3. **事件效果增强**:支持更复杂的事件效果和组合效果
|
||
4. **UI反馈完善**:集成更丰富的视觉和音效反馈
|
||
|
||
### 最佳实践
|
||
- 保持事件概率的平衡性,避免过于极端的结果
|
||
- 提供清晰的事件效果说明,帮助玩家理解游戏机制
|
||
- 实现事件历史记录功能,增加游戏的策略深度
|
||
- 建立完善的测试机制,确保事件系统的稳定性
|
||
|
||
该随机事件系统为肉鸽游戏提供了坚实的基础,通过合理的扩展和优化,可以进一步提升游戏的趣味性和挑战性。 |