import { _decorator, Component, Node, Prefab, instantiate, v3, tween, Widget } from 'cc'; import { DataSystem } from '../core/data/DataSystem'; import { GM } from '../launch/GM'; import { BattleData } from './BattleData'; import { LeaderSkillNode } from './LeaderSkillNode'; import { LeaderSkillShow } from './LeaderSkillShow'; import { Monster } from './Monster'; import { TakeAWalk, WalkDirection } from './TakeAWalk'; const { ccclass, property } = _decorator; @ccclass('LeaderSkill') export class LeaderSkill extends Component { @property({ type: Node, tooltip: "特效层级" }) layer: Node; @property({ type: Node, tooltip: "阻挡墙层级" }) wallLayer: Node; @property({ type: Node, tooltip: "战斗层" }) battleNode: Node; @property({ type: Node, tooltip: "背景层" }) bgNode: Node; @property({ type: Node, tooltip: "2倍背景层" }) d_bgNode: Node; @property({ type: [Prefab], tooltip: "技能预制体" }) prefabs: Array = []; @property({ type: Prefab, tooltip: "展示预制体" }) showPrefab: Prefab; @property({ type: Node, tooltip: "统帅特写层" }) leaderShow: Node; update() { DataSystem.watch(BattleData, "useLeaderSkill") && this.show(); } public show(): void { tween(this.battleNode).to(0.2, { scale: v3(2, 2, 1) }).call(() => { this.bgNode.active = !(this.d_bgNode.active = true); }).start(); let node = instantiate(this.showPrefab); node.setParent(this.leaderShow); node.getComponent(LeaderSkillShow).setData(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).heros.get(5).id, this.useLeaderSkill.bind(this)); } public async useLeaderSkill() { this.battleNode.setScale(v3(1, 1, 1)); this.bgNode.active = !(this.d_bgNode.active = false); // GM.addBattleLog(`使用统帅技能:` + JSON.stringify(DataSystem.getData(BattleData).useLeaderSkill)); switch (DataSystem.getData(BattleData).useLeaderSkill.id) { case 1: case 2: let tempMonsterArray = DataSystem.getData(BattleData)._monsters.concat(); for (let i = 0; i < tempMonsterArray.length; i++) { await this.createPrefabs(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).useLeaderSkill.lv, tempMonsterArray[i]); } break; case 3: let monster = DataSystem.getData(BattleData)._monsters.sort((a, b) => { if (a.getComponent(TakeAWalk).totleWalkFarme > b.getComponent(TakeAWalk).totleWalkFarme) { return -1; } return 1; }) this.createPrefabs(DataSystem.getData(BattleData).useLeaderSkill.id, DataSystem.getData(BattleData).useLeaderSkill.lv, monster[0]); break; } } private createPrefabs(id: number, lv: number, monster: Monster) { return new Promise(async (resolve: (data: any) => void) => { if (monster) { let node = instantiate(this.prefabs[id - 1]); if (id < 3) { node.setRotationFromEuler(v3(0, 0, 45)); node.setPosition(v3(monster.node.position.x + Math.cos(45) * 300, monster.node.position.y + Math.sin(45) + 300, 0)); } node.setParent(id == 3 && monster.getComponent(TakeAWalk).direction == WalkDirection.up ? this.wallLayer : this.layer); node.getComponent(LeaderSkillNode).setData(id, lv, monster); } this.scheduleOnce(() => { resolve(null); }, 0.1); }); } }