引入MonType枚举支持普通、精英、BOSS三种怪物类型 新增getMonAttr函数实现基于等级和类型的动态属性计算 更新Mon.ts的load和hero_init方法以支持新参数 扩展heroSet.ts添加多种新怪物类型配置 重构属性初始化流程,移除strengthMultiplier机制 更新相关文档和流程图反映最新设计
544 lines
15 KiB
Markdown
544 lines
15 KiB
Markdown
# 肉鸽关卡配置系统
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts) - *在最近提交中更新*
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - *在最近提交中更新*
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts) - *在最近提交中更新*
|
||
- [SkillSet.ts](file://assets/script/game/common/config/SkillSet.ts)
|
||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts)
|
||
</cite>
|
||
|
||
## 更新摘要
|
||
**已做更改**
|
||
- 全面重构关卡生成逻辑,采用新的 `MonType` 枚举替代旧的布尔标记
|
||
- 更新关卡类型判断机制,基于 `EliteStage` 和 `BossStage` 数组配置
|
||
- 重写怪物属性计算系统,引入 `MonAttrSet` 属性倍率配置
|
||
- 更新随机事件系统,使用数字枚举值替代字符串
|
||
- 同步更新调用流程和配置结构
|
||
|
||
## 目录
|
||
1. [系统概述](#系统概述)
|
||
2. [核心架构](#核心架构)
|
||
3. [关卡类型系统](#关卡类型系统)
|
||
4. [怪物类型体系](#怪物类型体系)
|
||
5. [关卡配置规则](#关卡配置规则)
|
||
6. [随机事件系统](#随机事件系统)
|
||
7. [动态难度计算](#动态难度计算)
|
||
8. [关卡生成流程](#关卡生成流程)
|
||
9. [实际调用机制](#实际调用机制)
|
||
10. [扩展指南](#扩展指南)
|
||
11. [性能优化建议](#性能优化建议)
|
||
12. [总结](#总结)
|
||
|
||
## 系统概述
|
||
|
||
肉鸽关卡配置系统是一个高度程序化的关卡生成框架,专为Roguelike游戏设计。该系统通过智能算法动态生成具有递增难度的关卡,支持多种怪物类型、随机事件和平衡性调整。
|
||
|
||
### 主要特性
|
||
|
||
- **程序化关卡生成**:基于关卡号自动计算关卡配置
|
||
- **动态难度曲线**:怪物数量和强度随关卡递增而增强
|
||
- **多样化关卡类型**:普通关卡、精英关卡、Boss关卡
|
||
- **随机事件系统**:包含奖励、陷阱、增益、减益等多种事件
|
||
- **灵活配置管理**:支持快速调整难度曲线和平衡性
|
||
|
||
**更新** 重构了怪物生成逻辑,使用 `MonType` 枚举和数组配置替代原有实现
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L40)
|
||
|
||
## 核心架构
|
||
|
||
```mermaid
|
||
graph TB
|
||
subgraph "配置层"
|
||
A[RogueConfig.ts] --> B[MonType枚举]
|
||
A --> C[EventType枚举]
|
||
A --> D[StageRule配置]
|
||
A --> E[Monster属性配置]
|
||
end
|
||
subgraph "逻辑层"
|
||
F[getStageMonConfigs] --> G[精英/Boss判断]
|
||
G --> H[基础怪物数量计算]
|
||
F --> I[精英怪物添加]
|
||
F --> J[Boss怪物添加]
|
||
F --> K[额外怪物生成]
|
||
end
|
||
subgraph "应用层"
|
||
L[MissionMonComp.ts] --> M[GameMap.ts]
|
||
L --> N[Mon.ts]
|
||
L --> O[MapModelComp.ts]
|
||
end
|
||
A --> F
|
||
F --> L
|
||
M --> O
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L173)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L200)
|
||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L35)
|
||
|
||
## 关卡类型系统
|
||
|
||
系统定义了三种主要的关卡类型,每种类型都有独特的配置特征和挑战性。
|
||
|
||
### MonType枚举结构
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class MonType {
|
||
<<enumeration>>
|
||
+NORMAL : 0
|
||
+ELITE : 1
|
||
+BOSS : 2
|
||
}
|
||
class IMonsConfig {
|
||
+uuid : number
|
||
+buff : BuffConf[]
|
||
+level : number
|
||
+monType : MonType
|
||
}
|
||
class StageConfig {
|
||
+MonsNum : 5
|
||
+extraMonsterRate : 0.3
|
||
+eventMonsterRate : 0.25
|
||
}
|
||
MonType --> IMonsConfig : "用于配置"
|
||
IMonsConfig --> StageConfig : "生成"
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
|
||
|
||
### 关卡类型特征对比
|
||
|
||
| 关卡类型 | 触发条件 | 怪物组成 | 特殊规则 |
|
||
|---------|---------|---------|---------|
|
||
| 普通关卡 | 非精英/Boss关卡 | 普通怪物为主 | 基础难度,适合新手 |
|
||
| 精英关卡 | 关卡号在EliteStage数组中 | 精英+普通怪物 | 中等难度,包含精英怪物 |
|
||
| Boss关卡 | 关卡号在BossStage数组中 | Boss+精英+普通怪物 | 高难度,包含Boss |
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
|
||
|
||
## 怪物类型体系
|
||
|
||
系统采用分层的怪物分类体系,支持不同强度和行为特征的怪物配置。
|
||
|
||
### MonsterType枚举设计
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class MonType {
|
||
<<enumeration>>
|
||
+NORMAL : 0
|
||
+ELITE : 1
|
||
+BOSS : 2
|
||
}
|
||
class MonsterConfig {
|
||
+uuid : number
|
||
+type : MonType
|
||
+level : number
|
||
+buff : BuffConf[]
|
||
}
|
||
class MonsterPool {
|
||
+EliteMons : number[]
|
||
+BossMons : number[]
|
||
+getMonList() : number[]
|
||
}
|
||
MonType --> MonsterConfig : "生成"
|
||
MonsterPool --> MonType : "提供"
|
||
MonsterPool --> MonsterConfig : "包含"
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
|
||
|
||
### 怪物池配置
|
||
|
||
系统维护三个独立的怪物池,每个池包含特定类型的怪物:
|
||
|
||
- **普通怪物池**:使用 `getMonList()` 方法获取所有可用的普通怪物
|
||
- **精英怪物池**:固定配置的精英怪物列表 `EliteMons`
|
||
- **Boss怪物池**:固定配置的Boss怪物列表 `BossMons`
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
|
||
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L20-L215)
|
||
|
||
## 关卡配置规则
|
||
|
||
系统通过预定义的配置规则实现关卡的程序化生成,确保游戏体验的连贯性和挑战性。
|
||
|
||
### 配置规则结构
|
||
|
||
```mermaid
|
||
flowchart TD
|
||
A[关卡号] --> B{是否为Boss关卡}
|
||
B --> |是| C[添加Boss怪物]
|
||
B --> |否| D{是否为精英关卡}
|
||
D --> |是| E[添加1-2个精英怪物]
|
||
D --> |否| F[仅添加普通怪物]
|
||
C --> G[调整基础怪物数量]
|
||
E --> G
|
||
F --> G
|
||
G --> H[添加额外怪物]
|
||
H --> I[返回怪物配置]
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
|
||
|
||
### 怪物数量计算算法
|
||
|
||
系统采用固定基础数量加动态调整的算法计算怪物数量:
|
||
|
||
```typescript
|
||
// 基础怪物数量
|
||
let baseMonsterCount = StageRule.MonsNum; // 默认5只
|
||
|
||
// Boss关卡减少普通怪物数量
|
||
if (isBossStage) {
|
||
baseMonsterCount = Math.max(1, baseMonsterCount - 2);
|
||
}
|
||
|
||
// 精英关卡减少普通怪物数量
|
||
if (isEliteStage) {
|
||
baseMonsterCount = Math.max(1, baseMonsterCount - eliteCount);
|
||
}
|
||
```
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
|
||
|
||
## 随机事件系统
|
||
|
||
系统提供了丰富的随机事件机制,为游戏增添不确定性和策略深度。
|
||
|
||
### EventType枚举
|
||
|
||
```mermaid
|
||
classDiagram
|
||
class EventType {
|
||
<<enumeration>>
|
||
+TREASURE : 1
|
||
+TRAP : 2
|
||
+BUFF : 3
|
||
+DEBUFF : 4
|
||
}
|
||
class StageRule {
|
||
+eventMonsterRate : 0.25
|
||
+specialAttributeRate : 0.4
|
||
}
|
||
EventType --> StageRule : "配置概率"
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L40)
|
||
|
||
### 事件触发机制
|
||
|
||
事件系统采用概率算法触发特殊效果:
|
||
|
||
```typescript
|
||
// 额外怪物出现概率
|
||
if (Math.random() < StageRule.extraMonsterRate) {
|
||
// 生成第6个怪物
|
||
}
|
||
|
||
// 事件怪物出现概率
|
||
if (Math.random() < StageRule.eventMonsterRate) {
|
||
// 替换一个普通怪物为事件怪物
|
||
}
|
||
|
||
// 特殊属性怪物出现概率
|
||
if (Math.random() < StageRule.specialAttributeRate) {
|
||
// 为1-2个怪物添加特殊属性
|
||
}
|
||
```
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L45-L56)
|
||
|
||
## 动态难度计算
|
||
|
||
系统实现了复杂的难度计算机制,确保游戏体验的渐进式挑战。
|
||
|
||
### 强度倍率计算
|
||
|
||
```mermaid
|
||
flowchart LR
|
||
A[怪物类型] --> B[属性倍率表]
|
||
B --> C[HP_MAX]
|
||
B --> D[AP]
|
||
B --> E[DEF]
|
||
B --> F[MAP]
|
||
B --> G[MDEF]
|
||
C --> H[最终属性 = 基础属性 × 等级 × 类型倍率]
|
||
D --> H
|
||
E --> H
|
||
F --> H
|
||
G --> H
|
||
```
|
||
|
||
**图表来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L69-L73)
|
||
|
||
### 难度曲线特征
|
||
|
||
| 怪物类型 | HP_MAX | AP | DEF | MAP | MDEF | 挑战特点 |
|
||
|---------|-------|----|-----|-----|------|---------|
|
||
| 普通怪物 | 1.1x | 1.05x | 1.05x | 1.05x | 1.05x | 基础挑战 |
|
||
| 精英怪物 | 2.0x | 1.1x | 1.1x | 1.1x | 1.1x | 中等挑战 |
|
||
| Boss怪物 | 5.0x | 2.0x | 2.0x | 2.0x | 2.0x | 终极挑战 |
|
||
|
||
**章节来源**
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L69-L73)
|
||
|
||
## 关卡生成流程
|
||
|
||
系统通过多层函数协作实现完整的关卡生成流程。
|
||
|
||
### 完整生成序列
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant MC as MissionComp
|
||
participant RM as MissionMonComp
|
||
participant RC as RogueConfig
|
||
participant MM as MapModel
|
||
participant M as Monster
|
||
MC->>RM : do_mon_wave()
|
||
RM->>RC : getStageMonConfigs(stageNumber)
|
||
RC-->>RM : 怪物配置数组
|
||
RM->>RM : generateMonsters()
|
||
loop 每个怪物配置
|
||
RM->>RM : addToStageSpawnQueue()
|
||
end
|
||
loop 怪物生成队列
|
||
RM->>M : addMonster()
|
||
M->>MM : 加载怪物资源
|
||
MM-->>M : 怪物实例
|
||
M-->>RM : 怪物实体
|
||
end
|
||
```
|
||
|
||
**图表来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
|
||
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
|
||
|
||
### 怪物生成队列管理
|
||
|
||
系统采用队列机制控制怪物生成节奏:
|
||
|
||
```mermaid
|
||
stateDiagram-v2
|
||
[*] --> 等待生成
|
||
等待生成 --> 准备生成 : 怪物队列非空
|
||
准备生成 --> 生成中 : spawnTimer >= spawnInterval
|
||
生成中 --> 暂停检查 : 生成5只后
|
||
生成中 --> 准备生成 : 继续生成
|
||
暂停检查 --> 暂停中 : 需要暂停
|
||
暂停检查 --> 准备生成 : 继续生成
|
||
暂停中 --> 暂停结束 : pauseInterval时间到
|
||
暂停结束 --> 准备生成 : 重置计数器
|
||
准备生成 --> [*] : 队列为空
|
||
```
|
||
|
||
**图表来源**
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L45-L85)
|
||
|
||
## 实际调用机制
|
||
|
||
系统在游戏运行时通过事件驱动的方式调用关卡配置功能。
|
||
|
||
### 调用时序图
|
||
|
||
```mermaid
|
||
sequenceDiagram
|
||
participant GM as GameMap
|
||
participant MC as MissionComp
|
||
participant MMon as MissionMonComp
|
||
participant RC as RogueConfig
|
||
GM->>MC : 初始化游戏
|
||
MC->>MC : data_init()
|
||
MC->>MC : mission_start()
|
||
MC->>MC : to_fight()
|
||
MC->>MMon : fight_ready()
|
||
MMon->>MMon : do_mon_wave()
|
||
Note over MMon : 开始关卡生成流程
|
||
MMon->>RC : getStageMonConfigs(currentStage)
|
||
RC-->>MMon : 怪物配置数据
|
||
MMon->>MMon : generateMonsters()
|
||
MMon->>MMon : addToStageSpawnQueue()
|
||
loop 怪物生成循环
|
||
MMon->>MMon : spawnNextMonster()
|
||
MMon->>GM : addMonster()
|
||
end
|
||
```
|
||
|
||
**图表来源**
|
||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L75-L95)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L40-L50)
|
||
|
||
### 数据流传递
|
||
|
||
关卡配置数据通过以下路径传递:
|
||
|
||
1. **配置层**:RogueConfig.ts 提供基础配置
|
||
2. **逻辑层**:MissionMonComp.ts 处理游戏逻辑
|
||
3. **渲染层**:Mon.ts 负责怪物渲染和行为
|
||
4. **状态层**:smc.vmdata.mission_data 管理游戏状态
|
||
|
||
**章节来源**
|
||
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L25-L35)
|
||
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts#L75-L95)
|
||
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L40-L50)
|
||
|
||
## 扩展指南
|
||
|
||
### 添加新事件类型
|
||
|
||
要添加新的随机事件类型,请按照以下步骤操作:
|
||
|
||
1. **扩展EventType枚举**:
|
||
```typescript
|
||
export enum EventType {
|
||
// 现有类型...
|
||
NEW_EVENT = 5 // 新增事件类型
|
||
}
|
||
```
|
||
|
||
2. **更新StageRule配置**:
|
||
```typescript
|
||
export const StageRule = {
|
||
// 现有配置...
|
||
newEventRate: 0.15, // 新事件概率
|
||
specialAttributeCount: { min: 1, max: 2 }
|
||
}
|
||
```
|
||
|
||
3. **在事件处理函数中添加逻辑**:
|
||
```typescript
|
||
private processRandomEvent() {
|
||
// 根据StageRule中的概率判断
|
||
if (Math.random() < StageRule.newEventRate) {
|
||
// 实现新事件逻辑
|
||
}
|
||
}
|
||
```
|
||
|
||
### 调整难度曲线
|
||
|
||
可以通过修改以下参数来调整难度曲线:
|
||
|
||
1. **基础数量调整**:
|
||
```typescript
|
||
export const StageRule = {
|
||
MonsNum: 6, // 增加基础怪物数量
|
||
LimitMonNum: 12, // 增加极限模式数量
|
||
extraMonsterRate: 0.4, // 提高额外怪物概率
|
||
}
|
||
```
|
||
|
||
2. **属性倍率调整**:
|
||
```typescript
|
||
export const MonAttrSet = {
|
||
[MonType.NORMAL]:{ HP_MAX:1.2, AP:1.1, MP:1.2, DEF:1.1, MDEF:1.1, MAP:1.1,},
|
||
[MonType.ELITE]: { HP_MAX:2.5, AP:1.2, MP:1.2, DEF:1.2, MDEF:1.2, MAP:1.2,},
|
||
[MonType.BOSS]: { HP_MAX:6, AP:2.5, MP:6, DEF:2.5, MDEF:2.5, MAP:2.5,},
|
||
}
|
||
```
|
||
|
||
### 平衡精英/Boss关卡
|
||
|
||
1. **调整精英怪物配置**:
|
||
```typescript
|
||
export const EliteMons = [
|
||
5201, // 兽人战士
|
||
5202, // 兽人刺客
|
||
5203, // 兽人护卫
|
||
5213, // 亡灵领主(精英)
|
||
5214, // 死灵法师(召唤师)
|
||
5215 // 祭司(治疗者)
|
||
];
|
||
```
|
||
|
||
2. **优化Boss关卡配置**:
|
||
```typescript
|
||
export const BossMons = [
|
||
5201, // 兽人战士
|
||
5202, // 兽人刺客
|
||
5213, // 亡灵领主(精英)
|
||
5216 // 光环幽灵(光环怪)
|
||
];
|
||
|
||
// 在getStageMonConfigs中调整精英数量
|
||
const eliteCount = isBossStage ? 2 : Math.floor(Math.random() * 2) + 1; // Boss关卡增加精英数量
|
||
```
|
||
|
||
### 自定义怪物属性
|
||
|
||
如果需要为特定怪物类型添加特殊属性:
|
||
|
||
1. **扩展Buff配置**:
|
||
```typescript
|
||
import { BuffConf, Attrs } from "../common/config/SkillSet";
|
||
|
||
// 在怪物生成时添加特殊属性
|
||
monsterConfigs.push({
|
||
uuid: specialUUID,
|
||
buff: [{
|
||
buff: Attrs.CRIT_UP,
|
||
BType: BType.Ratio,
|
||
value: 30,
|
||
time: 999,
|
||
chance: 100
|
||
}],
|
||
level: stage,
|
||
monType: MonType.ELITE
|
||
});
|
||
```
|
||
|
||
## 性能优化建议
|
||
|
||
### 怪物生成优化
|
||
|
||
1. **批量生成**:使用对象池减少频繁的实例化
|
||
2. **延迟加载**:怪物资源按需加载
|
||
3. **队列管理**:合理控制生成频率避免性能峰值
|
||
|
||
### 内存管理
|
||
|
||
1. **及时清理**:战斗结束后立即清理怪物实体
|
||
2. **资源卸载**:不再需要的资源及时卸载
|
||
3. **缓存策略**:合理缓存常用的配置数据
|
||
|
||
### 配置优化
|
||
|
||
1. **预计算**:将静态配置在启动时预计算
|
||
2. **分层加载**:按关卡需求分层加载配置
|
||
3. **压缩存储**:使用紧凑的数据结构存储配置
|
||
|
||
## 总结
|
||
|
||
肉鸽关卡配置系统是一个设计精良的程序化关卡生成框架,具有以下核心优势:
|
||
|
||
### 技术亮点
|
||
|
||
- **模块化设计**:清晰的职责分离和接口定义
|
||
- **可扩展性**:易于添加新类型和调整配置
|
||
- **性能优化**:合理的算法设计和资源管理
|
||
- **用户体验**:平衡的难度曲线和多样化的游戏体验
|
||
|
||
### 应用价值
|
||
|
||
该系统不仅适用于Roguelike游戏,也可作为其他类型游戏关卡生成的基础框架。其程序化的设计理念和灵活的配置机制为游戏开发提供了强大的工具支持。
|
||
|
||
通过深入理解和合理运用这套系统,开发者可以创造出具有深度策略性和持续挑战性的游戏体验,为玩家提供持久的游戏乐趣。 |