diff --git a/assets/script/game/map/MissionHeroComp.ts b/assets/script/game/map/MissionHeroComp.ts index ff81007c..c3e215a9 100644 --- a/assets/script/game/map/MissionHeroComp.ts +++ b/assets/script/game/map/MissionHeroComp.ts @@ -1,4 +1,4 @@ -import { _decorator, Node, resources, Sprite, SpriteAtlas, SpriteFrame, v3, Vec3 } from "cc"; +import { _decorator, v3, Vec3 } from "cc"; import { ecs } from "../../../../extensions/oops-plugin-framework/assets/libs/ecs/ECS"; import { CCComp } from "../../../../extensions/oops-plugin-framework/assets/module/common/CCComp"; import { Hero } from "../hero/Hero"; @@ -7,7 +7,9 @@ import { Timer } from "db://oops-framework/core/common/timer/Timer"; import { GameEvent } from "../common/config/GameEvent"; import { HeroPos } from "../common/config/heroSet"; import { oops } from "../../../../extensions/oops-plugin-framework/assets/core/Oops"; -const { ccclass, property } = _decorator; +import { HeroAttrsComp } from "../hero/HeroAttrsComp"; +import { FacSet } from "../common/config/GameSet"; +const { ccclass } = _decorator; /** 视图层对象 */ @ccclass('MissionHeroCompComp') @@ -37,7 +39,10 @@ export class MissionHeroCompComp extends CCComp { // this.test_call() } clear_heros(){ - + const heroes = this.getAliveHeroes(); + for (let i = 0; i < heroes.length; i++) { + heroes[i].destroy(); + } } fight_ready(){ smc.vmdata.mission_data.hero_num=0 @@ -51,7 +56,26 @@ export class MissionHeroCompComp extends CCComp { } private call_hero(event: string, args: any){ - this.addHero(args.uuid,args.hero_lv) + const uuid = Number(args?.uuid ?? 1001); + const hero_lv = Math.max(1, Number(args?.hero_lv ?? 1)); + const aliveHeroes = this.getAliveHeroes(); + const mergeHeroes = this.pickMergeHeroes(aliveHeroes, uuid, hero_lv); + if (mergeHeroes.length === 2) { + let sumAp = 0; + let sumHpMax = 0; + for (let i = 0; i < mergeHeroes.length; i++) { + const model = mergeHeroes[i].get(HeroAttrsComp); + if (!model) continue; + sumAp += model.ap; + sumHpMax += model.hp_max; + } + for (let i = 0; i < mergeHeroes.length; i++) { + mergeHeroes[i].destroy(); + } + this.addMergedHero(uuid, hero_lv + 1, sumAp, sumHpMax); + return; + } + this.addHero(uuid, hero_lv); } /** 添加英雄 */ private addHero(uuid:number=1001,hero_lv:number=1) { @@ -62,6 +86,42 @@ export class MissionHeroCompComp extends CCComp { let landingPos:Vec3 = HeroPos[hero_pos].pos; let spawnPos:Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0); hero.load(spawnPos,scale,uuid,landingPos.y,hero_lv); + return hero; + } + + private addMergedHero(uuid:number, hero_lv:number, ap:number, hp_max:number) { + const hero = this.addHero(uuid, hero_lv); + const model = hero.get(HeroAttrsComp); + if (!model) return; + model.ap = Math.max(0, ap); + model.hp_max = Math.max(1, hp_max); + model.hp = model.hp_max; + model.dirty_hp = true; + } + + private getAliveHeroes(): Hero[] { + const heroes: Hero[] = []; + ecs.query(ecs.allOf(HeroAttrsComp)).forEach((entity: ecs.Entity) => { + const model = entity.get(HeroAttrsComp); + if (!model) return; + if (model.fac !== FacSet.HERO) return; + if (model.is_dead) return; + heroes.push(entity as Hero); + }); + return heroes; + } + + private pickMergeHeroes(aliveHeroes: Hero[], uuid: number, hero_lv: number): Hero[] { + const mergeHeroes: Hero[] = []; + for (let i = 0; i < aliveHeroes.length; i++) { + const model = aliveHeroes[i].get(HeroAttrsComp); + if (!model) continue; + if (model.hero_uuid !== uuid) continue; + if (model.lv !== hero_lv) continue; + mergeHeroes.push(aliveHeroes[i]); + if (mergeHeroes.length === 2) break; + } + return mergeHeroes; }