feat: 实现角色经验获取与升级系统
- 在SingletonModuleComp中新增addExp方法,处理经验累积和升级逻辑 - 修改英雄初始等级从0调整为1,确保等级系统正常运作 - 在MissionComp中为不同怪物类型添加经验奖励计算 - 使用getLevelExp函数动态计算各级所需经验值 - 升级时触发GameEvent.CanUpdateLv事件通知其他模块
This commit is contained in:
@@ -112,7 +112,7 @@ export class SingletonModuleComp extends ecs.Comp {
|
||||
path:'',
|
||||
as:0,
|
||||
type:0,
|
||||
lv:0,
|
||||
lv:1,
|
||||
exp:0,
|
||||
exp_max:100,
|
||||
exp_pre:0,
|
||||
@@ -179,6 +179,40 @@ export class SingletonModuleComp extends ecs.Comp {
|
||||
console.log(`[SMC] 记录好友获取: ID=${id}, 次数=${this.vmdata.collection.friend.count}`);
|
||||
oops.message.dispatchEvent(GameEvent.UpdateCollection);
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加经验并处理升级逻辑
|
||||
* @param exp 获得的经验值
|
||||
*/
|
||||
addExp(exp: number) {
|
||||
if (exp <= 0) return;
|
||||
|
||||
const h = this.vmdata.hero;
|
||||
// 确保等级至少为1
|
||||
if (h.lv < 1) h.lv = 1;
|
||||
// 确保经验上限正确
|
||||
if (h.exp_max <= 0) h.exp_max = getLevelExp(h.lv);
|
||||
|
||||
h.exp += exp;
|
||||
|
||||
// 检查升级
|
||||
let isLevelUp = false;
|
||||
while (h.exp >= h.exp_max) {
|
||||
h.exp -= h.exp_max;
|
||||
h.lv++;
|
||||
isLevelUp = true;
|
||||
|
||||
// 更新下一级所需经验
|
||||
h.exp_max = getLevelExp(h.lv);
|
||||
|
||||
console.log(`[SMC] 升级! Lv.${h.lv - 1} -> Lv.${h.lv}, 下级所需: ${h.exp_max}`);
|
||||
}
|
||||
|
||||
if (isLevelUp) {
|
||||
// 发送升级事件
|
||||
oops.message.dispatchEvent(GameEvent.CanUpdateLv, { lv: h.lv });
|
||||
}
|
||||
}
|
||||
|
||||
vmAdd() {
|
||||
VM.add(this.vmdata, "data");
|
||||
|
||||
@@ -4,7 +4,7 @@ import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/modu
|
||||
import { smc } from "../common/SingletonModuleComp";
|
||||
import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops";
|
||||
import { HeroAttrsComp } from "../hero/HeroAttrsComp";
|
||||
import { MonsterCost, MonType, calculateMonsterGold } from "./RogueConfig";
|
||||
import { MonsterCost, MonType, calculateMonsterGold, getLevelExp } from "./RogueConfig";
|
||||
import { GameEvent } from "../common/config/GameEvent";
|
||||
import { HeroViewComp } from "../hero/HeroViewComp";
|
||||
import { UIID } from "../common/config/GameUIConfig";
|
||||
@@ -128,6 +128,22 @@ export class MissionComp extends CCComp {
|
||||
type = MonType.ELITE;
|
||||
}
|
||||
}
|
||||
|
||||
// 计算经验
|
||||
let exp = 10; // 基础经验
|
||||
switch (type) {
|
||||
case MonType.BOSS:
|
||||
exp = 200;
|
||||
break;
|
||||
case MonType.ELITE:
|
||||
exp = 50;
|
||||
break;
|
||||
default:
|
||||
exp = 10;
|
||||
break;
|
||||
}
|
||||
smc.addExp(exp);
|
||||
|
||||
this.cal_gold_reward(data, type);
|
||||
}
|
||||
}
|
||||
@@ -251,9 +267,9 @@ do_ad(){
|
||||
path:'',
|
||||
as:0,
|
||||
type:0,
|
||||
lv:0,
|
||||
lv:1,
|
||||
exp:0,
|
||||
exp_max:100,
|
||||
exp_max: getLevelExp(1),
|
||||
exp_pre:0,
|
||||
hp:50,
|
||||
hp_max:100,
|
||||
|
||||
Reference in New Issue
Block a user