feat(怪物系统): 重构怪物类型与属性计算系统

引入MonType枚举支持普通、精英、BOSS三种怪物类型
新增getMonAttr函数实现基于等级和类型的动态属性计算
更新Mon.ts的load和hero_init方法以支持新参数
扩展heroSet.ts添加多种新怪物类型配置
重构属性初始化流程,移除strengthMultiplier机制
更新相关文档和流程图反映最新设计
This commit is contained in:
panw
2025-10-29 16:50:30 +08:00
parent 9dc1126dfe
commit edb7f23918
6 changed files with 648 additions and 432 deletions

View File

@@ -2,16 +2,21 @@
<cite>
**本文档引用的文件**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)
- [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)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts)
- [Mon.ts](file://assets/script/game/hero/Mon.ts)
- [MissionComp.ts](file://assets/script/game/map/MissionComp.ts)
- [MapModelComp.ts](file://assets/script/game/map/model/MapModelComp.ts)
- [MapViewComp.ts](file://assets/script/game/map/view/MapViewComp.ts)
</cite>
## 更新摘要
**已做更改**
- 全面重构关卡生成逻辑,采用新的 `MonType` 枚举替代旧的布尔标记
- 更新关卡类型判断机制,基于 `EliteStage``BossStage` 数组配置
- 重写怪物属性计算系统,引入 `MonAttrSet` 属性倍率配置
- 更新随机事件系统,使用数字枚举值替代字符串
- 同步更新调用流程和配置结构
## 目录
1. [系统概述](#系统概述)
2. [核心架构](#核心架构)
@@ -32,107 +37,93 @@
### 主要特性
- **程序化关卡生成**:基于关卡号和等级自动计算关卡配置
- **程序化关卡生成**:基于关卡号自动计算关卡配置
- **动态难度曲线**:怪物数量和强度随关卡递增而增强
- **多样化关卡类型**普通关卡、精英关卡、Boss关卡、事件关卡
- **多样化关卡类型**普通关卡、精英关卡、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[StageType枚举]
A --> C[MonsterType枚举]
A --> D[EventType枚举]
A --> E[StageConfigRules]
A --> F[EventConfig]
A[RogueConfig.ts] --> B[MonType枚举]
A --> C[EventType枚举]
A --> D[StageRule配置]
A --> E[Monster属性配置]
end
subgraph "逻辑层"
G[getStageType] --> H[calculateMonsterCount]
G --> I[calculateMonsterStrengthMultiplier]
H --> J[generateStageConfig]
I --> J
J --> K[getStageMonsterConfigs]
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 --> G
K --> L
A --> F
F --> L
M --> O
```
**图表来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L311)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L240)
- [GameMap.ts](file://assets/script/game/map/GameMap.ts#L1-L36)
**章节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L1-L50)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L1-L40)
- [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)
## 关卡类型系统
系统定义了种主要的关卡类型,每种类型都有独特的配置特征和挑战性。
系统定义了种主要的关卡类型,每种类型都有独特的配置特征和挑战性。
### StageType枚举结构
### MonType枚举结构
```mermaid
classDiagram
class StageType {
class MonType {
<<enumeration>>
+NORMAL : "normal"
+ELITE : "elite"
+BOSS : "boss"
+EVENT : "event"
+NORMAL : 0
+ELITE : 1
+BOSS : 2
}
class StageConfigRules {
+NORMAL : NormalConfig
+ELITE : EliteConfig
+BOSS : BossConfig
+EVENT : EventConfig
class IMonsConfig {
+uuid : number
+buff : BuffConf[]
+level : number
+monType : MonType
}
class NormalConfig {
+description : "普通关卡"
+monsters : MonsterGroup[]
class StageConfig {
+MonsNum : 5
+extraMonsterRate : 0.3
+eventMonsterRate : 0.25
}
class EliteConfig {
+description : "精英关卡"
+monsters : MonsterGroup[]
}
class BossConfig {
+description : "Boss关卡"
+monsters : MonsterGroup[]
}
class EventConfig {
+description : "事件关卡"
+monsters : MonsterGroup[]
}
StageType --> StageConfigRules : "映射到"
StageConfigRules --> NormalConfig : "包含"
StageConfigRules --> EliteConfig : "包含"
StageConfigRules --> BossConfig : "包含"
StageConfigRules --> EventConfig : "包含"
MonType --> IMonsConfig : "用于配置"
IMonsConfig --> StageConfig : "生成"
```
**图表来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L86)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
### 关卡类型特征对比
| 关卡类型 | 怪物组成 | 数量范围 | 特殊规则 |
| 关卡类型 | 触发条件 | 怪物组成 | 特殊规则 |
|---------|---------|---------|---------|
| 普通关卡 | 普通怪物 | 2-6只 | 基础难度,适合新手 |
| 精英关卡 | 精英+普通 | 3-9只 | 中等难度,包含精英怪物 |
| Boss关卡 | Boss+精英+普通 | 4-8只 | 高难度包含Boss |
| 事件关卡 | 普通怪物 | 1-4只 | 包含随机事件 |
| 普通关卡 | 非精英/Boss关卡 | 普通怪物为主 | 基础难度,适合新手 |
| 精英关卡 | 关卡号在EliteStage数组中 | 精英+普通怪物 | 中等难度,包含精英怪物 |
| Boss关卡 | 关卡号在BossStage数组中 | Boss+精英+普通怪物 | 高难度包含Boss |
**章节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L47-L86)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
## 怪物类型体系
@@ -142,45 +133,43 @@ StageConfigRules --> EventConfig : "包含"
```mermaid
classDiagram
class MonsterType {
class MonType {
<<enumeration>>
+NORMAL : "normal"
+ELITE : "elite"
+BOSS : "boss"
+NORMAL : 0
+ELITE : 1
+BOSS : 2
}
class MonsterConfig {
+uuid : number
+type : MonsterType
+stageNumber : number
+type : MonType
+level : number
+strengthMultiplier : number
+buff : BuffConf[]
}
class MonsterPool {
+getMonsterUUIDsByType() : number[]
+EliteMonsterList : number[]
+BossMonsterList : number[]
+EliteMons : number[]
+BossMons : number[]
+getMonList() : number[]
}
MonsterType --> MonsterConfig : "生成"
MonsterPool --> MonsterType : "提供"
MonType --> MonsterConfig : "生成"
MonsterPool --> MonType : "提供"
MonsterPool --> MonsterConfig : "包含"
```
**图表来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L28-L34)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L240-L260)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L31-L31)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
### 怪物池配置
系统维护三个独立的怪物池,每个池包含特定类型的怪物:
- **普通怪物池**:使用 `getMonList()` 方法获取所有可用的普通怪物
- **精英怪物池**:固定配置的精英怪物列表
- **Boss怪物池**固定配置的Boss怪物列表
- **精英怪物池**:固定配置的精英怪物列表 `EliteMons`
- **Boss怪物池**固定配置的Boss怪物列表 `BossMons`
**章节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L34)
- [heroSet.ts](file://assets/script/game/game/common/config/heroSet.ts#L35-L40)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L18-L20)
- [heroSet.ts](file://assets/script/game/common/config/heroSet.ts#L20-L215)
## 关卡配置规则
@@ -190,45 +179,42 @@ MonsterPool --> MonsterConfig : "包含"
```mermaid
flowchart TD
A[关卡号] --> B{关卡类型判断}
B --> |第5关且等级3| C[事件关卡]
B --> |第10关| D{等级判断}
B --> |其他| E{等级判断}
D --> |等级5| F[Boss关卡]
D --> |等级4| G[精英关卡]
D --> |其他| H[普通关卡]
E --> |等级5| I[精英关卡]
E --> |其他| J[普通关卡]
C --> K[生成怪物配置]
F --> K
G --> K
H --> K
I --> K
J --> K
K --> L[计算怪物数量]
K --> M[计算强度倍率]
L --> N[生成最终配置]
M --> N
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#L129-L168)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
### 怪物数量计算算法
系统采用线性递增算法计算怪物数量:
系统采用固定基础数量加动态调整的算法计算怪物数量:
```typescript
// 计算公式:基础数量 + (关卡号 ÷ 5) 的整数部分
const increment = Math.floor(stageNumber / 5);
let count = baseCount + increment;
// 基础怪物数量
let baseMonsterCount = StageRule.MonsNum; // 默认5只
// 确保数量在最小值和最大值范围内
count = Math.max(minCount, Math.min(maxCount, count));
// 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#L150-L175)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
## 随机事件系统
@@ -240,65 +226,44 @@ count = Math.max(minCount, Math.min(maxCount, count));
classDiagram
class EventType {
<<enumeration>>
+TREASURE : "treasure"
+TRAP : "trap"
+BUFF : "buff"
+DEBUFF : "debuff"
+TREASURE : 1
+TRAP : 2
+BUFF : 3
+DEBUFF : 4
}
class EventConfig {
+TREASURE : TreasureConfig
+TRAP : TrapConfig
+BUFF : BuffConfig
+DEBUFF : DebuffConfig
class StageRule {
+eventMonsterRate : 0.25
+specialAttributeRate : 0.4
}
class EventProbability {
+TREASURE : 0.3
+TRAP : 0.25
+BUFF : 0.25
+DEBUFF : 0.2
}
EventType --> EventConfig : "配置"
EventConfig --> EventProbability : "概率分布"
EventType --> StageRule : "配置概率"
```
**图表来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L50-L75)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L35-L40)
### 事件触发机制
事件系统采用累积概率算法确保公平性
事件系统采用概率算法触发特殊效果
```mermaid
sequenceDiagram
participant Player as 玩家
participant System as 事件系统
participant RNG as 随机数生成器
participant Effect as 效果处理器
Player->>System : 进入事件关卡
System->>RNG : 生成随机数(0-1)
RNG-->>System : 返回随机值
System->>System : 累积概率计算
alt 随机数 ≤ 0.3
System->>Effect : 触发宝藏事件
Effect->>Player : 增加50金币
else 随机数 ≤ 0.55
System->>Effect : 触发陷阱事件
Effect->>Player : 造成伤害
else 随机数 ≤ 0.8
System->>Effect : 触发增益事件
Effect->>Player : 获得临时增益
else 随机数 > 0.8
System->>Effect : 触发减益事件
Effect->>Player : 造成临时减益
end
```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#L295-L311)
**章节来源**
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L50-L75)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L295-L311)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L45-L56)
## 动态难度计算
@@ -308,33 +273,32 @@ end
```mermaid
flowchart LR
A[关卡号] --> B[阶段倍率计算]
C[等级] --> D[等级倍率计算]
B --> E[基础倍率 = 1 + (关卡号-1) × 0.1]
D --> F[等级倍率 = 1 + (等级-1) × 0.05]
E --> G[总倍率 = 阶段倍率 × 等级倍率]
F --> G
G --> H[应用到怪物属性]
H --> I[HP = 基础HP × 总倍率]
H --> J[AP = 基础AP × 总倍率]
H --> K[DEF = 基础DEF × 总倍率]
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#L177-L185)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L69-L73)
### 难度曲线特征
| 关卡范围 | 等级要求 | 强度倍率 | 怪物数量 | 挑战特点 |
|---------|---------|---------|---------|---------|
| 1-9 | 1-4级 | 1.0-1.4 | 2-6只 | 渐进适应 |
| 1-9 | 5级 | 1.4-1.8 | 3-6只 | 中等挑战 |
| 10 | 1-3级 | 1.9-2.3 | 3-6只 | 高强度 |
| 10 | 4级 | 2.4-2.8 | 3-6只 | 极限挑战 |
| 10 | 5级 | 2.9-3.3 | 3-6只 | 终极考验 |
| 怪物类型 | 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#L177-L185)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L69-L73)
## 关卡生成流程
@@ -350,14 +314,9 @@ participant RC as RogueConfig
participant MM as MapModel
participant M as Monster
MC->>RM : do_mon_wave()
RM->>RC : getStageType(stageNumber, level)
RC-->>RM : StageType
RM->>RC : getStageMonsterConfigs(stageNumber, level)
RC->>RC : generateStageConfig()
RC->>RC : calculateMonsterCount()
RC->>RC : calculateMonsterStrengthMultiplier()
RM->>RC : getStageMonConfigs(stageNumber)
RC-->>RM : 怪物配置数组
RM->>RM : generateMonstersFromStageConfig()
RM->>RM : generateMonsters()
loop 每个怪物配置
RM->>RM : addToStageSpawnQueue()
end
@@ -371,7 +330,7 @@ end
**图表来源**
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L207-L247)
- [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts#L95-L173)
### 怪物生成队列管理
@@ -394,10 +353,6 @@ stateDiagram-v2
**图表来源**
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L45-L85)
**章节来源**
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L102-L136)
- [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts#L150-L180)
## 实际调用机制
系统在游戏运行时通过事件驱动的方式调用关卡配置功能。
@@ -417,10 +372,9 @@ MC->>MC : to_fight()
MC->>MMon : fight_ready()
MMon->>MMon : do_mon_wave()
Note over MMon : 开始关卡生成流程
MMon->>RC : getStageType(currentStage, level)
MMon->>RC : getStageMonsterConfigs(currentStage, level)
MMon->>RC : getStageMonConfigs(currentStage)
RC-->>MMon : 怪物配置数据
MMon->>MMon : generateMonstersFromStageConfig()
MMon->>MMon : generateMonsters()
MMon->>MMon : addToStageSpawnQueue()
loop 怪物生成循环
MMon->>MMon : spawnNextMonster()
@@ -457,30 +411,25 @@ end
```typescript
export enum EventType {
// 现有类型...
NEW_EVENT = "new_event" // 新增事件类型
NEW_EVENT = 5 // 新增事件类型
}
```
2. **更新EventConfig配置**
2. **更新StageRule配置**
```typescript
export const EventConfig = {
export const StageRule = {
// 现有配置...
[EventType.NEW_EVENT]: {
description: "新事件描述",
probability: 0.15, // 新事件概率
effect: "新事件效果"
}
newEventRate: 0.15, // 新事件概率
specialAttributeCount: { min: 1, max: 2 }
}
```
3. **在事件处理函数中添加逻辑**
```typescript
private processRandomEvent() {
switch (this.currentEvent) {
// 现有事件处理...
case EventType.NEW_EVENT:
// 实现新事件逻辑
break;
// 根据StageRule中的概率判断
if (Math.random() < StageRule.newEventRate) {
// 实现新事件逻辑
}
}
```
@@ -489,69 +438,72 @@ private processRandomEvent() {
可以通过修改以下参数来调整难度曲线:
1. **基础倍率调整**
1. **基础数量调整**
```typescript
// 修改 StageConfigRules 中的怪物配置
[StageType.NORMAL]: {
monsters: [
{ type: MonsterType.NORMAL, count: 3, minCount: 2, maxCount: 6 }
// count: 基础数量
// minCount/maxCount: 数量范围限制
]
export const StageRule = {
MonsNum: 6, // 增加基础怪物数量
LimitMonNum: 12, // 增加极限模式数量
extraMonsterRate: 0.4, // 提高额外怪物概率
}
```
2. **强度倍率系数**
2. **属性倍率调整**
```typescript
// 修改 calculateMonsterStrengthMultiplier 函数
const stageMultiplier = 1 + (stageNumber - 1) * 0.15; // 增加每关倍率
const levelMultiplier = 1 + (level - 1) * 0.08; // 增加每级倍率
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 EliteMonsterList = [
export const EliteMons = [
5201, // 兽人战士
5202, // 兽人刺客
5203, // 兽人护卫
// 添加更多精英怪物
5204, // 新精英怪物
5205 // 更强精英怪物
5213, // 亡灵领主(精英)
5214, // 死灵法师(召唤师)
5215 // 祭司(治疗者)
];
```
2. **优化Boss关卡配置**
```typescript
[StageType.BOSS]: {
description: "Boss关卡",
monsters: [
{ type: MonsterType.BOSS, count: 1, minCount: 1, maxCount: 1 },
{ type: MonsterType.ELITE, count: 3, minCount: 2, maxCount: 4 }, // 增加精英数量
{ type: MonsterType.NORMAL, count: 4, minCount: 2, maxCount: 6 } // 增加普通怪物
]
}
```
### 自定义怪物池
如果需要添加特定类型的怪物:
1. **扩展怪物池**
```typescript
// 在 RogueConfig.ts 中
export const CustomMonsterList = [
5301, // 自定义怪物1
5302, // 自定义怪物2
5303 // 自定义怪物3
export const BossMons = [
5201, // 兽人战士
5202, // 兽人刺客
5213, // 亡灵领主(精英)
5216 // 光环幽灵(光环怪)
];
// 在getStageMonConfigs中调整精英数量
const eliteCount = isBossStage ? 2 : Math.floor(Math.random() * 2) + 1; // Boss关卡增加精英数量
```
2. **在 getMonsterUUIDsByType 中添加分支**
### 自定义怪物属性
如果需要为特定怪物类型添加特殊属性:
1. **扩展Buff配置**
```typescript
case MonsterType.CUSTOM:
return CustomMonsterList;
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
});
```
## 性能优化建议