18 KiB
奖励系统
**本文档引用的文件** - [Mission.ts](file://assets/script/game/common/config/Mission.ts) - [Tasks.ts](file://assets/script/game/common/config/Tasks.ts) - [MissionComp.ts](file://assets/script/game/map/MissionComp.ts) - [MissionHeroComp.ts](file://assets/script/game/map/MissionHeroComp.ts) - [MissionMonComp.ts](file://assets/script/game/map/MissionMonComp.ts) - [MissionHomeComp.ts](file://assets/script/game/map/MissionHomeComp.ts) - [VictoryComp.ts](file://assets/script/game/map/VictoryComp.ts) - [GameUIConfig.ts](file://assets/script/game/common/config/GameUIConfig.ts) - [SingletonModuleComp.ts](file://assets/script/game/common/SingletonModuleComp.ts) - [heroSet.ts](file://assets/script/game/common/config/heroSet.ts) - [HeroAttrs.ts](file://assets/script/game/common/config/HeroAttrs.ts) - [TalSet.ts](file://assets/script/game/common/config/TalSet.ts) - [RogueConfig.ts](file://assets/script/game/map/RogueConfig.ts)目录
简介
奖励系统是本游戏的核心机制之一,采用三选一奖励选择模式,在每波怪物清理后为玩家提供三种不同类型的奖励选项。系统基于肉鸽(Roguelike)游戏设计理念,通过策略性的奖励选择来影响英雄的成长路径,为玩家提供多样化的游戏体验和重玩价值。
奖励系统的主要特点包括:
- 三选一选择机制:每轮战斗结束后提供三个奖励选项
- 多样化奖励类型:属性提升、技能升级、装备获取、新技能解锁等
- 策略性决策:玩家需要根据当前阵容和游戏进度做出最优选择
- 动态权重系统:奖励权重根据游戏进度和玩家状态动态调整
- 可视化反馈:清晰的奖励预览和效果展示
系统架构概览
奖励系统采用模块化架构设计,各组件职责明确,通过事件驱动的方式协同工作。
graph TB
subgraph "战斗系统"
MC[MissionComp<br/>任务控制器]
MMC[MissionMonComp<br/>怪物控制器]
MHMC[MissionHeroComp<br/>英雄控制器]
end
subgraph "奖励系统"
VC[VictoryComp<br/>胜利界面]
SM[SingletonModule<br/>单例模块]
end
subgraph "配置系统"
MS[Mission.ts<br/>战斗配置]
TS[Tasks.ts<br/>任务配置]
RS[RogueConfig.ts<br/>肉鸽配置]
end
subgraph "数据层"
GD[GameData<br/>游戏数据]
MD[MissionData<br/>关卡数据]
end
MC --> VC
MC --> SM
MMC --> MC
MHMC --> MC
VC --> SM
SM --> GD
SM --> MD
MS --> MC
RS --> MMC
TS --> MC
图表来源
核心组件分析
MissionComp - 任务控制器
MissionComp是奖励系统的核心控制器,负责整个战斗流程的管理和奖励发放。
classDiagram
class MissionComp {
+rewards : any[]
+game_data : any
+onLoad() void
+update(dt : number) void
+do_reward() void
+do_drop(drop_item : any[], game_data : any) void
+do_mon_dead(event : any, data : any) void
+do_hero_dead(event : any, data : any) void
+mission_start() Promise~void~
+to_fight() void
+fight_end() void
+mission_end() void
+data_init() void
+cleanComponents() void
}
class SingletonModuleComp {
+mission : any
+vmdata : any
+data : any
}
class GameEvent {
+MissionStart
+MonDead
+HeroDead
+FightEnd
+MissionEnd
}
MissionComp --> SingletonModuleComp : "使用"
MissionComp --> GameEvent : "监听"
图表来源
节来源
VictoryComp - 胜利界面控制器
VictoryComp负责战斗胜利后的奖励选择界面,处理玩家的选择和奖励发放。
sequenceDiagram
participant Player as 玩家
participant VC as VictoryComp
participant SM as SingletonModule
participant UI as 用户界面
Player->>VC : 战斗胜利
VC->>SM : 获取奖励数据
SM-->>VC : 返回奖励列表
VC->>UI : 显示奖励选项
Player->>UI : 选择奖励
UI->>VC : 发送选择事件
VC->>SM : 处理奖励发放
SM-->>VC : 确认奖励生效
VC->>Player : 显示奖励效果
图表来源
节来源
MissionHeroComp & MissionMonComp - 奖励触发器
这两个组件分别负责英雄和怪物的奖励触发条件监控。
flowchart TD
A[战斗开始] --> B{检查英雄状态}
B --> |英雄存活| C[继续战斗]
B --> |英雄死亡| D[战斗失败]
C --> E{检查怪物状态}
E --> |怪物存活| F[继续战斗]
E --> |怪物死亡| G[战斗胜利]
F --> H[更新战斗数据]
H --> B
G --> I[触发奖励生成]
I --> J[打开胜利界面]
J --> K[等待玩家选择]
D --> L[打开失败界面]
图表来源
节来源
奖励类型与配置
基础奖励配置
奖励系统基于Mission.ts中的FightSet枚举定义了各种奖励类型的基础配置:
| 奖励类型 | 配置值 | 描述 |
|---|---|---|
| ATK_ADD_COUNT | 4 | 伙伴攻击力增加数量 |
| ATK_ADD_GLOD | 1 | 金币增加数量 |
| CRIT_DAMAGE | 50 | 暴击伤害百分比 |
| DOUBLE_ATK_RATE | 100 | 额外攻击默认概率 |
| GREEN_GOLD | 1 | 绿色金币数量 |
| BLUE_GOLD | 2 | 蓝色金币数量 |
| PURPLE_GOLD | 3 | 紫色金币数量 |
| ORANGE_GOLD | 4 | 橙色金币数量 |
节来源
英雄属性系统
英雄属性系统通过HeroAttrs.ts定义了完整的属性体系:
graph LR
subgraph "基础属性"
HP[生命值 HP_MAX]
MP[魔法值 MP_MAX]
AP[攻击力 AP]
MAP[魔法攻击力 MAP]
end
subgraph "防御属性"
DEF[物理防御 DEF]
MDEF[魔法防御 MDEF]
SHIELD[护盾值 SHIELD_MAX]
end
subgraph "特殊属性"
SPEED[移动速度 SPEED]
DIS[攻击距离 DIS]
CRIT[暴击率 CRITICAL]
DODGE[闪避率 DODGE]
end
HP --> DEF
MP --> MDEF
AP --> CRIT
MAP --> CRIT
图表来源
节来源
天赋系统配置
天赋系统通过TalSet.ts定义了丰富的天赋效果:
| 天赋类型 | 示例 | 效果描述 |
|---|---|---|
| 等级类天赋 | 剑意提升 | 每升5级,攻击力增加10% |
| 攻击触发类 | 胡服骑射 | 每3次攻击,攻击速度增加5% |
| 受伤触发类 | 坚韧意志 | 每受伤3次,防御力增加2点 |
| 特定等级触发 | 兵圣之道 | 20级获得额外技能 |
节来源
三选一奖励机制
奖励生成算法
奖励系统采用基于权重的概率算法生成奖励选项:
flowchart TD
A[战斗胜利] --> B[计算基础权重]
B --> C[应用难度系数]
C --> D[生成奖励池]
D --> E{随机选择奖励}
E --> |奖励1| F[验证奖励有效性]
E --> |奖励2| F
E --> |奖励3| F
F --> G{奖励有效?}
G --> |是| H[添加到选项列表]
G --> |否| I[重新生成]
H --> J[返回三个奖励选项]
I --> E
图表来源
奖励权重调整
奖励权重系统根据以下因素动态调整:
- 游戏进度:随着关卡推进,奖励权重逐渐向高级奖励倾斜
- 英雄状态:根据当前英雄阵容和等级调整奖励偏好
- 玩家行为:记录玩家的选择历史,优化奖励推荐
- 随机事件:特殊事件可能临时改变奖励权重
节来源
战斗胜利与奖励选择
战斗胜利流程
战斗胜利后,系统按照以下流程处理奖励选择:
sequenceDiagram
participant Game as 游戏引擎
participant MC as MissionComp
participant VC as VictoryComp
participant SM as SingletonModule
participant UI as 用户界面
Game->>MC : 战斗结束事件
MC->>MC : 检查战斗结果
alt 战斗胜利
MC->>SM : 获取奖励数据
SM-->>MC : 返回奖励列表
MC->>VC : 打开胜利界面
VC->>UI : 显示奖励选项
UI->>VC : 玩家选择奖励
VC->>SM : 处理奖励发放
SM-->>VC : 确认奖励生效
VC->>Game : 关闭胜利界面
else 战斗失败
MC->>Game : 显示失败界面
end
图表来源
节来源
奖励选择界面
胜利界面提供直观的奖励选择功能:
- 奖励预览:每个奖励选项都有详细的属性说明
- 视觉反馈:通过图标和颜色区分不同类型的奖励
- 选择确认:提供明确的选择按钮和取消选项
- 即时反馈:选择后立即显示奖励效果
节来源
奖励触发条件
英雄奖励触发
英雄奖励通过MissionHeroComp监控英雄状态变化:
stateDiagram-v2
[*] --> 战斗准备
战斗准备 --> 英雄召唤 : Zhaohuan事件
英雄召唤 --> 战斗中 : FightReady事件
战斗中 --> 英雄存活 : 英雄未死亡
战斗中 --> 英雄死亡 : HeroDead事件
英雄存活 --> 战斗中 : 继续战斗
英雄死亡 --> 战斗失败 : 英雄全灭
战斗失败 --> [*]
图表来源
节来源
怪物奖励触发
怪物奖励通过MissionMonComp监控怪物击杀情况:
flowchart TD
A[怪物生成] --> B[怪物存活]
B --> C{怪物死亡?}
C --> |否| D[继续战斗]
C --> |是| E[更新怪物计数]
E --> F{还有怪物?}
F --> |是| B
F --> |否| G[战斗胜利]
D --> C
G --> H[触发奖励生成]
图表来源
节来源
事件奖励触发
特殊事件通过RogueConfig.ts定义的事件系统触发:
| 事件类型 | 概率 | 效果 |
|---|---|---|
| TREASURE | 40% | 增加50金币奖励 |
| TRAP | 20% | 对玩家造成伤害 |
| BUFF | 25% | 增加临时增益效果 |
| DEBUFF | 15% | 增加临时减益效果 |
节来源
数据绑定与UI展示
单例模块数据管理
SingletonModuleComp作为全局数据管理中心,维护奖励系统所需的所有数据:
classDiagram
class SingletonModuleComp {
+mission : MissionData
+vmdata : ViewData
+data : GameData
+guides : number[]
+current_guide : number
+openid : string
}
class MissionData {
+status : number
+play : boolean
+pause : boolean
+in_select : boolean
+in_fight : boolean
}
class ViewData {
+mission_data : MissionData
}
class GameData {
+gold : number
+diamond : number
+score : number
+mission : number
}
SingletonModuleComp --> MissionData
SingletonModuleComp --> ViewData
SingletonModuleComp --> GameData
图表来源
节来源
UI配置与界面管理
GameUIConfig.ts定义了奖励系统相关的界面配置:
| UI标识 | 预制件路径 | 层级 |
|---|---|---|
| Victory | gui/element/victory | UI层 |
| Loading | loading/prefab/loading | UI层 |
节来源
扩展新奖励类型
添加新奖励类型
要扩展新的奖励类型,需要修改以下文件:
- Mission.ts - 添加新的奖励配置常量
- HeroAttrs.ts - 定义新属性类型
- TalSet.ts - 添加新天赋效果
- RogueConfig.ts - 更新事件配置
奖励权重调整
通过修改FightSet枚举可以调整各类奖励的权重:
// 示例:增加高级奖励的权重
export enum FightSet {
// 高级奖励权重提升
PURPLE_GOLD = 5, // 紫色金币权重从3提升到5
ORANGE_GOLD = 8, // 橙色金币权重从4提升到8
// 中级奖励保持不变
BLUE_GOLD = 2,
GREEN_GOLD = 1,
}
自定义奖励算法
可以通过重写MissionComp中的do_reward方法来实现自定义奖励算法:
// 示例:基于英雄阵容的奖励算法
do_reward() {
// 获取当前英雄阵容
const heroes = this.getCurrentHeroes();
// 根据阵容特点调整奖励权重
const weightMap = this.calculateRewardWeights(heroes);
// 生成奖励选项
this.rewards = this.generateRewards(weightMap);
}
性能优化考虑
内存管理
奖励系统采用以下内存优化策略:
- 组件生命周期管理:及时销毁不需要的组件
- 数据缓存策略:缓存常用的奖励配置数据
- 事件监听优化:避免不必要的事件监听器
渲染优化
- 延迟加载:奖励界面按需加载资源
- 对象池:复用奖励预览对象
- 批量更新:合并UI更新操作
算法优化
- 权重计算缓存:缓存复杂的权重计算结果
- 随机数优化:使用高效的随机数生成算法
- 数据结构优化:使用合适的数据结构提高查找效率
故障排除指南
常见问题及解决方案
奖励不显示问题
症状:战斗胜利后没有显示奖励选项
原因分析:
- 奖励数据为空
- UI界面未正确打开
- 事件监听器未正确注册
解决方案:
// 检查奖励数据
if (!this.rewards || this.rewards.length === 0) {
console.error("奖励数据为空");
// 重新生成奖励
this.rewards = this.generateDefaultRewards();
}
// 确保UI正确打开
oops.gui.open(UIID.Victory, {
victory: true,
rewards: this.rewards,
game_data: this.game_data
});
奖励权重异常
症状:奖励权重分布不合理
原因分析:
- 权重配置错误
- 动态权重计算逻辑问题
- 随机数种子问题
解决方案:
// 验证权重配置
validateRewardWeights() {
const weights = Object.values(FightSet).filter(v => typeof v === 'number');
const sum = weights.reduce((a, b) => a + b, 0);
if (sum === 0) {
console.error("奖励权重总和为0");
// 使用默认权重
return this.getDefaultWeights();
}
return weights;
}
性能问题
症状:奖励生成过程卡顿
原因分析:
- 奖励算法复杂度过高
- 数据库查询频繁
- UI渲染过于复杂
解决方案:
// 优化奖励生成算法
async generateRewardsOptimized() {
// 使用Web Worker异步处理
const worker = new Worker('reward_worker.js');
worker.postMessage({
monsters: this.monsters,
heroes: this.heroes,
difficulty: this.difficulty
});
worker.onmessage = (e) => {
this.rewards = e.data;
this.displayRewards();
};
}
总结
奖励系统是本游戏的核心机制,通过精心设计的三选一奖励选择模式,为玩家提供了丰富的策略选择空间。系统采用模块化架构,各组件职责明确,通过事件驱动的方式实现松耦合设计。
主要特性
- 多样化奖励类型:涵盖属性提升、技能升级、装备获取等多个方面
- 策略性决策:玩家需要根据当前阵容和游戏进度做出最优选择
- 动态权重系统:奖励权重根据游戏进度和玩家状态动态调整
- 可视化反馈:清晰的奖励预览和效果展示
- 扩展性强:易于添加新的奖励类型和调整奖励权重
设计优势
- 平衡性:通过权重系统确保奖励的平衡性
- 可玩性:多样的奖励选项提供重玩价值
- 可维护性:模块化设计便于维护和扩展
- 性能优化:采用多种优化策略确保流畅运行
未来发展方向
- 智能推荐系统:基于玩家行为的奖励推荐
- 社交元素:好友间的奖励分享和比较
- 成就系统:与奖励系统结合的成就解锁
- 动态难度:根据玩家表现调整奖励难度
奖励系统的设计体现了游戏设计理念的核心思想:通过简单的机制创造复杂的策略深度,为玩家提供持续的游戏动力和成就感。