|
|
|
|
@@ -39,7 +39,7 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
/** 是否正在消费召唤队列,防止并发处理 */
|
|
|
|
|
is_processing_queue:boolean=false
|
|
|
|
|
/** 召唤请求队列,保证召唤与合成串行 */
|
|
|
|
|
summon_queue:{ uuid: number; hero_lv: number; card_lv: number }[]=[]
|
|
|
|
|
summon_queue:{ uuid: number; hero_lv: number; pool_lv: number }[]=[]
|
|
|
|
|
/** 预留英雄列表 */
|
|
|
|
|
heros:any=[]
|
|
|
|
|
onLoad(){
|
|
|
|
|
@@ -87,18 +87,18 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
const payload = args ?? event;
|
|
|
|
|
const uuid = Number(payload?.uuid ?? 1001);
|
|
|
|
|
const hero_lv = Math.max(1, Number(payload?.hero_lv ?? 1));
|
|
|
|
|
const card_lv = Math.max(1, Number(payload?.pool_lv ?? 1));
|
|
|
|
|
this.summon_queue.push({ uuid, hero_lv, card_lv });
|
|
|
|
|
const pool_lv = Math.max(1, Number(payload?.pool_lv ?? 1));
|
|
|
|
|
this.summon_queue.push({ uuid, hero_lv, pool_lv });
|
|
|
|
|
this.processSummonQueue();
|
|
|
|
|
}
|
|
|
|
|
/** 添加英雄:固定出生点上方生成,再落至落点 */
|
|
|
|
|
private addHero(uuid:number=1001,hero_lv:number=1, card_lv:number=1) {
|
|
|
|
|
private addHero(uuid:number=1001,hero_lv:number=1, pool_lv:number=1) {
|
|
|
|
|
console.log("addHero uuid:",uuid)
|
|
|
|
|
let hero = ecs.getEntity<Hero>(Hero);
|
|
|
|
|
let scale = 1
|
|
|
|
|
const landingPos = this.resolveHeroLandingPos(uuid);
|
|
|
|
|
let spawnPos:Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0);
|
|
|
|
|
hero.load(spawnPos,scale,uuid,landingPos.y,hero_lv,card_lv);
|
|
|
|
|
hero.load(spawnPos,scale,uuid,landingPos.y,hero_lv,pool_lv);
|
|
|
|
|
return hero;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -117,8 +117,8 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 添加合成后的新英雄,并覆盖为聚合后的属性 */
|
|
|
|
|
private addMergedHero(uuid:number, hero_lv:number, card_lv:number, ap:number, hp_max:number): number {
|
|
|
|
|
const hero = this.addHero(uuid, hero_lv, card_lv);
|
|
|
|
|
private addMergedHero(uuid:number, hero_lv:number, pool_lv:number, ap:number, hp_max:number): number {
|
|
|
|
|
const hero = this.addHero(uuid, hero_lv, pool_lv);
|
|
|
|
|
const model = hero.get(HeroAttrsComp);
|
|
|
|
|
if (!model) return hero_lv;
|
|
|
|
|
model.ap = Math.max(0, ap);
|
|
|
|
|
@@ -186,7 +186,7 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
while (this.summon_queue.length > 0) {
|
|
|
|
|
const payload = this.summon_queue.shift();
|
|
|
|
|
if (!payload) continue;
|
|
|
|
|
await this.handleSingleSummon(payload.uuid, payload.hero_lv, payload.card_lv);
|
|
|
|
|
await this.handleSingleSummon(payload.uuid, payload.hero_lv, payload.pool_lv);
|
|
|
|
|
}
|
|
|
|
|
} finally {
|
|
|
|
|
this.is_processing_queue = false;
|
|
|
|
|
@@ -194,8 +194,8 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 处理单次召唤:先生成,再检测是否触发合成,再尝试链式合成 */
|
|
|
|
|
private async handleSingleSummon(uuid: number, hero_lv: number, card_lv: number = 1) {
|
|
|
|
|
this.addHero(uuid, hero_lv, card_lv);
|
|
|
|
|
private async handleSingleSummon(uuid: number, hero_lv: number, pool_lv: number = 1) {
|
|
|
|
|
this.addHero(uuid, hero_lv, pool_lv);
|
|
|
|
|
if (!this.canMergeLevel(hero_lv)) return;
|
|
|
|
|
const needCount = this.getMergeNeedCount();
|
|
|
|
|
const aliveHeroes = this.getAliveHeroes();
|
|
|
|
|
@@ -203,8 +203,8 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
if (mergeHeroes.length !== needCount) return;
|
|
|
|
|
this.is_merging = true;
|
|
|
|
|
try {
|
|
|
|
|
const mergedLv = await this.mergeGroupHeroes(mergeHeroes, uuid, hero_lv, card_lv);
|
|
|
|
|
await this.tryChainMerge(uuid, mergedLv, card_lv);
|
|
|
|
|
const mergedLv = await this.mergeGroupHeroes(mergeHeroes, uuid, hero_lv, pool_lv);
|
|
|
|
|
await this.tryChainMerge(uuid, mergedLv, pool_lv);
|
|
|
|
|
} finally {
|
|
|
|
|
this.is_merging = false;
|
|
|
|
|
}
|
|
|
|
|
@@ -258,7 +258,7 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 执行一次完整合成:聚合属性、销毁素材、播放特效、生成高一级英雄 */
|
|
|
|
|
private async mergeGroupHeroes(mergeHeroes: Hero[], uuid: number, hero_lv: number, card_lv: number): Promise<number> {
|
|
|
|
|
private async mergeGroupHeroes(mergeHeroes: Hero[], uuid: number, hero_lv: number, pool_lv: number): Promise<number> {
|
|
|
|
|
let sumAp = 0;
|
|
|
|
|
let sumHpMax = 0;
|
|
|
|
|
for (let i = 0; i < mergeHeroes.length; i++) {
|
|
|
|
|
@@ -271,11 +271,11 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
const spawnPos:Vec3 = v3(landingPos.x, landingPos.y + MissionHeroCompComp.HERO_DROP_HEIGHT, 0);
|
|
|
|
|
await this.mergeDestroyAtBirth(mergeHeroes, spawnPos);
|
|
|
|
|
await this.playMergeBoomFx(spawnPos);
|
|
|
|
|
return this.addMergedHero(uuid, Math.min(this.merge_max_lv, hero_lv + 1), card_lv, sumAp, sumHpMax);
|
|
|
|
|
return this.addMergedHero(uuid, Math.min(this.merge_max_lv, hero_lv + 1), pool_lv, sumAp, sumHpMax);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 链式合成:当前等级合成完成后,继续尝试更高等级,直到条件不满足 */
|
|
|
|
|
private async tryChainMerge(uuid: number, startLv: number, card_lv: number) {
|
|
|
|
|
private async tryChainMerge(uuid: number, startLv: number, pool_lv: number) {
|
|
|
|
|
let checkLv = Math.max(1, startLv);
|
|
|
|
|
const needCount = this.getMergeNeedCount();
|
|
|
|
|
let guard = 0;
|
|
|
|
|
@@ -293,7 +293,7 @@ export class MissionHeroCompComp extends CCComp {
|
|
|
|
|
if (mergeHeroes.length < needCount) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
checkLv = await this.mergeGroupHeroes(mergeHeroes, uuid, checkLv, card_lv);
|
|
|
|
|
checkLv = await this.mergeGroupHeroes(mergeHeroes, uuid, checkLv, pool_lv);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|