From 9dc1126dfed6a3f33c636f55a2869ed17bb9c51c Mon Sep 17 00:00:00 2001 From: panw Date: Wed, 29 Oct 2025 16:41:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=80=AA=E7=89=A9=E7=B3=BB=E7=BB=9F):=20?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=80=AA=E7=89=A9=E7=94=9F=E6=88=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=A4=9A=E7=A7=8D=E6=80=AA?= =?UTF-8?q?=E7=89=A9=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重构怪物生成系统,使用MonType枚举替代原有布尔标记 添加6种怪物类型配置和属性计算规则 修改关卡配置生成逻辑,支持精英/Boss波次 新增多种怪物配置并调整原有怪物属性 --- assets/script/game/common/config/heroSet.ts | 72 ++++++++- assets/script/game/hero/Mon.ts | 32 ++-- assets/script/game/map/MissionMonComp.ts | 115 +++++--------- assets/script/game/map/RogueConfig.ts | 157 +++++--------------- 4 files changed, 161 insertions(+), 215 deletions(-) diff --git a/assets/script/game/common/config/heroSet.ts b/assets/script/game/common/config/heroSet.ts index 655871f0..08bb3081 100644 --- a/assets/script/game/common/config/heroSet.ts +++ b/assets/script/game/common/config/heroSet.ts @@ -138,15 +138,79 @@ export const HeroInfo: Record = { //怪物 5201:{uuid:5201,name:"兽人战士",path:"mo1", fac:FacSet.MON, kind:1, - type:HType.warrior,lv:1,hp:25,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], + type:HType.warrior,lv:1,hp:30,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], buff:[],tal:[],info:"普通怪物-战士型"}, 5202:{uuid:5202,name:"兽人刺客",path:"mo1", fac:FacSet.MON, kind:1, - type:HType.remote,lv:1,hp:20,mp:100,map:10,def:5,mdef:0,ap:5,dis:350,speed:100,skills:[6005], + type:HType.remote,lv:1,hp:20,mp:100,map:10,def:5,mdef:0,ap:5,dis:350,speed:150,skills:[6005], buff:[],tal:[],info:"普通怪物-战士型"}, 5203:{uuid:5203,name:"兽人护卫",path:"mo1", fac:FacSet.MON, kind:1, - type:HType.warrior,lv:1,hp:25,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], + type:HType.warrior,lv:1,hp:60,mp:100,map:10,def:5,mdef:0,ap:5,dis:90,speed:100,skills:[6005], buff:[],tal:[],info:"普通怪物-战士型"}, - }; \ No newline at end of file + // 1. 基础近战型 + 5204:{uuid:5204,name:"蝙蝠",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.warrior,lv:1,hp:28,mp:100,map:10,def:2,mdef:0,ap:6,dis:90,speed:125,skills:[6005], + buff:[],tal:[],info:"基础近战型:直接向玩家移动,接触造成伤害;中速、低血、数量多"}, + + 5205:{uuid:5205,name:"骷髅",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.warrior,lv:1,hp:35,mp:100,map:10,def:3,mdef:0,ap:7,dis:90,speed:120,skills:[6005], + buff:[],tal:[],info:"基础近战型:直接向玩家移动,接触造成伤害;中速、低血、数量多"}, + + // 2. 快速突击型 + 5206:{uuid:5206,name:"石像鬼",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.assassin,lv:1,hp:26,mp:100,map:10,def:3,mdef:0,ap:8,dis:120,speed:180,skills:[6005], + buff:[],tal:[],info:"快速突击型:高速直线冲锋,接触伤害;高速、低血、成群出现"}, + + 5207:{uuid:5207,name:"快速骷髅",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.assassin,lv:1,hp:22,mp:100,map:10,def:2,mdef:0,ap:7,dis:120,speed:200,skills:[6005], + buff:[],tal:[],info:"快速突击型:高速直线冲锋,接触伤害;高速、低血、成群出现"}, + + // 3. 重型坦克型 + 5208:{uuid:5208,name:"大型骷髅",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.warrior,lv:1,hp:140,mp:100,map:10,def:10,mdef:0,ap:10,dis:90,speed:85,skills:[6005], + buff:[],tal:[],info:"重型坦克型:缓慢逼近,高血量,中等伤害"}, + + 5209:{uuid:5209,name:"树人",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.warrior,lv:1,hp:160,mp:100,map:10,def:12,mdef:0,ap:12,dis:90,speed:80,skills:[6005], + buff:[],tal:[],info:"重型坦克型:缓慢逼近,高血量,中等伤害"}, + + // 4. 远程骚扰型 + 5210:{uuid:5210,name:"骷髅弓手",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.remote,lv:1,hp:60,mp:100,map:8,def:4,mdef:0,ap:12,dis:450,speed:110,skills:[6005], + buff:[],tal:[],info:"远程骚扰型:保持距离发射箭矢,逼迫玩家走位"}, + + 5211:{uuid:5211,name:"法师骷髅",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.mage,lv:1,hp:55,mp:100,map:25,def:4,mdef:5,ap:10,dis:400,speed:105,skills:[6005], + buff:[],tal:[],info:"远程骚扰型:保持距离释放法术弹幕,逼迫玩家走位"}, + + // 5. 特殊机制型 + 5212:{uuid:5212,name:"炸弹骷髅",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.assassin,lv:1,hp:30,mp:100,map:10,def:3,mdef:0,ap:25,dis:100,speed:130,skills:[6005], + buff:[],tal:[],info:"特殊机制:接近玩家后自爆造成高额伤害,需优先击杀"}, + + // 6. 精英/BOSS型 + 5213:{uuid:5213,name:"亡灵领主(精英)",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.warrior,lv:3,hp:200,mp:100,map:20,def:10,mdef:5,ap:20,dis:100,speed:110,skills:[6005], + buff:[],tal:[],info:"精英/BOSS:高血量与独特机制,波次高潮与重要经验来源"}, + + // 5. 特殊机制扩展 + // 召唤师:持续召唤小怪(后续可在技能系统中实现 SType.zhaohuan) + 5214:{uuid:5214,name:"死灵法师(召唤师)",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.mage,lv:1,hp:90,mp:160,map:22,def:4,mdef:6,ap:8,dis:380,speed:100,skills:[6005], + buff:[],tal:[],info:"特殊机制:持续召唤小怪,需优先击杀"}, + + // 治疗者:为周围怪物回血(此处以提升治疗效果和生命回复为基础被动) + // Attrs.HEAL_EFFECT=5 (RATIO=1),Attrs.HP_REGEN=3 (VALUE=0) + 5215:{uuid:5215,name:"祭司(治疗者)",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.support,lv:1,hp:100,mp:160,map:18,def:5,mdef:8,ap:6,dis:350,speed:105,skills:[6005], + buff:[],tal:[],info:"特殊机制:为周围怪物提供治疗增益与持续回复"}, + + // 光环怪:为周围怪物提供增益(此处以Buff效果提升与移动速度提升为基础被动) + // Attrs.BUFF_UP=60 (RATIO=1),Attrs.SPEED=63 (RATIO=1) + 5216:{uuid:5216,name:"光环幽灵(光环怪)",path:"mo1", fac:FacSet.MON, kind:1, + type:HType.support,lv:1,hp:85,mp:140,map:15,def:4,mdef:7,ap:7,dis:350,speed:110,skills:[6005], + buff:[],tal:[],info:"特殊机制:为周围怪物提供增益光环,加速与增益效果强化"}, + + }; \ No newline at end of file diff --git a/assets/script/game/hero/Mon.ts b/assets/script/game/hero/Mon.ts index eaf20c56..3cfb987e 100644 --- a/assets/script/game/hero/Mon.ts +++ b/assets/script/game/hero/Mon.ts @@ -8,9 +8,10 @@ import { HeroInfo } from "../common/config/heroSet"; import { MonModelComp } from "./MonModelComp"; import { BattleMoveComp } from "../common/ecs/position/BattleMoveComp"; import { SkillConComp } from "./SkillConComp"; -import { SkillSet } from "../common/config/SkillSet"; +import { BuffConf, SkillSet } from "../common/config/SkillSet"; import { getNeAttrs, getAttrs ,Attrs} from "../common/config/HeroAttrs"; import { TalComp } from "./TalComp"; +import { getMonAttr, MonType } from "../map/RogueConfig"; /** 角色实体 */ @ecs.register(`Monster`) export class Monster extends ecs.Entity { @@ -34,7 +35,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, strengthMultiplier: number = 1.0) { + load(pos: Vec3 = Vec3.ZERO,scale:number = 1,uuid:number=1001,lv:number=1,monType:MonType=MonType.NORMAL, buffs: BuffConf[] = [],is_call=false) { scale=-1 let box_group=BoxSet.MONSTER // console.log("mon load",uuid) @@ -48,7 +49,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, strengthMultiplier) + this.hero_init(uuid,node,scale,box_group,lv,monType, buffs,is_call) oops.message.dispatchEvent("monster_load",this) // 初始化移动参数 @@ -59,7 +60,7 @@ export class Monster extends ecs.Entity { // console.log("[Mon] mission_data.mon_num:",smc.vmdata.mission_data.mon_num) } - hero_init(uuid:number=1001,node:Node,scale:number=1,box_group=BoxSet.HERO,is_boss:boolean=false,is_call:boolean=false, strengthMultiplier: number = 1.0) { + hero_init(uuid:number=1001,node:Node,scale:number=1,box_group=BoxSet.HERO,lv:number=1,monType:MonType=MonType.NORMAL,buffs: BuffConf[] = [],is_call=false) { var hv = node.getComponent(HeroViewComp)!; @@ -69,31 +70,28 @@ export class Monster extends ecs.Entity { hv.scale = scale; hv.fac = FacSet.MON; hv.type = hero.type; - hv.is_boss = is_boss; - if(!is_boss){ + hv.is_boss = monType==MonType.BOSS; + if(!hv.is_boss){ hv.is_kalami=true } hv.box_group = box_group; hv.hero_uuid= uuid; hv.hero_name= hero.name; - + const {hp,mp,ap,map,def,mdef}=getMonAttr(lv,uuid,monType) // 初始化基础属性,并根据强度倍率调整 - const baseHp = Math.floor(hero.hp * strengthMultiplier); - const baseAp = Math.floor(hero.ap * strengthMultiplier); - const baseDef = Math.floor(hero.def * strengthMultiplier); - + for(let i=0;i = []; private isSpawning: boolean = false;// 是否正在生成怪物 private spawnInterval: number = 0.1; // 每个怪物生成间隔时间 @@ -58,12 +56,12 @@ export class MissionMonCompComp extends CCComp { // 处理随机事件 if (this.currentEvent && !this.eventProcessed) { - this.processRandomEvent(); + this.eventProcessed = true; } // 处理刷怪队列 - if (this.monsterQueue.length > 0 && !this.isSpawning) { + if (this.MonQueue.length > 0 && !this.isSpawning) { this.spawnTimer += dt; // 检查是否需要暂停(每召唤5次后暂停5秒) @@ -100,64 +98,31 @@ export class MissionMonCompComp extends CCComp { this.spawnTimer = 0; this.eventProcessed = false; - const currentStage = smc.data.mission; + const cStage = smc.data.mission; // 使用新的肉鸽关卡配置 let level=smc.vmdata.mission_data.level - const stageType = getStageType(currentStage,level); - - // 检查是否为事件关卡 - if (stageType === "event") { - this.currentEvent = getRandomEvent(); - } else { - this.currentEvent = null; - } - - const monsterConfigs = getStageMonsterConfigs(currentStage,level); - // console.log(`[MissionMonComp]:第${currentStage}关 - ${stageType}类型,怪物数量: ${monsterConfigs.length}`); - this.generateMonstersFromStageConfig(monsterConfigs); + + + const monsConf = getStageMonConfigs(cStage); + // console.log(`[MissionMonComp]:第${cStage}关 - ${stageType}类型,怪物数量: ${monsConf.length}`); + this.generateMonsters(monsConf); } - // 处理随机事件 - private processRandomEvent() { - if (!this.currentEvent) return; - - switch (this.currentEvent) { - case EventType.TREASURE: - // 发送获得奖励事件 - smc.vmdata.mission_data.gold += 50; // 增加50金币 - // 可以触发UI提示 - // oops.message.dispatchEvent("event_treasure"); - break; - case EventType.TRAP: - // 对玩家造成伤害 - // 这里可以实现对玩家英雄造成伤害的逻辑 - // oops.message.dispatchEvent("event_trap"); - break; - case EventType.BUFF: - // 给玩家增加临时增益效果 - // oops.message.dispatchEvent("event_buff"); - break; - case EventType.DEBUFF: - // 给玩家增加临时减益效果 - // oops.message.dispatchEvent("event_debuff"); - break; - } - } - + // 根据新的关卡配置生成怪物 - private generateMonstersFromStageConfig(monsterConfigs: any[]) { - const currentStage = smc.data.mission; + private generateMonsters(monsConf: any[]) { + const cStage = smc.data.mission; // 设置怪物总数 - // console.log("[MissionMonComp] generateMonstersFromStageConfig",monsterConfigs) - if (!monsterConfigs || monsterConfigs.length === 0) { - console.warn(`[MissionMonComp]:关卡${currentStage}配置中没有怪物信息`); + // console.log("[MissionMonComp] generateMonsters",monsConf) + if (!monsConf || monsConf.length === 0) { + console.warn(`[MissionMonComp]:关卡${cStage}配置中没有怪物信息`); return; } // 为每个怪物配置生成怪物 - monsterConfigs.forEach((monsterConfig: any, index: number) => { - const { uuid, type, strengthMultiplier } = monsterConfig; + monsConf.forEach((mon: any, index: number) => { + const { uuid, type,level, buffs } = mon; // 位置循环使用 (0-4) const position = index % 5; @@ -166,70 +131,68 @@ export class MissionMonCompComp extends CCComp { uuid, position, type, - 1, // 默认等级1 - strengthMultiplier // 强度倍率 + level, // 默认等级1 + buffs // 强度倍率 ); }); - // console.log(`[MissionMonComp]:关卡${currentStage}将生成 ${monsterConfigs.length} 只怪物`); + // console.log(`[MissionMonComp]:关卡${cStage}将生成 ${monsConf.length} 只怪物`); } // 添加到关卡刷怪队列 - 使用新的配置格式 private addToStageSpawnQueue( uuid: number, position: number, - type: MonsterType, + type: MonType, level: number = 1, - strengthMultiplier: number = 1.0 + buffs: BuffConf[] = [] ) { - this.monsterQueue.push({ + this.MonQueue.push({ uuid: uuid, position: position, type: type, level: level, - strengthMultiplier: strengthMultiplier + buffs: buffs }); } // 从队列中生成下一个怪物 - 使用新的配置格式 private spawnNextMonster() { - if (this.monsterQueue.length === 0) return; + if (this.MonQueue.length === 0) return; - const monsterData = this.monsterQueue.shift(); + const monsterData = this.MonQueue.shift(); if (monsterData) { - const isBoss = monsterData.type === MonsterType.BOSS; - this.addMonster( monsterData.uuid, monsterData.position, - isBoss, - false, + monsterData.type, monsterData.level, - monsterData.strengthMultiplier + monsterData.buffs ); - // 增加召唤计数 this.spawnCount++; - // console.log(`[MissionMonComp]: 召唤第${this.spawnCount}只${monsterData.type}怪物,剩余队列: ${this.monsterQueue.length}`); + // console.log(`[MissionMonComp]: 召唤第${this.spawnCount}只${monsterData.type}怪物,剩余队列: ${this.MonQueue.length}`); } } private addMonster( uuid: number = 1001, i: number = 0, - is_boss: boolean = false, - is_call: boolean = false, + monType: MonType = MonType.NORMAL, lv: number = 1, - strengthMultiplier: number = 1.0 + buffs: BuffConf[] = [] + ) { let mon = ecs.getEntity(Monster); let scale = -1; let pos: Vec3 = v3(MonSet[i].pos); // 生成怪物 - mon.load(pos,scale,uuid,is_boss,is_call,strengthMultiplier); + mon.load(pos,scale,uuid,lv,monType,buffs); } + + /** 视图对象通过 ecs.Entity.remove(ModuleViewComp) 删除组件是触发组件处理自定义释放逻辑 */ reset() { // this.node.destroy(); diff --git a/assets/script/game/map/RogueConfig.ts b/assets/script/game/map/RogueConfig.ts index d7dae377..2e23b5e8 100644 --- a/assets/script/game/map/RogueConfig.ts +++ b/assets/script/game/map/RogueConfig.ts @@ -11,54 +11,28 @@ * @date 2025-10-19 */ -import { isModuleNamespaceObject } from "util/types"; import { getMonList, HeroInfo } from "../common/config/heroSet"; -import { NATIVE } from "cc/env"; import { BuffConf } from "../common/config/SkillSet"; // 精英怪物配置表 -export const EliteMons = [ 5201, 5202, 5203, - // 可以添加更多精英怪物UUID -]; +export const EliteMons = [ 5201, 5202, 5203, 5213 ]; // Boss怪物配置表 -export const BossMons = [ 5201, 5202, - // 可以添加更多Boss怪物UUID -]; -export enum IMons{ - ORC=1, - NATIVE=2, - ELF=3, -} +export const BossMons = [ 5201, 5202, ]; +export enum IMons{ ORC=1, HUMAN=2, ELF=3,} export const Mons={ [IMons.ORC]:[5201,5202], - [IMons.NATIVE]:[5201,5202], + [IMons.HUMAN]:[5201,5202], [IMons.ELF]:[5201,5202] } /** * 怪物类型枚举 */ -export enum MonType { - NORMAL = 0, // 普通怪物 - ELITE = 1, // 精英怪物 - BOSS = 2 // Boss怪物 -} +export enum MonType { NORMAL = 0, ELITE = 1, BOSS = 2 } +export const EliteStage =[5,10,15,20,25] +export const BossStage=[30,40,50,60,70,80,90,100] -/** - * 关卡类型枚举 - */ -export const EliteStage:any =(wave:number) => { - if(wave%5 == 0) return true - return false -} -export const BossStage:any =(wave:number) => { - if(wave%10 == 0) return true - return false -} -/** - * 随机事件类型枚举 - */ export enum EventType { TREASURE = 1, // 额外奖励 TRAP =2, // 陷阱伤害 @@ -71,6 +45,7 @@ export enum EventType { */ export const StageRule = { MonsNum: 5, // 关卡中默认怪物数量 + LimitMonNum: 10, // 30关以后是极限模式,怪物数量 /** 额外怪物出现概率(在固定5个怪物基础上,有概率多刷1个) */ extraMonsterRate: 0.3, // 30%概率出现第6个怪物 /** 事件怪物出现概率(5个怪物中有1个替换为事件怪) */ @@ -89,58 +64,56 @@ interface IMonsConfig { /** 怪物等级 */ level: number; // 怪物等级 /** 是否为精英怪物 */ - isElite?: boolean; // 是否为精英怪物 - /** 是否为Boss怪物 */ - isBoss?: boolean; // 是否为Boss怪物 + monType:MonType; } - -export enum MonAttrSet{ - HP_MAX=1.1, - AP=1.05, - MP=1.1, - DEF=1.05, - MDEF=1.05, - MAP=1.05, +export const MonAttrSet={ + [MonType.NORMAL]:{ HP_MAX:1.1, AP:1.05, MP:1.1, DEF:1.05, MDEF:1.05, MAP:1.05,}, + [MonType.ELITE]: { HP_MAX:2, AP:1.1, MP:1.1, DEF:1.1, MDEF:1.1, MAP:1.1,}, + [MonType.BOSS]: { HP_MAX:5, AP:2, MP:5, DEF:2, MDEF:2, MAP:2,}, } -export const getMonAttr=(lv:number,uuid:number)=>{ +export const MonBuffSet={ + +} + +export const getMonAttr=(lv:number,uuid:number,MonType:MonType)=>{ let mon=HeroInfo[uuid] - let hp=mon.hp*lv*MonAttrSet.HP_MAX - let mp=mon.mp*lv*MonAttrSet.MP - let ap=mon.ap*lv*MonAttrSet.AP - let map=mon.map*lv*MonAttrSet.MAP - let def=mon.def*lv*MonAttrSet.DEF - let mdef=mon.mdef*lv*MonAttrSet.MDEF + let hp=mon.hp*lv*MonAttrSet[MonType].HP_MAX + let mp=mon.mp*lv*MonAttrSet[MonType].MP + let ap=mon.ap*lv*MonAttrSet[MonType].AP + let map=mon.map*lv*MonAttrSet[MonType].MAP + let def=mon.def*lv*MonAttrSet[MonType].DEF + let mdef=mon.mdef*lv*MonAttrSet[MonType].MDEF return {hp:hp,mp:mp,ap:ap,map:map,def:def,mdef:mdef} } /** * 根据波次生成怪物配置 - * @param wave 当前波次 + * @param stage 当前波次 * @returns IMonsConfig数组 */ -export function getStageMonsterConfigs(wave: number): IMonsConfig[] { +export function getStageMonConfigs(stage: number): IMonsConfig[] { const monsterConfigs: IMonsConfig[] = []; // 确定基础怪物数量 let baseMonsterCount = StageRule.MonsNum; // 判断是否为Boss波次 - const isBossWave = BossStage(wave); + const isBossStage = BossStage.includes(stage); // 判断是否为精英波次 - const isEliteWave = EliteStage(wave); + const isEliteStage = EliteStage.includes(stage); // 如果是Boss波次,增加一个Boss怪物 - if (isBossWave) { + if (isBossStage) { // 从Boss怪物列表中随机选择一个 const bossUUID = BossMons[Math.floor(Math.random() * BossMons.length)] || 5201; monsterConfigs.push({ uuid: bossUUID, buff: [], - level: wave, // Boss等级等于波次 - isBoss: true + level: stage, // Boss等级等于波次 + monType: MonType.BOSS }); // Boss波次减少普通怪物数量 @@ -148,16 +121,16 @@ export function getStageMonsterConfigs(wave: number): IMonsConfig[] { } // 如果是精英波次,增加精英怪物 - if (isEliteWave) { + if (isEliteStage) { // 添加1-2个精英怪物 - const eliteCount = isBossWave ? 1 : Math.floor(Math.random() * 2) + 1; + const eliteCount = isBossStage ? 1 : Math.floor(Math.random() * 2) + 1; for (let i = 0; i < eliteCount; i++) { const eliteUUID = EliteMons[Math.floor(Math.random() * EliteMons.length)] || 5201; monsterConfigs.push({ uuid: eliteUUID, buff: [], - level: wave, // 精英等级等于波次 - isElite: true + level: stage, // 精英等级等于波次 + monType: MonType.ELITE }); } @@ -177,7 +150,8 @@ export function getStageMonsterConfigs(wave: number): IMonsConfig[] { monsterConfigs.push({ uuid: normalUUID, buff: [], - level: wave // 普通怪物等级等于波次 + level: stage, // 普通怪物等级等于波次 + monType: MonType.NORMAL }); } @@ -191,7 +165,8 @@ export function getStageMonsterConfigs(wave: number): IMonsConfig[] { monsterConfigs.push({ uuid: extraUUID, buff: [], - level: wave + level: stage, + monType: MonType.NORMAL }); } @@ -199,59 +174,5 @@ export function getStageMonsterConfigs(wave: number): IMonsConfig[] { } -/** - * 特殊属性类型枚举 - */ -export enum SpecialAttribute { - NONE = 0, // 无特殊属性 - FAST = 1, // 快速移动 - STRONG = 2, // 强力攻击 - TANKY = 3, // 高生命值 - REGENERATE = 4, // 生命恢复 - SHIELD = 5, // 护盾 - EXPLOSIVE = 6, // 爆炸伤害(死亡时) - VAMPIRE = 7 // 吸血 -} - -/** - * 特殊属性配置 - */ -export const SpecialAttributeConfig = { - [SpecialAttribute.FAST]: { - name: "疾行", - description: "移动速度提升50%", - effect: { speedMultiplier: 1.5 } - }, - [SpecialAttribute.STRONG]: { - name: "强力", - description: "攻击力提升30%", - effect: { attackMultiplier: 1.3 } - }, - [SpecialAttribute.TANKY]: { - name: "坦克", - description: "生命值提升50%", - effect: { hpMultiplier: 1.5 } - }, - [SpecialAttribute.REGENERATE]: { - name: "再生", - description: "每秒恢复最大生命值2%", - effect: { regenRate: 0.02 } - }, - [SpecialAttribute.SHIELD]: { - name: "护盾", - description: "拥有相当于30%最大生命值的护盾", - effect: { shieldRatio: 0.3 } - }, - [SpecialAttribute.EXPLOSIVE]: { - name: "爆炸", - description: "死亡时对周围造成范围伤害", - effect: { explosionDamageRatio: 0.5 } - }, - [SpecialAttribute.VAMPIRE]: { - name: "吸血", - description: "攻击时恢复造成伤害20%的生命值", - effect: { vampireRatio: 0.2 } - } -};