刷怪完成

This commit is contained in:
2025-08-12 15:54:56 +08:00
parent 61cbd6e7bd
commit 5dd354a86b
7 changed files with 465 additions and 1004 deletions

View File

@@ -90,27 +90,11 @@ export enum FightSet {
export const MissionData = {
gold:1000,//金币
score:0,//分数
refrsh_time:5, //刷新时间
refresh_gold:1,//刷新金币
call_gold:0,//召唤金币
add_gold:1,//金币增加
lucky_gold:1,//幸运金币
change_gold:0,//金币变化
back_gold:1,//返还金币
buff_back_gold:0,//额外返还金币
buff_add_gold:0,//额外增加金币
buff_refrsh_time:0,//额外刷新时间
buff_refresh_gold:0,//额外发现所需的金币
current_wave:0,
current_wave:1,
mon_num:0,//怪物数量
wave_time_num:0,//波次时间
in_fight:false,
fight_time:0,//战斗时间
equip_stone:0,//装备石
equip_stone_max:10,//装备石最大数量
skill_stone:0,//技能石
skill_stone_max:10,//技能石最大数量
refresh_count:5,//刷新次
}
export const HeroUI = {
uuid:0,

View File

@@ -1,4 +1,5 @@
import { v3 } from "cc"
import { FacSet } from "./BoxSet"
/**
* kind 1:烈焰 2:寒冰 3:自然 4:暗影 5:神圣
@@ -27,32 +28,23 @@ export enum HType {
remote = 1,
mage = 2,
}
export const getHeroList = ()=>{
return Masters
//fac:FacSet.HERO
export const getHeroList = (quality:number)=>{
return Object.values(HeroInfo).filter(item=>{
const facMatch = item.fac === FacSet.HERO;
const qualityMatch = quality === 0 || item.quality === quality;
return facMatch && qualityMatch;
}).map(item=>item.uuid)
}
//fac:FacSet.MON
export const getMonList = (quality:number)=>{
return Object.values(HeroInfo).filter(item=>{
const facMatch = item.fac === FacSet.MON;
const qualityMatch = quality === 0 || item.quality === quality;
return facMatch && qualityMatch;
}).map(item=>item.uuid)
}
export const getHeroListByCalled = (count:number,called:any[])=>{
let list=Masters
if(called.length==3){
list=called.map((item:any)=>item.uuid)
}
// 确保请求数量不超过可用卡牌数量
count = Math.min(count, list.length);
// 打乱数组顺序
const shuffled = [...list].sort(() => Math.random() - 0.5);
// 返回指定数量的卡牌
return shuffled.slice(0, count).map(uuid => ({
uuid
}));
}
export const HeroList = [5021,5022,5023,5024,5025,5026,5027,5028]
export const MonList = [5201,5202,5203,5204,5205,5206,5219,5220,5221,5222,5223,5224,5225,5226,5227]
export const Masters = [5001,5002,5005,5008,5009,5010,5011]
export const HeroPos={
0:{pos:v3(-290,0,0)},
@@ -73,193 +65,17 @@ export const MonSet = {
3:{pos:v3(340,0,0)},
4:{pos:v3(400,0,0)},
5:{pos:v3(460,0,0)},
6:{pos:v3(520,0,0)},
7:{pos:v3(440,0,0)},
8:{pos:v3(480,0,0)},
9:{pos:v3(520,0,0)},
10:{pos:v3(560,0,0)},
11:{pos:v3(830,0,0)},
12:{pos:v3(870,0,0)},
13:{pos:v3(910,0,0)},
14:{pos:v3(950,0,0)},
15:{pos:v3(990,0,0)},
16:{pos:v3(1030,0,0)},
17:{pos:v3(1070,0,0)},
18:{pos:v3(1110,0,0)},
19:{pos:v3(1150,0,0)},
20:{pos:v3(1190,0,0)},
21:{pos:v3(1230,0,0)},
22:{pos:v3(1270,0,0)},
23:{pos:v3(1310,0,0)},
24:{pos:v3(1350,0,0)},
25:{pos:v3(1390,0,0)},
26:{pos:v3(1430,0,0)},
27:{pos:v3(1470,0,0)},
28:{pos:v3(1510,0,0)},
29:{pos:v3(1550,0,0)},
30:{pos:v3(1590,0,0)},
31:{pos:v3(1630,0,0)},
}
// 经验值计算函数 - 复杂递增规律
// 基础经验值100
// 递增值每级递增10且递增值本身也会递增
// 公式:基础经验值 + 递增值累加
// 递增值规律第1级递增值=10第2级递增值=20第3级递增值=30...
export const getUpExp = (currentLevel: number): number => {
const baseExp = 100; // 基础经验值
let totalIncrement = 0;
// 计算从1级到当前等级的递增值累加
for (let level = 1; level < currentLevel; level++) {
totalIncrement += level * 10; // 每级的递增值 = 等级 * 10
}
return baseExp + totalIncrement;
};
// 获取从当前等级升级到目标等级所需的总经验值
export const getTotalUpExp = (currentLevel: number, targetLevel: number): number => {
let totalExp = 0;
for (let level = currentLevel; level < targetLevel; level++) {
totalExp += getUpExp(level);
}
return totalExp;
};
// 简化的升级属性增长计算
// 基于 HType 的攻击力增长配置
export const ApGrowthByType = {
[HType.warrior]: (baseAp: number) => Math.floor(baseAp * 0.05) + 3, // 战士:+5% + 3
[HType.remote]: (baseAp: number) => Math.floor(baseAp * 0.10) + 2, // 远程:+10% + 2
[HType.mage]: (baseAp: number) => Math.floor(baseAp * 0.15) + 1, // 法师:+15% + 1
};
// 基于 HType 的HP增长配置
export const HpGrowthByType = {
[HType.warrior]: (baseHp: number) => Math.floor(baseHp * 0.08) + 10, // 战士:+8% + 10
[HType.remote]: (baseHp: number) => Math.floor(baseHp * 0.05) + 5, // 远程:+5% + 5
[HType.mage]: (baseHp: number) => Math.floor(baseHp * 0.03) + 3, // 法师:+3% + 3
};
// 获取从1级升级到2级增加的攻击力
export const getUpAp = (heroId: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getUpAp] 英雄 ${heroId} 不存在`);
return 0;
}
const baseAp = heroInfo.ap;
const heroType = heroInfo.type;
const growthFunction = ApGrowthByType[heroType] || ApGrowthByType[HType.warrior];
return growthFunction(baseAp);
};
// 获取从1级升级到2级增加的HP
export const getUpHp = (heroId: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getUpHp] 英雄 ${heroId} 不存在`);
return 0;
}
const baseHp = heroInfo.hp;
const heroType = heroInfo.type;
const growthFunction = HpGrowthByType[heroType] || HpGrowthByType[HType.warrior];
return growthFunction(baseHp);
};
// 获取英雄在指定等级的总攻击力
export const getHeroTotalAp = (heroId: number, level: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getHeroTotalAp] 英雄 ${heroId} 不存在`);
return 0;
}
const baseAp = heroInfo.ap;
const heroType = heroInfo.type;
const growthFunction = ApGrowthByType[heroType] || ApGrowthByType[HType.warrior];
const levelUpAp = growthFunction(baseAp);
return baseAp + levelUpAp;
};
// 获取英雄在指定等级的总HP
export const getHeroTotalHp = (heroId: number, level: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getHeroTotalHp] 英雄 ${heroId} 不存在`);
return 0;
}
const baseHp = heroInfo.hp;
const heroType = heroInfo.type;
const growthFunction = HpGrowthByType[heroType] || HpGrowthByType[HType.warrior];
const levelUpHp = growthFunction(baseHp);
return baseHp + levelUpHp;
};
// 获取从当前等级升级到目标等级增加的攻击力
export const getApIncrease = (heroId: number, currentLevel: number, targetLevel: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getApIncrease] 英雄 ${heroId} 不存在`);
return 0;
}
const baseAp = heroInfo.ap;
const heroType = heroInfo.type;
const growthFunction = ApGrowthByType[heroType] || ApGrowthByType[HType.warrior];
return growthFunction(baseAp);
};
// 获取从当前等级升级到目标等级增加的HP
export const getHpIncrease = (heroId: number, currentLevel: number, targetLevel: number): number => {
const heroInfo = HeroInfo[heroId];
if (!heroInfo) {
console.warn(`[getHpIncrease] 英雄 ${heroId} 不存在`);
return 0;
}
const baseHp = heroInfo.hp;
const heroType = heroInfo.type;
const growthFunction = HpGrowthByType[heroType] || HpGrowthByType[HType.warrior];
return growthFunction(baseHp);
};
// 获取升级后的完整属性信息
export const getLevelUpStats = (heroId: number, currentLevel: number, targetLevel: number) => {
return {
apIncrease: getApIncrease(heroId, currentLevel, targetLevel),
hpIncrease: getHpIncrease(heroId, currentLevel, targetLevel),
newTotalAp: getHeroTotalAp(heroId, targetLevel),
newTotalHp: getHeroTotalHp(heroId, targetLevel)
};
};
// 根据英雄类型获取增长模式描述
export const getGrowthModeDescription = (heroType: HType): string => {
switch (heroType) {
case HType.warrior:
return "战士型AP固定增长为主每级+3+5%HP高增长每级+10+8%";
case HType.remote:
return "远程型AP平衡增长每级+2+10%HP中等增长每级+5+5%";
case HType.mage:
return "法师型AP百分比增长为主每级+1+15%HP低增长每级+3+3%";
default:
return "未知类型";
}
};
export const HeroInfo = {
//主将
5001:{uuid:5001,name:"火焰骑士",path:"hk1", quality:HQuality.BLUE,lv:1,kind:1,
5001:{uuid:5001,name:"火焰骑士",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:1,
type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6011,6020],
buff:[],info:"剑类专精,穿刺伤害额外+10%"},
5002:{uuid:5002,name:"hk1",path:"hk1", quality:HQuality.BLUE,lv:1,kind:1,
5002:{uuid:5002,name:"hk1",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:1,
type:HType.warrior,hp:100,ap:15,dis:100,cd:1,speed:150,skills:[6011,6004],
buff:[],info:"斧类专精,风怒概率增加10%"},
@@ -271,93 +87,93 @@ export const HeroInfo = {
// type:HType.warrior,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6010,6021,6001],
// buff:[],info:"刀类专精,易伤效果额外持续1次"},
5005:{uuid:5005,name:"ha1",path:"ha1", quality:HQuality.BLUE,lv:1,kind:2,
5005:{uuid:5005,name:"ha1",path:"ha1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6025,6031],
buff:[],info:"说明"},
5007:{uuid:5007,name:"mh1",path:"hmh1", quality:HQuality.BLUE,lv:1,kind:2,
5007:{uuid:5007,name:"mh1",path:"hmh1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6002,6002],
buff:[],info:"说明"},
5008:{uuid:5008,name:"mf1",path:"hmf1", quality:HQuality.BLUE,lv:1,kind:2,
5008:{uuid:5008,name:"mf1",path:"hmf1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6022,6029],
buff:[],info:"说明"},
5009:{uuid:5009,name:"风暴精灵",path:"hk1", quality:HQuality.BLUE,lv:1,kind:2,
5009:{uuid:5009,name:"风暴精灵",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6002,6002],
buff:[],info:"说明"},
5010:{uuid:5010,name:"战争祭祀",path:"hk1", quality:HQuality.BLUE,lv:1,kind:2,
5010:{uuid:5010,name:"战争祭祀",path:"hk1", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.mage,hp:100,ap:15,dis:400,cd:1.5,speed:100,skills:[6024,6002],
buff:[],info:"说明"},
5011:{uuid:5011,name:"ha2",path:"ha2", quality:HQuality.BLUE,lv:1,kind:2,
5011:{uuid:5011,name:"ha2",path:"ha2", fac:FacSet.HERO, quality:HQuality.BLUE,lv:1,kind:2,
type:HType.remote,hp:100,ap:15,dis:400,cd:1,speed:100,skills:[6003,6003],
buff:[],info:"说明"},
//怪物
5201:{uuid:5201,name:"兽人战士",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5202:{uuid:5202,name:"兽人刺客",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5202:{uuid:5202,name:"兽人刺客",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.remote,hp:20,ap:5,dis:350,cd:1,speed:100,skills:[6008],
buff:[],info:"普通怪物-战士型"},
5203:{uuid:5203,name:"兽人护卫",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5203:{uuid:5203,name:"兽人护卫",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5204:{uuid:5204,name:"石卫", path:"mo1",quality:HQuality.GREEN,lv:1,kind:1,
5204:{uuid:5204,name:"石卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010],
buff:[],info:"法师怪物-高伤害脆弱"},
5205:{uuid:5205,name:"土卫", path:"mo1",quality:HQuality.GREEN,lv:1,kind:1,
5205:{uuid:5205,name:"土卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010],
buff:[],info:"法师怪物-高伤害脆弱"},
5206:{uuid:5206,name:"树卫", path:"mo1",quality:HQuality.GREEN,lv:1,kind:1,
5206:{uuid:5206,name:"树卫", path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.mage,hp:18,ap:5,dis:90,cd:2.5,speed:100,skills:[6010],
buff:[],info:"法师怪物-高伤害脆弱"},
5219:{uuid:5219,name:"牛头战士",path:"mo1", quality:HQuality.GREEN,lv:2,kind:1,
5219:{uuid:5219,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:2,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5220:{uuid:5220,name:"牛头战士",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5220:{uuid:5220,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5221:{uuid:5221,name:"牛头战士",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5221:{uuid:5221,name:"牛头战士",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.remote,hp:20,ap:5,dis:350,cd:1.5,speed:100,skills:[6008],
buff:[],info:"普通怪物-战士型"},
5222:{uuid:5222,name:"独眼巨人",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5222:{uuid:5222,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5223:{uuid:5223,name:"独眼巨人",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5223:{uuid:5223,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.warrior,hp:25,ap:5,dis:90,cd:2,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5224:{uuid:5224,name:"独眼巨人",path:"mo1", quality:HQuality.GREEN,lv:1,kind:1,
5224:{uuid:5224,name:"独眼巨人",path:"mo1", fac:FacSet.MON, quality:HQuality.GREEN,lv:1,kind:1,
type:HType.remote,hp:20,ap:5,dis:350,cd:1.5,speed:100,skills:[6010],
buff:[],info:"普通怪物-战士型"},
5225:{uuid:5225,name:"精英独眼",path:"mo1", quality:HQuality.BLUE,lv:1,kind:1,
5225:{uuid:5225,name:"精英独眼",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1,
type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6006],
buff:[],info:"精英怪物-战士型"},
5226:{uuid:5226,name:"精英牛头",path:"mo1", quality:HQuality.BLUE,lv:1,kind:1,
5226:{uuid:5226,name:"精英牛头",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1,
type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6007],
buff:[],info:"精英怪物-战士型"},
5227:{uuid:5227,name:"精英兽人",path:"mo1", quality:HQuality.BLUE,lv:1,kind:1,
5227:{uuid:5227,name:"精英兽人",path:"mo1", fac:FacSet.MON, quality:HQuality.BLUE,lv:1,kind:1,
type:HType.warrior,hp:45,ap:12,dis:300,cd:2,speed:100,skills:[6008],
buff:[],info:"精英怪物-战士型"},

View File

@@ -86,7 +86,6 @@ export class Hero extends ecs.Entity {
hv.Attrs[BuffAttr.ATK_CD]=hv.cd=hero.cd
hv.Attrs[BuffAttr.HP_MAX]=hv.hp=hv.hp_max=hero.hp+info.hp
hv.Attrs[BuffAttr.AP]=hv.ap=hero.ap+info.ap;
hv.Attrs[BuffAttr.DEF]=hv.def=hero.def+info.def;
hero.buff.forEach((buff:any)=>{
hv.apply_buff(buff.type,buff.value)
})

View File

@@ -11,9 +11,6 @@ import { oops } from "db://oops-framework/core/Oops";
import { GameEvent } from "../common/config/GameEvent";
import { EquipSpecialAttr } from "../common/config/Equips";
import { FightSet, getExpDrops, getStoneDrops, TooltipTypes } from "../common/config/Mission";
import { getApIncrease, getHpIncrease, getUpExp, HeroInfo, HeroPos } from "../common/config/heroSet";
import { FriendModelComp } from "./FriendModel";
import { MasterModelComp } from "./MasterModel";
import { RandomManager } from "db://oops-framework/core/common/random/RandomManager";
import { EnhancementType } from "../common/config/LevelUp";
const { ccclass, property } = _decorator;
@@ -136,6 +133,7 @@ export class HeroViewComp extends CCComp {
start () {
this.as.idle()
this.BUFFCOMP=this.node.getComponent(BuffComp);
console.log("[HeroViewComp]:heroview"+this.hero_name,this.Attrs)
/** 方向 */
this.node.setScale(this.scale,1);
this.node.getChildByName("top").setScale(this.scale,1);
@@ -420,6 +418,7 @@ export class HeroViewComp extends CCComp {
if(is_crit) {
damage = Math.floor(damage * (1 + (FightSet.CRIT_DAMAGE+crit_d)/100))
}
console.log(this.hero_name+"[HeroViewComp]:heroview :damage|hp|hp_max",damage,this.hp,this.Attrs[BuffAttr.HP_MAX])
this.hp -= damage;
if(this.hp <= 0) {

View File

@@ -30,7 +30,7 @@ export class Monster extends ecs.Entity {
}
/** 加载角色 */
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001,is_boss:boolean=false,is_call:boolean=false,lv:number=1,rogueBuffData?: any[], rogueHp?: number, rogueAttack?: number) {
load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001,is_boss:boolean=false,is_call:boolean=false,lv:number=1,enhancement?: any, stageMultipliers?: any) {
scale=-1
let box_group=BoxSet.MONSTER
console.log("mon load",uuid)
@@ -45,7 +45,7 @@ export class Monster extends ecs.Entity {
const collider = node.getComponent(BoxCollider2D);
if (collider) collider.enabled = false; // 先禁用 // 延迟一帧启用碰撞体
node.setPosition(pos)
this.hero_init(uuid,node,scale,box_group,is_boss,is_call,lv,rogueBuffData,rogueHp,rogueAttack)
this.hero_init(uuid,node,scale,box_group,is_boss,is_call,lv,enhancement,stageMultipliers)
oops.message.dispatchEvent("monster_load",this)
// 初始化移动参数
@@ -60,7 +60,7 @@ export class Monster extends ecs.Entity {
node.parent = scene.entityLayer!.node!
node.setPosition(pos)
}
hero_init(uuid:number=1001,node:Node,scale:number=1,box_group=BoxSet.HERO,is_boss:boolean=false,is_call:boolean=false,lv:number=1,rogueBuffData?: any[], rogueHp?: number, rogueAttack?: number) {
hero_init(uuid:number=1001,node:Node,scale:number=1,box_group=BoxSet.HERO,is_boss:boolean=false,is_call:boolean=false,lv:number=1,enhancement?: any, stageMultipliers?: any) {
var hv = node.getComponent(HeroViewComp)!;
hv.hide_info()
// console.log("hero_init",buff)
@@ -79,30 +79,26 @@ export class Monster extends ecs.Entity {
// 初始化Attrs属性系统参考Hero.ts的实现
hv.Attrs = getBuffNum();
// 肉鸽模式使用固定数值,否则使用等级计算
if (rogueHp !== undefined && rogueAttack !== undefined) {
// 肉鸽模式:使用固定数值
hv.hp = hv.hp_max = rogueHp;
hv.ap = rogueAttack;
hv.ap_base = rogueAttack;
console.log(`[Monster-Rogue]: 怪物${hero.name} - 固定HP:${rogueHp}, 固定AP:${rogueAttack}`);
// 计算基础属性(使用关卡倍数)
const baseHp = hero.hp;
const baseAp = hero.ap;
// 应用关卡倍数
let finalHp = baseHp;
let finalAp = baseAp;
if (stageMultipliers) {
finalHp = Math.floor(baseHp * stageMultipliers.hp);
finalAp = Math.floor(baseAp * stageMultipliers.attack);
console.log(`[Monster]: 怪物${hero.name} 关卡倍数 - HP: ${baseHp} x ${stageMultipliers.hp.toFixed(2)} = ${finalHp}, AP: ${baseAp} x ${stageMultipliers.attack.toFixed(2)} = ${finalAp}`);
} else {
// 普通模式根据Design.md设计文档计算怪物等级属性
const baseHp = hero.hp;
const baseAp = hero.ap;
// 怪物属性随等级增长 (根据Design.md中的公式)
// HP增长: Math.floor(baseHp * (1 + (level-1) * 0.3))
// AP增长: Math.floor(baseAp * (1 + (level-1) * 0.25))
const levelHp = Math.floor(baseHp * (1 + (lv - 1) * 0.5));
const levelAp = Math.floor(baseAp * (1 + (lv - 1) * 0.1));
hv.hp = hv.hp_max = levelHp;
hv.ap = levelAp;
hv.ap_base = levelAp;
console.log(`[Monster]: 怪物${hero.name}(等级${lv}) - 基础HP:${baseHp}->等级HP:${levelHp}, 基础AP:${baseAp}->等级AP:${levelAp}`);
console.log(`[Monster]: 怪物${hero.name} 使用基础属性 - HP: ${finalHp}, AP: ${finalAp}`);
}
hv.hp = hv.hp_max = finalHp;
hv.ap = finalAp;
hv.ap_base = finalAp;
// 设置基础属性到Attrs系统
hv.Attrs[BuffAttr.SPEED] = hv.speed = hv.speed_base = hero.speed;
hv.Attrs[BuffAttr.DIS] = hv.dis = hero.dis;
@@ -116,11 +112,11 @@ export class Monster extends ecs.Entity {
hv.apply_buff(buff.type, buff.value);
})
// 处理肉鸽模式的词条Buff
if (rogueBuffData && rogueBuffData.length > 0) {
console.log(`[Monster]: 怪物${hero.name}应用肉鸽词条:`, rogueBuffData);
rogueBuffData.forEach((buff:any)=>{
hv.apply_buff(buff.type, buff.value);
// 处理肉鸽模式的增强属性
if (enhancement && enhancement.buffList && enhancement.buffList.length > 0) {
console.log(`[Monster]: 怪物${hero.name}应用增强属性:`, enhancement.buffList.map((buff: any) => `${buff.name}:+${buff.value}`));
enhancement.buffList.forEach((buff:any)=>{
hv.apply_buff(buff.buffType, buff.value);
})
}

View File

@@ -10,7 +10,14 @@ import { smc } from "../common/SingletonModuleComp";
import { GameEvent } from "../common/config/GameEvent";
import { oops } from "db://oops-framework/core/Oops";
// 导入肉鸽配置
import { getRogueWaveConfig, RogueConfig, RogueWaveType, AffixCountConfig, MonsterAffixConfig } from "./RogueConfig";
import {
generateStageConfig,
getStageMonsterConfigs,
getStageAllMultipliers,
MonsterType,
StageType,
getStageType
} from "./RogueConfig";
import { MonModelComp } from "../hero/MonModelComp";
const { ccclass, property } = _decorator;
@@ -18,16 +25,14 @@ const { ccclass, property } = _decorator;
/** 视图层对象 */
@ccclass('MissionMonCompComp')
@ecs.register('MissionMonComp', false)
export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩展支持词条
export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 使用新的RogueConfig格式
private monsterQueue: Array<{
uuid: number,
position: number,
isBoss: boolean,
type: MonsterType,
level: number,
affixes?: any[],
buffData?: any[], // 使用BuffAttr格式的buff数据
rogueHp?: number, // 肉鸽固定血量
rogueAttack?: number // 肉鸽固定攻击力
enhancement?: any, // 增强属性配置
stageMultipliers?: any // 关卡倍数配置
}> = [];
private isSpawning: boolean = false;// 是否正在生成怪物
private spawnInterval: number = 0.1; // 每个怪物生成间隔时间
@@ -49,7 +54,7 @@ export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩
}
fight_ready(){
console.log("[MissionMonComp]:fight_ready")
// console.log("[MissionMonComp]:fight_ready")
this.do_mon_wave()
}
@@ -68,7 +73,7 @@ export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩
this.isPausing = false;
this.spawnCount = 0;
this.spawnTimer = 0;
console.log("[MissionMonComp]: 暂停结束,继续召唤怪物");
// console.log("[MissionMonComp]: 暂停结束,继续召唤怪物");
}
return; // 暂停期间不召唤怪物
}
@@ -82,7 +87,7 @@ export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩
if (this.spawnCount >= 5) {
this.isPausing = true;
this.spawnTimer = 0; // 重置计时器用于暂停计时
console.log("[MissionMonComp]: 已召唤5只怪物开始暂停5秒");
// console.log("[MissionMonComp]: 已召唤5只怪物开始暂停5秒");
}
}
}
@@ -90,125 +95,101 @@ export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩
do_mon_wave(){
console.log("[MissionMonComp]:怪物登场,当前波次 :",smc.vmdata.mission_data.current_wave)
// console.log("[MissionMonComp]:怪物登场,当前关卡 :",smc.vmdata.mission_data.current_wave)
// 重置召唤相关状态
this.spawnCount = 0;
this.isPausing = false;
this.spawnTimer = 0;
const currentWave = smc.vmdata.mission_data.current_wave;
// 使用肉鸽模式配置
const rogueWaveConfig = getRogueWaveConfig(currentWave);
console.log(`[MissionMonComp]:肉鸽模式第${currentWave}波配置:`, rogueWaveConfig.description);
this.generateRogueMonstersFromConfig(rogueWaveConfig);
const currentStage = smc.vmdata.mission_data.current_wave;
// 使用新的肉鸽关卡配置
const stageType = getStageType(currentStage);
const monsterConfigs = getStageMonsterConfigs(currentStage);
console.log(`[MissionMonComp]:第${currentStage}关 - ${stageType}类型,怪物数量: ${monsterConfigs.length}`);
this.generateMonstersFromStageConfig(monsterConfigs);
}
// 根据肉鸽配置生成怪物(肉鸽模式)
private generateRogueMonstersFromConfig(rogueWaveConfig: any) {
const { monsters, waveType } = rogueWaveConfig;
const currentWave = smc.vmdata.mission_data.current_wave;
const monsterLevel = RogueConfig.getMonsterLevel(currentWave);
smc.vmdata.mission_data.mon_num=monsters.reduce((total: number, group: any) => total + group.count, 0);
// 固定9波模式所有波次都是战斗波次
console.log(`[MissionMonComp]:第${currentWave}波 - ${waveType}战斗波次`);
// 根据新的关卡配置生成怪物
private generateMonstersFromStageConfig(monsterConfigs: any[]) {
const currentStage = smc.vmdata.mission_data.current_wave;
if (!monsters || monsters.length === 0) {
console.warn(`[MissionMonComp]:肉鸽波次配置中没有怪物信息`);
// 设置怪物总数
smc.vmdata.mission_data.mon_num = monsterConfigs.length;
if (!monsterConfigs || monsterConfigs.length === 0) {
console.warn(`[MissionMonComp]:关卡${currentStage}配置中没有怪物信息`);
return;
}
monsters.forEach((monsterGroup: any) => {
const { uuid, count, affixes, enhancedStats, buffData, isBoss, rogueHp, rogueAttack } = monsterGroup;
// 为每个怪物配置生成怪物
monsterConfigs.forEach((monsterConfig: any, index: number) => {
const { uuid, type, enhancement, stageMultipliers } = monsterConfig;
// 为每个怪物组生成指定数量的怪物
for (let i = 0; i < count; i++) {
// 位置循环使用 (0-9)如果怪物数量超过10个位置则循环使用
const position = i % 5;
this.addToSpawnQueueWithAffixes(
uuid,
position,
isBoss || false,
monsterLevel,
affixes,
buffData, // 现在传递buffData而不是enhancedStats和specialEffects
rogueHp, // 传递固定血量
rogueAttack // 传递固定攻击力
);
}
// 位置循环使用 (0-4)
const position = index % 5;
this.addToStageSpawnQueue(
uuid,
position,
type,
1, // 默认等级1
enhancement,
stageMultipliers
);
});
const totalMonsters = monsters.reduce((total: number, group: any) => total + group.count, 0);
console.log(`[MissionMonComp]:肉鸽模式本波次将生成 ${totalMonsters} 只怪物,等级: ${monsterLevel}`);
console.log(`[MissionMonComp]:关卡${currentStage}将生成 ${monsterConfigs.length} 只怪物`);
// 输出词条信息
monsters.forEach((monsterGroup: any) => {
if (monsterGroup.buffData && monsterGroup.buffData.length > 0) {
console.log(`[MissionMonComp]:怪物 ${monsterGroup.uuid} 拥有词条:`, monsterGroup.buffData);
// 输出词条名称
monsterGroup.buffData.forEach((buff: any) => {
const config = MonsterAffixConfig[buff.buff_type];
if (config) {
console.log(`[MissionMonComp]: - ${config.name}: ${config.description}`);
}
});
// 输出增强属性信息
monsterConfigs.forEach((monsterConfig: any) => {
if (monsterConfig.enhancement && monsterConfig.enhancement.buffList.length > 0) {
console.log(`[MissionMonComp]:怪物 ${monsterConfig.uuid} (${monsterConfig.type}) 拥有增强属性:`,
monsterConfig.enhancement.buffList.map((buff: any) => `${buff.name}:+${buff.value}`));
}
});
}
// 新增:添加到刷怪队列 - 增加level参数普通模式
private addToSpawnQueue(uuid: number, position: number, isBoss: boolean = false, level: number = 1) {
this.monsterQueue.push({
uuid: uuid,
position: position,
isBoss: isBoss,
level: level
});
}
// 新增:添加到刷怪队列 - 支持词条(肉鸽模式)
private addToSpawnQueueWithAffixes(
// 添加到关卡刷怪队列 - 使用新的配置格式
private addToStageSpawnQueue(
uuid: number,
position: number,
isBoss: boolean = false,
type: MonsterType,
level: number = 1,
affixes?: any[],
buffData?: any[],
rogueHp?: number,
rogueAttack?: number
enhancement?: any,
stageMultipliers?: any
) {
this.monsterQueue.push({
uuid: uuid,
position: position,
isBoss: isBoss,
type: type,
level: level,
affixes: affixes,
buffData: buffData,
rogueHp: rogueHp,
rogueAttack: rogueAttack
enhancement: enhancement,
stageMultipliers: stageMultipliers
});
}
// 新增:从队列中生成下一个怪物 - 传递词条参数
// 从队列中生成下一个怪物 - 使用新的配置格式
private spawnNextMonster() {
if (this.monsterQueue.length === 0) return;
const monsterData = this.monsterQueue.shift();
if (monsterData) {
const isBoss = monsterData.type === MonsterType.BOSS;
this.addMonster(
monsterData.uuid,
monsterData.position,
monsterData.isBoss,
isBoss,
false,
monsterData.level,
monsterData.buffData,
monsterData.rogueHp,
monsterData.rogueAttack
monsterData.enhancement,
monsterData.stageMultipliers
);
// 增加召唤计数
this.spawnCount++;
console.log(`[MissionMonComp]: 召唤第${this.spawnCount}只怪物,剩余队列: ${this.monsterQueue.length}`);
console.log(`[MissionMonComp]: 召唤第${this.spawnCount}${monsterData.type}怪物,剩余队列: ${this.monsterQueue.length}`);
}
}
@@ -218,25 +199,25 @@ export class MissionMonCompComp extends CCComp { // 添加刷怪队列 - 扩
is_boss: boolean = false,
is_call: boolean = false,
lv: number = 1,
buffData?: any[],
rogueHp?: number,
rogueAttack?: number
enhancement?: any,
stageMultipliers?: any
) {
let mon = ecs.getEntity<Monster>(Monster);
let scale = -1;
let pos: Vec3 = v3(MonSet[i].pos);
// 生成怪物,传递词条buff数据和肉鸽固定数值
mon.load(pos, scale, uuid, is_boss, is_call, lv, buffData, rogueHp, rogueAttack);
// 生成怪物,传递增强属性和关卡倍数
mon.load(pos, scale, uuid, is_boss, is_call, lv, enhancement, stageMultipliers);
// 如果有词条buff数据,记录到控制台
if (buffData && buffData.length > 0) {
console.log(`[MissionMonComp]: 怪物 ${uuid} 获得肉鸽词条Buff:`, buffData);
// 如果有增强属性,记录到控制台
if (enhancement && enhancement.buffList && enhancement.buffList.length > 0) {
console.log(`[MissionMonComp]: 怪物 ${uuid} 获得增强属性:`,
enhancement.buffList.map((buff: any) => `${buff.name}:+${buff.value}`));
}
// 如果有肉鸽固定数值,记录到控制台
if (rogueHp !== undefined && rogueAttack !== undefined) {
console.log(`[MissionMonComp]: 怪物 ${uuid} 使用肉鸽固定数值 - HP: ${rogueHp}, 攻击: ${rogueAttack}`);
// 如果有关卡倍数,记录到控制台
if (stageMultipliers) {
console.log(`[MissionMonComp]: 怪物 ${uuid} 关卡倍数 - HP: x${stageMultipliers.hp.toFixed(2)}, 攻击: x${stageMultipliers.attack.toFixed(2)}`);
}
}
/** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */

File diff suppressed because it is too large Load Diff