squidGame/tgx-games-client/assets/module_arean/scripts/GameScene/BattleView.ts

1897 lines
59 KiB
TypeScript

import {
_decorator,
Animation,
Button,
Color,
Component,
director,
instantiate,
Label,
Node,
Prefab,
ProgressBar,
RichText,
sp,
Sprite,
SpriteFrame,
Toggle,
tween,
Vec2,
Vec3
} from "cc";
import { AreanEvent, AreanNetMgr } from "../AreanNetMgr";
import { iAttribute, MsgAreanBattleReportPush, skillStatus } from "../../../module_basic/shared/protocols/public/arean/MsgAreanBattleReportPush";
import { areanMgr } from "../AreanManager";
import { RoleController } from "./GameItem/RoleController";
import { CardItem } from "./GameItem/CardItem";
import { MsgAreanGameStatusPush } from "../../../module_basic/shared/protocols/public/arean/MsgAreanGameStatusPush";
import {
heroAttributeType,
IAreanPlayer,
IAreanUserTreasure,
stage
} from "../../../module_basic/shared/protocols/public/arean/AreanTypeDef";
import { ModuleDef } from "../../../scripts/ModuleDef";
import { resLoader } from "../../../core_tgx/base/utils/ResLoader";
import TouchListener from "./GameItem/TouchListener";
import { EquipmentItem } from "./GameItem/EquipmentItem";
import { TreasureItem } from "./GameItem/TreasureItem";
import { tgxAudioMgr, tgxUIAlert } from "../../../core_tgx/tgx";
import { DetailView } from "db://assets/module_arean/scripts/GameScene/GameItem/DetailView";
import { MsgAreanStageReadyPush } from "db://assets/module_basic/shared/protocols/public/arean/MsgAreanStageReadyPush";
import { IAreanUserCard } from "db://assets/module_basic/shared/protocols/public/arean/AreanTypeDef";
import { CommonFun } from "db://assets/module_arean/scripts/CommonFun";
import { settlementView } from "./GameItem/settlementView";
import { EMusicDefine } from "db://assets/module_basic/Define/MusicDefine";
import { MsgAreanDanUpdatePush } from "db://assets/module_basic/shared/protocols/public/arean/MsgAreanDanUpdatePush";
import { MsgAreanGetBattleRewards } from "../../../module_basic/shared/protocols/public/arean/MsgAreanGetBattleRewards";
import { UserMgr } from "db://assets/module_basic/scripts/UserMgr";
import {
MsgAreanBattleRewardsPush
} from "../../../../../tgx-games-server/src/shared/protocols/public/arean/MsgAreanBattleRewardsPush";
const { ccclass, property } = _decorator;
@ccclass('BattleView')
export class BattleView extends Component {
@property({ type: Prefab })
roleItem: Prefab = null;
@property({ type: Prefab })
cardPrefab: Prefab = null;
@property({ type: Node })
bgWinNode: Node = null;
@property({ type: Node })
detailView: Node = null;
@property({ type: Node })
deadGroup: Node = null;
@property({ type: Node })
kongGroup: Node = null;
@property({ type: Node })
expNode: Node = null;
timerNode: Node = null;
@property({ type: Node })
equipmentNode: Node = null;
@property({ type: Node })
treasureNode: Node = null;
@property({ type: Node })
headIconNode: Node = null;
@property({ type: Node })
topUI: Node = null;
@property({ type: Node })
bottomUI: Node = null;
@property({ type: Label })
timerLabel: Label;
@property({ type: Label })
stageLabel: Label;
@property({ type: Label })
expValue: Label;
@property({ type: Label })
expLvl: Label;
@property({ type: Label })
curTurnLable: Label;
@property({ type: Node })
heroSkillNode: Node;
@property({ type: RichText })
heroSkillName: RichText;
@property({ type: RichText })
heroSkillDesc: RichText;
@property({ type: Sprite })
heroJobIcon: Sprite;
@property({ type: Sprite })
heroSkillIcon: Sprite;
@property({ type: Button })
btnRefresh: Button;
@property({ type: Label })
refreshCost: Label;
@property({ type: Button })
btnLock: Button;
@property({ type: Button })
btnLvlup: Button;
@property({ type: Label })
lvlupCost: Label;
@property({ type: Toggle })
btnPrepare: Toggle;
@property({ type: Toggle })
btnSolo: Toggle;
@property({ type: Node })
chooseCardView: Node = null;
@property({ type: Node })
chooseEquipmentView: Node = null;
@property({ type: Node })
chooseTreasureView: Node = null;
@property({ type: Node })
chooseJobView: Node = null;
@property({ type: Node })
jobList: Node = null;
@property({ type: Node })
cardList: Node = null;
@property({ type: Node })
equipmentList: Node = null;
@property({ type: Node })
treasureList: Node = null;
@property({ type: Node })
playerListNode: Node = null;
@property({ type: Node })
equipmentTip: Node = null;
@property({ type: Node })
skillPoolList: Node = null;
@property({ type: Node })
equipPoolList: Node = null;
@property({ type: Node })
lockNode: Node = null;
@property({ type: Node })
playerGold: Node;
@property({ type: Label })
playerName: Label;
@property({ type: Button })
btnHeadIcon: Button;
@property({ type: Node })
headIcon: Node = null;
@property({ type: Node })
roleLayer: Node = null;
@property({ type: Node })
effectLayer: Node = null;
@property({ type: Label })
rare0Probability: Label;
@property({ type: Label })
rare1Probability: Label;
@property({ type: Label })
rare2Probability: Label;
@property({ type: Button })
btnRefreshEquip: Button;
@property({ type: Button })
btnRefreshTreasure: Button;
@property({ type: Button })
btnExit: Button;
@property({ type: Button })
btnSurrender: Button;
@property({ type: Node })
stageTimer: Node = null;
@property({ type: Node })
attackPlayerNode: Node = null;
@property({ type: Node })
chooseCombo: Node = null;
@property({ type: Node })
btnCardList: Node = null;
@property({ type: Node })
btnETList: Node = null;
@property({ type: Node })
weatherNode: Node = null;
@property({ type: Node })
weatherEffectNode: Node = null;
chooseJobBool: boolean = false;
curTurn: number = 1; //当前回合数
curSeat: number = 0; //当前玩家座位号
battleIndex: number = 1; //当前战斗序号
battleReportNum: number = 0;
seatRole: { [key: string]: RoleController } = {};
roundTime: number = 0; //当前回合时间点
remainingTime: number = 0;
lockBool: boolean = false;
curStage: stage = stage.await;
dan: MsgAreanDanUpdatePush = null;
isPlayingReport: boolean = false;
speedUpStage: boolean = false;
timeScale: number = 1;
localPlayerId: number = null;
monsterTurn: number[] = [4, 8, 12, 16, 20];
groupsPos: Vec3[] = [new Vec3(-75, -25, 0), new Vec3(75, 5, 0), new Vec3(75, -65, 0), new Vec3(-75, 25, 0)];
isInit: boolean = false;
curExpLvl: number = 1;
// 当前播放的背景音乐
_curPlayBgm: string = "bgm_battle";
curChoosePlayer: number;
soloMode: boolean = false;
hasSettlement: boolean = false;
rankNum: number = 8;
curGroup: number = 0;
timeAdd: boolean;
warningNum: number = 0;
rewards: MsgAreanBattleRewardsPush = null;
start() {
areanMgr.BattleView = this;
console.log("储存的玩家数据", AreanNetMgr.inst.playerMap);
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_BATTLE, 1, ModuleDef.BASIC);
// AreanNetMgr.inst.sendMsg_ChooseHero(Math.floor(Math.random() * (1003 - 1001 + 1)) + 1001);
// let random = Math.floor(Math.random() * (1003 - 1001 + 1)) + 1001;
director.on(AreanEvent.BattleReportPush, this.initBattleGround, this);
director.on(AreanEvent.PlayerStatus, this.initPlayerStatus, this);
director.on(AreanEvent.BattleStagePush, this.refreshBattleStage, this);
director.on(AreanEvent.SelectCardList, this.SelectCardList, this);
director.on(AreanEvent.SelectCardBack, this.refreshCardBack, this);
director.on(AreanEvent.SelectEquipList, this.refreshEquipList, this);
director.on(AreanEvent.SelectTreasureList, this.refreshTreasureList, this);
director.on(AreanEvent.PlayerReady, this._updatePlayerReadyState, this);
director.on(AreanEvent.UpdateDan, this._updatePlayerDan, this);
director.on(AreanEvent.GetBattleRewards, this.getBattleRewards, this);
director.on(AreanEvent.UpdateBattleResult, this._updateRewards, this);
this._registerToggleClick();
}
protected onDestroy() {
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_HALL, 1, ModuleDef.BASIC);
}
// 刷新顶部玩家信息
private _updatePlayerInfo(index: number): void {
console.log("玩家信息 === ", AreanNetMgr.inst.playerMap, index)
if (AreanNetMgr.inst.playerMap) {
let curData = AreanNetMgr.inst.playerMap[index];
if (curData) {
// 新版本
let heroData = areanMgr.cfgMgr.HeroDatas.getData(curData.heroId);
let node = this.topUI.getChildByName("players").getChildByName("playerListBg");
// 金币数
let goldValue = node.getChildByPath("playerGold/value");
goldValue.getComponent(Label).string = `${curData.money}`;
// 血量
let hpValue = node.getChildByPath("hpValue");
hpValue.getComponent(Label).string = curData.bloodVolume + "/ 20";
// 玩家昵称
let nickName = node.getChildByName("nickName");
nickName.getComponent(Label).string = `${curData.nickname}`;
// 英雄等级
let heroLevel = node.getChildByName("levelBg").getChildByName("level");
heroLevel.getComponent(Label).string = `${curData.lv}`;
let skin = heroData.skinRes[0];
let skinId = areanMgr.cfgMgr.SkinData.getData(skin).icon
let spineNode = node.getChildByName("heroSpine");
resLoader.load<Prefab>(ModuleDef.Arean, `res/Prefebs/heroSpine/${skinId}`, (err: Error, prefab: Prefab) => {
if (err) {
console.error(err);
return;
} else {
let _spineNode = instantiate(prefab);
spineNode.destroyAllChildren();
spineNode.addChild(_spineNode);
}
})
// 英雄大招
let bigSKillNode = node.getChildByName("bigSkillBg");
let bigSkill = bigSKillNode.getChildByName("skillIcon");
let skillData = areanMgr.cfgMgr.SkillPerformanceDatas.getData(heroData.mainSkill[0]);
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/skill/${skillData.icon}`, ModuleDef.Arean);
if (sp) bigSkill.getComponent(Sprite).spriteFrame = sp;
let bigSkillName = bigSKillNode.getChildByName("skillName");
let str = skillData ? skillData.skillname : "";
bigSkillName.getComponent(Label).string = str;
let bigSkillDes = node.getChildByPath("bigSkillBg/skillDesc");
bigSkillDes.getComponent(Label).string = skillData.effectDescribe;
// 职业
let jobIcon = node.getChildByName("jobBg").getChildByName("jobIcon");
let jobData = areanMgr.cfgMgr.JobDatas.getData(curData.careerId);
console.log("jobData ==== ", jobData)
if (jobData) {
let jobIconSp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/skill/${jobData.occupationIcon}`, ModuleDef.Arean);
if (jobIconSp) jobIcon.getComponent(Sprite).spriteFrame = jobIconSp;
let jobName = node.getChildByName("jobName");
jobName.getComponent(Label).string = jobData.occupationName;
let jobDes = node.getChildByName("jobDes");
jobDes.getComponent(Label).string = jobData.occupationDescribe;
}
// 卡牌情况
let len = curData.cardList;
for (let i = 0; i < 3; i++) {
let cardData: IAreanUserCard = curData.cardList[i];
let cardNode = node.getChildByName(`cardNode_${i + 1}`);
cardNode.active = cardData !== null;
if (cardData) {
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/heroImg/${666}`, ModuleDef.Arean);
if (sp) cardNode.getComponent(Sprite).spriteFrame = sp;
let count = cardNode.getChildByName("count");
count.getComponent(Label).string = `${CommonFun.getInstance().CalCardCount(i + 1, curData.cardList)}`;
}
}
// 羁绊
let jiBanNode_1 = node.getChildByName("jiBan_1");
let jiBan = curData.sect;
for (const jiBanKey in jiBan) {
let jiBanData = jiBan[jiBanKey];
}
for (let i = 1; i < 13; i++) {
let node = jiBanNode_1.getChildByName(`item_${i}`);
let jiBanData = jiBan[i.toString()];
// let sp: SpriteFrame = resLoader.getSpriteFrame(`res/heroImg/${666}`, SpriteFrame, ModuleDef.Arean);
// if (sp) node.getComponent(Sprite).spriteFrame = sp;
let count = node.getChildByName("count");
count.getComponent(Label).string = `${jiBanData}`;
}
// 装备
let equipNode = node.getChildByName("equipNode");
let equipData = curData.equipList;
for (let i = 0; i < 4; i++) {
let node = equipNode.getChildByName(`item_${i + 1}`);
let equipId = equipData[i];
if (equipId) {
let equipLocalData = areanMgr.cfgMgr.EquipmentData.getData(equipId);
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/Equip/${equipLocalData.icon}`, ModuleDef.Arean);
if (sp) node.getComponent(Sprite).spriteFrame = sp;
let count = node.getChildByName("count");
count.getComponent(Label).string = "";
}
}
// 圣物
let relicNode = node.getChildByName("relicNode");
let relicData = curData.treasureList;
for (let i = 0; i < 2; i++) {
let node = relicNode.getChildByName(`item_${i + 1}`);
let data = relicData[i];
if (data) {
let localData = areanMgr.cfgMgr.TreasureDatas.getData(data.id);
let sp: SpriteFrame = resLoader.getSpriteFrame(`res/Image/Treasure/${localData.icon}`, ModuleDef.Arean);
if (sp) node.getComponent(Sprite).spriteFrame = sp;
let count = node.getChildByName("count");
count.getComponent(Label).string = "";
}
}
// 老版本
// let node = this.topUI.getChildByName("players");
//
// // 玩家昵称
// let playerName = node.getChildByName("name");
// playerName.getComponent(Label).string = curData.nickname;
// let heroData = areanMgr.cfgMgr.HeroDatas.getData(curData.heroId);
// // 英雄名字
// let heroName = node.getChildByName("name-001");
// heroName.getComponent(Label).string = heroData.name;
//
// // spine
// let spineNode = node.getChildByName("skin");
// let skin = heroData.skinRes[0];
// let skinId = areanMgr.cfgMgr.SkinData.getData(skin).icon
// resLoader.load<Prefab>(ModuleDef.Arean,`res/Prefebs/heroSpine/${skinId}`,(err: Error, prefab: Prefab) => {
// if(err){
// console.error(err);
// return;
// }else {
// let _spineNode = instantiate(prefab);
// spineNode.destroyAllChildren();
// spineNode.addChild(_spineNode);
// }
// })
// let playerDetail = node.getChildByName("playerDetail");
// let attr = curData.attr;
// // 生命
// let hp = playerDetail.getChildByName("Label");
// hp.getComponent(Label).string = `玩家生命:${attr.hp}/${attr.hp}`;
//
// // 胜利次数
// let victory = playerDetail.getChildByName("Label-001");
// victory.getComponent(Label).string = `胜利次数:${attr.hp}`;
//
// // 连续胜利次数
// let victory2 = playerDetail.getChildByName("Label-005");
// victory2.getComponent(Label).string = `连续胜利次数:${attr.hp}`;
//
// // 失败次数
// let fail = playerDetail.getChildByName("Label-002");
// fail.getComponent(Label).string = `失败次数:${attr.hp}`;
//
// // 连续胜利次数
// let fail2 = playerDetail.getChildByName("Label-006");
// fail2.getComponent(Label).string = `连续失败次数:${attr.hp}`;
//
// // 当前英雄
// let curHero = playerDetail.getChildByName("Label-003");
// curHero.getComponent(Label).string = `当前英雄:${heroData.name}`;
//
// // 当前职业
// let job = playerDetail.getChildByName("Label-004");
// job.getComponent(Label).string = `当前职业:???`;
//
// let content = node.getChildByName("ScrollView").getChildByName("view").getChildByName("content");
} else {
console.log("玩家信息为空", index);
}
}
}
// 重置准备状态
private _resetPlayerReadyState(): void {
for (let i = 0; i < 8; i++) {
let node = this.playerListNode.getChildByName(`player${i}`);
if (node) {
node.getChildByName("ready").active = false;
}
}
}
// 刷新顶部玩家准备信息
private _updatePlayerReadyState(data: MsgAreanStageReadyPush): void {
// let node = this.playerListNode.getChildByName("player" + index);
// console.log("玩家准备信息 === ",data)
if (data) {
this._resetPlayerReadyState();
let arr = data.readyStatus;
if (arr) {
let len = arr.length;
for (let i = 0; i < len; i++) {
let index = arr[i];
let node = this.playerListNode.getChildByName(`player${index}`);
if (node && AreanNetMgr.inst.playerMap[index].bloodVolume > 0) {
node.getChildByName("ready").active = true;
}
}
}
}
}
// 顶部8个玩家位置点击事件
private _registerToggleClick(): void {
for (let i = 0; i < 8; i++) {
let node = this.playerListNode.getChildByName("player" + i);
node.on("click", () => {
this.onClickShowPlayersDetail(i)
})
}
}
getBattleGroupPos() {
if (this.monsterTurn.indexOf(this.curTurn) != -1) {
this.groupsPos = [new Vec3(-0, -75, 0), new Vec3(0, 5, 0), new Vec3(0, -115, 0), new Vec3(0, 25, 0)];
}
else {
this.groupsPos = [new Vec3(-75, -75, 0), new Vec3(75, 5, 0), new Vec3(75, -115, 0), new Vec3(-75, 25, 0)];
}
return this.groupsPos;
}
getPrepareGroupPos() {
if (this.monsterTurn.indexOf(this.curTurn) != -1) {
this.groupsPos = [new Vec3(0, -75, 0), new Vec3(0, 5, 0), new Vec3(0, -115, 0), new Vec3(0, 25, 0)];
}
else {
this.groupsPos = [new Vec3(-175, -50, 0), new Vec3(175, 30, 0), new Vec3(175, -90, 0), new Vec3(-175, 50, 0)];
}
return this.groupsPos;
}
createRole(seatId: number, id: number) {
// console.log("seatId === ", seatId, id)
let role = instantiate(this.roleItem);
role.name = "player" + seatId;
this.kongGroup.addChild(role);
this.seatRole[seatId] = role.getComponent(RoleController);
this.seatRole[seatId].init(id);
let name = "无名氏";
if (this.seatRole[seatId].isMonster) {
name = areanMgr.cfgMgr.MonsterDatas.getData(id).name;
this.seatRole[seatId].hpManaNode1.setPosition(0, 300);
this.seatRole[seatId].bigName.node.setPosition(0, 360);
} else {
name = AreanNetMgr.inst.playerMap[seatId].nickname;
}
this.seatRole[seatId].roleName.string = name;
this.seatRole[seatId].bigName.string = name;
if (seatId == this.getLocalPlayerId()) {
this.seatRole[seatId].roleName.color = new Color(0, 255, 0);
this.seatRole[seatId].bigName.color = new Color(0, 255, 0);
}
}
update(dt: number): void {
if (!this.isInit && Object.keys(AreanNetMgr.inst.playerMap).length > 7) {
this.isInit = true;
this.initPlayerStatus();
}
if (this.curStage == stage.battle) {
if (AreanNetMgr.inst.gameData.curBattleReport.battleGround.round == this.curTurn) {
this.roundTime += dt;
this.playBattleReport();
}
if (parseInt(this.timerLabel.string) > 25 && this.speedUpStage) {
this.speedUpStage = false;
this.timeScale = 1;
director.getScheduler().setTimeScale(this.timeScale);
} else if (parseInt(this.timerLabel.string) <= 25 && !this.speedUpStage) {
this.speedUpStage = true;
this.timeScale = 2;
director.getScheduler().setTimeScale(this.timeScale);
}
} else if (this.speedUpStage) {
this.speedUpStage = false;
this.timeScale = 1;
director.getScheduler().setTimeScale(this.timeScale);
}
}
showHeroSkillDetail() {
if (this.heroSkillNode.position.y == -70) {
tween(this.heroSkillNode)
.to(0.2, { position: new Vec3(this.heroSkillNode.position.x, 240, 0) })
.start();
}
else if (this.heroSkillNode.position.y == 240) {
tween(this.heroSkillNode)
.to(0.2, { position: new Vec3(this.heroSkillNode.position.x, -70, 0) })
.start();
}
}
showWeatherDetail() {
if (this.weatherNode.position.x == 440) {
tween(this.weatherNode)
.to(0.2, { position: new Vec3(100, this.weatherNode.position.y, 0) })
.start();
}
else if (this.weatherNode.position.x == 100) {
tween(this.weatherNode)
.to(0.2, { position: new Vec3(440, this.weatherNode.position.y, 0) })
.start();
}
}
initBattleGround() {
let data = AreanNetMgr.inst.gameData.curBattleReport.battleGround;
this.battleReportNum = data.group.length;
this.weatherEffectNode.removeAllChildren();
if (data.weather > 0 && data.weather <= 4) {
this.weatherNode.active = true;
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/weather/weather" + data.weather, ModuleDef.Arean);
this.weatherNode.getChildByName("icon").getComponent(Sprite).spriteFrame = sp;
const path = 'res/Prefebs/weather/weather' + data.weather;
let effect: Prefab = resLoader.get(path, Prefab, ModuleDef.Arean);
let skillEffect = instantiate(effect);
this.weatherEffectNode.addChild(skillEffect);
let txt = "";
switch (data.weather) {
case 1:
txt = "烈日 能量回复提升,法强翻倍";
break;
case 2:
txt = "暴雨 攻击速度提升,攻击减半";
break;
case 3:
txt = "沙暴 每秒扣除一定生命值";
break;
case 4:
txt = "雪天 暴击与闪避的概率减半";
}
this.weatherNode.getChildByName("txt").getComponent(Label).string = txt;
}
else {
this.weatherNode.active = false;
}
for (let i = 0; i < data.group.length; i++) {
let group = data.group[i];
let role1 = this.seatRole[group.seat1];
if (!role1 || !role1.node) {
let heroId = AreanNetMgr.inst.playerMap[group.seat1].heroId
this.createRole(group.seat1, heroId);
role1 = this.seatRole[group.seat1];
}
role1.node.setParent(this.roleLayer.getChildByName("group" + i));
role1.refreshSkin(0);
role1.curGroup = i;
let role2 = this.seatRole[group.seat2];
if ((!role2 || !role2.node) && group.seat2 <= 7) {
let heroId = AreanNetMgr.inst.playerMap[group.seat2].heroId
this.createRole(group.seat2, heroId);
}
else if (group.seat2 > 7) {
let monsterId = areanMgr.cfgMgr.MonsterDatas.findMonsterIdsByWaveNumber(this.curTurn);
this.createRole(group.seat2, monsterId);
let skinID = areanMgr.cfgMgr.MonsterDatas.getData(monsterId).skinRes;
let imagePath = 'res/Spine/' + areanMgr.cfgMgr.SkinData.getData(skinID[0]).icon;
let spAsset: sp.SkeletonData = resLoader.get(imagePath, sp.SkeletonData, ModuleDef.Arean);
this.seatRole[group.seat2].skin.getComponent(sp.Skeleton).skeletonData = spAsset;
let name = areanMgr.cfgMgr.MonsterDatas.getData(monsterId).name;
this.seatRole[group.seat2].bigName.string = name;
this.seatRole[group.seat2].roleName.node.active = false;
this.checkSoloMode();
}
role2 = this.seatRole[group.seat2];
role2.node.setParent(this.roleLayer.getChildByName("group" + i));
role2.refreshSkin(1);
role2.curGroup = i;
if (group.seat1 == this.getLocalPlayerId() || group.seat2 == this.getLocalPlayerId()) this.curGroup = i;
}
if (data.emptyID != -1) {
if (!this.seatRole[data.emptyID] || !this.seatRole[data.emptyID].node) {
let heroId = AreanNetMgr.inst.playerMap[data.emptyID].heroId
this.createRole(data.emptyID, heroId);
}
this.seatRole[data.emptyID].node.setParent(this.kongGroup);
this.seatRole[data.emptyID].refreshSkin(1);
this.seatRole[data.emptyID].curGroup = -1;
this.battleIndex = 1;
}
this.checkSoloMode();
}
refreshRolesData() {
for (const seatId in this.seatRole) {
//this.seatRole[seatId].node.active = false;
if (this.seatRole[seatId].isMonster) {
this.seatRole[seatId].node.setParent(this.deadGroup);
continue;
}
if (AreanNetMgr.inst.playerMap[seatId].bloodVolume > 0) {
//this.seatRole[seatId].node.active = false;
this.seatRole[seatId].changeHp(10, 10, 0);
this.seatRole[seatId].changeMp(0, 1);
//this.seatRole[seatId].playAnimation("sp_idle", "sp_idle");
this.seatRole[seatId].node.setParent(this.kongGroup);
this.seatRole[seatId].node.setPosition(0, 0);
}
else {
this.seatRole[seatId].node.setParent(this.deadGroup);
let posY = this.seatRole[seatId].node.position.y + (Math.random() * 50 - 25);
this.seatRole[seatId].node.setPosition(this.seatRole[seatId].node.position.x, posY);
}
this.seatRole[seatId].curGroup = -1;
this.seatRole[seatId].changeHpBarType();
this.seatRole[seatId].effectsNode.removeAllChildren();
this.seatRole[seatId].textNode.removeAllChildren();
}
}
refreshBattleStage(data: MsgAreanGameStatusPush) {
//console.log("刷新阶段", data);
this.remainingTime = data.remainingTime;
this.timerLabel.string = data.remainingTime + "";
this.curTurn = data.battleRounds;
//this.stageTimer.active = data.remainingTime >=0;
//阶段开始
let stageLabel = this.stageLabel.string;
// data.stageId === stage.card ? tgxAudioMgr.inst.play(EMusicDefine.SMUSIC_BGM_SELECT_CARD,1,ModuleDef.BASIC) :
switch (data.stageId) {
case stage.career:
if (this.stageLabel.string != "选择职业") {
stageLabel = "选择职业";
if (this.getLocalPlayerData().bloodVolume > 0) {
this.refreshJobList(this.getLocalPlayerData().heroId);
}
}
break;
case stage.card:
if (this.stageLabel.string != "选择卡牌") {
stageLabel = "选择卡牌";
// if (this.node.getComponent(TouchListener).uiStage != 0) {
// if (this.node.getComponent(TouchListener).uiStage == 2) areanMgr.BattleView.onClickClosePlayersDetail();
// areanMgr.BattleView.onClickCloseDetail();
// }
if (this.getLocalPlayerData().bloodVolume > 0) {
this.refreshCardList();
this.moneyChange();
this.refreshSectList()
if (this._curPlayBgm !== 'bgm_select_card') {
this._curPlayBgm = 'bgm_select_card';
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_SELECT_CARD, 1, ModuleDef.BASIC);
}
}
this.btnSolo.isChecked = false;
this.btnSolo.node.active = false;
this.checkSoloMode();
this.chooseEquipmentView.active = false;
this.chooseTreasureView.active = false;
this.battleIndex = 1;
this.battleReportNum = 0;
this.node.getChildByName("bg").setPosition(0, 0, 0);
this.roleLayer.setPosition(0, 0, 0);
this.node.getChildByName("bg").getComponent(Animation).play("reBg");
this.kongGroup.active = false;
this.roleLayer.getChildByName("group0").setPosition(this.getPrepareGroupPos()[0]);
this.roleLayer.getChildByName("group1").setPosition(this.getPrepareGroupPos()[1]);
this.roleLayer.getChildByName("group2").setPosition(this.getPrepareGroupPos()[2]);
this.roleLayer.getChildByName("group3").setPosition(this.getPrepareGroupPos()[3]);
}
break;
case stage.battle:
if (this.stageLabel.string != "战斗阶段") {
stageLabel = "战斗阶段";
this.initBattleGround();
if (this._curPlayBgm !== 'bgm_battle') {
this._curPlayBgm = 'bgm_battle';
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_BATTLE, 1, ModuleDef.BASIC);
}
if (this.monsterTurn.indexOf(this.curTurn) != -1) {
this.btnSolo.isChecked = true;
this.btnSolo.node.active = false;
this.kongGroup.active = false;
}
else {
this.btnSolo.node.active = true;
this.btnSolo.isChecked = true;
if (this.kongGroup.children.length > 1) {
this.kongGroup.active = true;
this.kongGroup.children[1].active = true;
}
else {
this.kongGroup.active = false;
}
}
this.checkSoloMode();
// if (this.node.getComponent(TouchListener).uiStage != 1) {
// if (this.node.getComponent(TouchListener).uiStage == 2) areanMgr.BattleView.onClickClosePlayersDetail();
// areanMgr.BattleView.onClickShowDetail();
// }
this._resetPlayerReadyState();
this.roundTime = 0;
this.chooseCardView.active = false;
this.node.getChildByName("bg").getComponent(Animation).play("changeBg");
}
break;
case stage.equip:
if (this.stageLabel.string != "选择装备") {
stageLabel = "选择装备";
if (this.getLocalPlayerData().bloodVolume > 0) {
this.refreshEquipList(this.getLocalPlayerData().selectEquipList);
}
}
break;
case stage.treasure:
if (this.stageLabel.string != "选择圣物") {
stageLabel = "选择圣物";
this.btnETList.active = true;
if (this.getLocalPlayerData().bloodVolume > 0) {
this.refreshTreasureList(this.getLocalPlayerData().selectTreasureList);
}
}
break;
case stage.await:
break;
case stage.afterCard:
if (this.stageLabel.string != "即将开战") {
stageLabel = "即将开战";
this.btnPrepare.node.active = false;
this.btnRefresh.node.active = false;
this.btnLock.node.active = false;
this.btnLvlup.node.active = false;
if (this.getLocalPlayerData().bloodVolume > 0) {
if (parseInt(this.playerGold.getChildByName("value").getComponent(Label).string) > 0) {
this.chooseCardView.getComponent(Animation).play("moneyToExp");
setTimeout(() => {
this.moneyChange();
this.refreshExpLevel();
}, 500);
}
else {
this.chooseCardView.getComponent(Animation).play("hideChooseCard");
}
}
}
break;
default:
break;
}
//战斗结束
if (this.curStage == stage.battle && data.stageId != stage.battle) {
for (let i = 0; i < 8; i++) {
this.refreshPlayerRank(i);
}
if (!this.hasSettlement && (this.deadCount() >= 7 || this.getLocalPlayerData().bloodVolume <= 0)) {
this.showSettlementView(this.getLocalPlayerData().rank);
}
this.btnSolo.node.active = false;
this.kongGroup.active = false;
this.weatherNode.active = false;
this.refreshRolesData();
//this._updateAttr();
}
//选择职业结束
if (this.curStage == stage.career && data.stageId != stage.career && !this.chooseJobBool) {
let heroData = areanMgr.cfgMgr.HeroDatas.getData(this.getLocalPlayerData().heroId);
let jobPool = heroData.jobPool;
this.onClickChooseJob(0, jobPool[0], true);
}
this.curStage = data.stageId;
this.stageLabel.string = stageLabel;
this.curTurnLable.string = this.curTurn + "";
}
playBattleReport() {
let data = AreanNetMgr.inst.gameData.curBattleReport;
let index = 0;
let hpValue: number[] = [];
let lastKey: number | undefined;
const keys = Object.keys(data["log"]);
if (keys.length > 0) {
lastKey = Number(keys[keys.length - 1]);
}
for (const timePoint in data["log"]) {
index += 1;
//console.log(this.roundTime[i], lastKey + 3000, this.remainingTime * 1000);
if (this.roundTime <= ((lastKey + 3000) / 1000 - this.remainingTime - 1)) {
this.roundTime = ((lastKey + 3000) / 1000 - this.remainingTime);
}
if (this.roundTime * 1000 > parseInt(timePoint) && this.battleIndex == index) {
this.battleIndex++;
} else {
continue;
}
if (data["log"].hasOwnProperty(timePoint)) {
const herosReport = data["log"][timePoint];
for (const heroID in herosReport) {
if (herosReport.hasOwnProperty(heroID)) {
let hero = this.seatRole[heroID];
if (timePoint == "0") {
tween(hero.node.getParent())
.to(0.1, { position: new Vec3(this.getBattleGroupPos()[hero.curGroup].x, this.getBattleGroupPos()[hero.curGroup].y, 0) })
.start();
hero.playAnimation("appear", "sp_idle");
hero.node.active = true;
}
const event = herosReport[heroID];
const { attribute, skill, buff } = event;
if (skill && !this.timeAdd) {
for (const sk of skill) {
let skillTarget = this.seatRole[sk.target];
if (sk.value.type == 0) {
hero.useSkill(sk.id, sk.status == 3, skillTarget);
}
if (sk.value.type == 3) {
switch (sk.status) {
case skillStatus.hit:
//console.log("玩家" + heroID + "使用普通攻击对玩家" + heroTarget.id + "造成" + sk.value.x + "点伤害");
skillTarget.takeDamage(sk.value.y, false)
if (sk.value.y == 0) skillTarget.showBattleText("抵挡");
break;
case skillStatus.dodge:
//console.log("玩家" + heroTarget.id + "闪避了来自" + "玩家" + heroID + "的攻击");
skillTarget.showBattleText("闪避");
break;
case skillStatus.crit:
//console.log("玩家" + heroID + "使用普通攻击对玩家" + heroTarget.id + "造成" + sk.value.x + "点暴击伤害");
skillTarget.takeDamage(sk.value.y, true);
break;
case skillStatus.dodge:
//console.log("玩家" + heroTarget.id + "闪避了来自" + "玩家" + heroID + "的攻击");
hero.showBattleText("反伤");
break;
}
skillTarget.skillTakesEffect(sk.id);
}
if (sk.value.type == 5) {
skillTarget.takeHeal(sk.value.y);
}
if (sk.suck > 0) {
hero.takeHeal(sk.suck);
}
}
}
//buff效果
if (buff) {
for (const bf of buff) {
hero.buffList.push(bf.id);
}
}
// 属性效果
if (attribute) {
for (const attr of attribute) {
if (parseInt(heroID) == this.getLocalPlayerId()) this.updateAttrForReport(attr);
switch (attr.type) {
case heroAttributeType.hp:
hero.hp = attr.value;
hero.changeHp(hero.hp, hero.maxHp, null);
break;
case heroAttributeType.mp:
hero.mp = attr.value;
hero.changeMp(hero.mp, hero.maxMp);
break;
case heroAttributeType.maxHp:
hero.maxHp = attr.value;
if (timePoint == "0") hero.hp = hero.maxHp;
hero.changeHp(hero.hp, hero.maxHp, null);
break;
case heroAttributeType.maxMp:
hero.maxMp = attr.value;
if (timePoint == "0") hero.mp = hero.maxMp;
hero.changeMp(hero.mp, hero.maxMp);
break;
case heroAttributeType.shields:
hero.shields = attr.value;
hero.changeHp(hero.hp, hero.maxHp, hero.shields);
break;
case heroAttributeType.attack:
hero.attack = attr.value;
hero.changeAttack(hero.attack);
break;
}
}
if (hero.hp <= 0) {
hero.death();
if (!hero.isMonster) {
this.playerListNode.getChildByName("player" + heroID).getComponent(Animation).play("death");
hero.playAnimation("sp_death", "sp_idle");
this.refreshPlayerRank(parseInt(heroID)); //刷新排名
}
}
}
hpValue.push(hero.hp / hero.maxHp);
}
}
}
// let offset = (hpValue[0] - hpValue[1]) * 50
// if (offset) {
// tween(this.roleLayer.getChildByName("group" + i))
// .to(0.1, { position: new Vec3(this.getBattleGroupPos()[i].x + offset, this.getBattleGroupPos()[i].y, 0) })
// .start();
// }
let curGroupNode = this.roleLayer.getChildByName("group" + this.curGroup);
if (this.soloMode) {
let pos = new Vec3(curGroupNode.position.x * -4, curGroupNode.position.y * -4)
tween(this.node.getChildByName("bg"))
.to(0.2, { position: pos })
.start();
}
else {
tween(this.node.getChildByName("bg"))
.to(0.2, { position: new Vec3(0, 0) })
.start();
}
break;
}
for (const seatId in this.seatRole) {
if (this.seatRole[seatId].buffList.length > 0) {
this.seatRole[seatId].AddBuff();
this.seatRole[seatId].AddDeBuff();
this.seatRole[seatId].buffList = [];
this.seatRole[seatId].debuffList = [];
}
}
}
updataRefreshButton() {
if (this.getLocalPlayerData().freeRefreshTime == 0) {
this.btnRefresh.node.getChildByName("CostCoin").active = true;
this.btnRefresh.node.getChildByName("Free").active = false;
}
else {
this.btnRefresh.node.getChildByName("CostCoin").active = false;
this.btnRefresh.node.getChildByName("Free").active = true;
}
}
refreshCardBack() {
let data = this.getLocalPlayerData().selectCardList;
for (let i = 0; i < 3; i++) {
let cardData = data[i];
let cardItem = this.cardList.children[i];
cardItem.getComponent(CardItem).mask.active = cardData.purchase;
}
this.moneyChange();
this.refreshSectList();
// setTimeout(() => {
// this.moneyChange();
// this.refreshSectList();
// }, 1000);
}
moneyChange(cost?: number) {
let targetMoney = this.getLocalPlayerData().money;
let oldValue = parseInt(this.playerGold.getChildByName("value").getComponent(Label).string);
if (cost) targetMoney = oldValue - cost;
if (oldValue == targetMoney) return;
this.playerGold.getChildByName("value").getComponent(Label).string = targetMoney + "";
for (let coinNum = 1; coinNum <= 10; coinNum++) {
this.playerGold.getChildByPath("costBg/coin" + coinNum).active = coinNum <= this.getLocalPlayerData().moneyMax;
}
for (let coinNum = 1; coinNum <= 10; coinNum++) {
setTimeout(() => {
let node = this.playerGold.getChildByPath("costBg/coin" + coinNum + "/coin");
if (coinNum <= targetMoney && coinNum > oldValue) {
node.getComponent(Animation).play("getCoin");
}
else if (coinNum > targetMoney && coinNum <= oldValue) {
node.getComponent(Animation).play("costCoin");
}
}, (coinNum - 1) * 150);
}
this.playerGold.getChildByName("kong").active = targetMoney == 0;
}
getBattleRewards(data: MsgAreanGetBattleRewards) {
for (let i = 0; i < data.cardList.length; i++) {
let id = data.cardList[i].id;
let cardData = areanMgr.cfgMgr.CardDatas.getData(id);
let color = cardData.cardRare == 1 ? "<color=#5CB7FF>" : cardData.cardRare == 2 ? "<color=#B15CFF>" : "<color=FF765C>"
this.playwarning("角斗士得到了训练——" + color + cardData.mainName + "</color>");
}
if (data.exp > 0) {
this.playwarning("角斗士经验<color=#5CFF83>" + "+" + data.exp + "</color>");
}
if (data.freeRefreshTime > 0) {
this.playwarning("免费刷新次数<color=#5CFF83>" + "+" + data.freeRefreshTime + "</color>");
}
if (data.money > 0) {
this.playwarning("金币<color=#5CFF83>" + "+" + data.money + "</color>");
}
if (data.maxMoney > 0) {
this.playwarning(",每回合金币上限<color=#5CFF83>" + "+" + data.maxMoney + "</color>");
}
}
SelectCardList() {
this.refreshCardList();
}
refreshCardList() {
this.chooseCardView.getComponent(Animation).play("newCard");
let data = AreanNetMgr.inst.playerMap[this.getLocalPlayerId()].selectCardList;
this.refreshExpLevel();
this.chooseCardView.active = true;
this.moneyChange();
this.btnLvlup.node.active = true;
this.btnRefresh.node.active = true;
this.btnLock.node.active = true;
this.btnPrepare.node.active = true;
this.btnPrepare.isChecked = false;
this.updataRefreshButton();
for (let i = 0; i < data.length; i++) {
let card = data[i];
let cardItem = this.cardList.children[i];
cardItem.active = true;
cardItem.getComponent(CardItem).setData(card);
let index = i;
cardItem.off("click");
cardItem.on("click", () => {
if (this.getLocalPlayerData().money < card.cost) {
this.playwarning("金币不足");
} else {
AreanNetMgr.inst.sendMsg_SelectCard(index);
// let cardData = areanMgr.cfgMgr.CardDatas.getData(data[index].id);
// for (let j = 0; j < cardData.Sect.length; j++) {
// if (cardData.Sect[j] == 0) break;
// this.getLocalPlayerData().sect[cardData.Sect[j]] += cardData.cardRare;
// this.getLocalPlayerData().money -= card.cost;
// }
// this.moneyChange();
// this.refreshSectList();
// this._updateEquipOrTreasureList();
}
})
}
}
private _refreshEquipList(data: number[], isCustom: boolean = false): void {
this.btnRefreshEquip.interactable = false;
this.btnRefreshEquip.node.getChildByName("zhunbei").getComponent(Label).string = "已刷新";
this.btnRefreshTreasure.node.getChildByName("Sprite").getComponent(Sprite).color = new Color(150, 150, 150, 255);
this.refreshEquipList(data, isCustom);
}
refreshEquipList(data: number[], isCustom: boolean = false) {
if (!isCustom) {
this.btnRefreshEquip.interactable = true;
this.btnRefreshEquip.node.getChildByName("zhunbei").getComponent(Label).string = "刷新";
this.btnRefreshEquip.node.getChildByName("Sprite").getComponent(Sprite).color = new Color(255, 255, 255, 255);
}
this.stageLabel.string = "选择装备";
this.chooseEquipmentView.active = true;
if (this._curPlayBgm !== 'bgm_select_card') {
this._curPlayBgm = 'bgm_select_card';
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_SELECT_CARD, 1, ModuleDef.BASIC);
}
this.chooseEquipmentView.getComponent(Animation).play("newEquipment");
for (let i = 0; i < this.equipmentList.children.length; i++) {
this.equipmentList.children[i].getComponent(Button).interactable = true;
this.equipmentList.children[i].getComponent(Sprite).color = new Color(255, 255, 255, 255);
}
for (let i = 0; i < data.length; i++) {
let id = data[i];
let cardItem = this.equipmentList.children[i];
cardItem.active = true;
cardItem.getComponent(EquipmentItem).setData(id);
let index = i;
cardItem.off("click");
cardItem.on("click", () => {
AreanNetMgr.inst.sendMsg_SelectEquip(index);
for (let i = 0; i < this.equipmentList.children.length; i++) {
this.equipmentList.children[i].getComponent(Button).interactable = false;
this.equipmentList.children[i].getComponent(Sprite).color = new Color(150, 150, 150, 255);
}
cardItem.getComponent(Sprite).color = new Color(255, 255, 255, 255);
})
}
}
private _refreshTreasureList(data: IAreanUserTreasure[], isCustom: boolean = false): void {
this.btnRefreshTreasure.interactable = false;
this.btnRefreshTreasure.node.getChildByName("zhunbei").getComponent(Label).string = "已刷新";
this.btnRefreshTreasure.node.getChildByName("Sprite").getComponent(Sprite).color = new Color(150, 150, 150, 255);
this.refreshTreasureList(data, isCustom)
}
refreshTreasureList(data: IAreanUserTreasure[], isCustom: boolean = false) {
if (!isCustom) {
this.btnRefreshTreasure.interactable = true;
this.btnRefreshTreasure.node.getChildByName("zhunbei").getComponent(Label).string = "刷新";
this.btnRefreshTreasure.node.getChildByName("Sprite").getComponent(Sprite).color = new Color(255, 255, 255, 255);
}
this.stageLabel.string = "选择圣物";
this.chooseTreasureView.active = true;
if (this._curPlayBgm !== 'bgm_select_card') {
this._curPlayBgm = 'bgm_select_card';
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_SELECT_CARD, 1, ModuleDef.BASIC);
}
this.chooseTreasureView.getComponent(Animation).play("newTreasure");
for (let i = 0; i < this.treasureList.children.length; i++) {
this.treasureList.children[i].getComponent(Button).interactable = true;
this.treasureList.children[i].getComponent(Sprite).color = new Color(255, 255, 255, 255);
}
for (let i = 0; i < data.length; i++) {
let d = data[i];
let cardItem = this.treasureList.children[i];
cardItem.active = true;
cardItem.getComponent(TreasureItem).setData(d.id);
let index = i;
cardItem.off("click");
cardItem.on("click", () => {
AreanNetMgr.inst.sendMsg_SelectTreasure(index);
for (let i = 0; i < this.treasureList.children.length; i++) {
this.treasureList.children[i].getComponent(Button).interactable = false;
this.treasureList.children[i].getComponent(Sprite).color = new Color(150, 150, 150, 255);
}
cardItem.getComponent(Sprite).color = new Color(255, 255, 255, 255);
})
}
}
refreshJobList(heroId: number) {
this.node.getComponent(Animation).play("showJobView");
this.chooseJobView.active = true;
let heroData = areanMgr.cfgMgr.HeroDatas.getData(heroId);
let jobPool = heroData.jobPool;
for (let i = 0; i < 3; i++) {
let jobData = areanMgr.cfgMgr.JobDatas.getData(jobPool[i]);
let jobItem = this.jobList.children[i];
jobItem.active = true;
jobItem.getChildByName("name").getComponent(Label).string = jobData.occupationName;
jobItem.getChildByName("cardDesc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(jobData.occupationDescribe);
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/skill/" + jobData.occupationIcon, ModuleDef.Arean);
if (sp) jobItem.getChildByPath("cardBg/mask/cardIcon").getComponent(Sprite).spriteFrame = sp;
let index = i;
jobItem.on("click", () => {
this.onClickChooseJob(index, jobPool[index], true);
this.playwarning("你成为了" + jobData.occupationName);
})
}
}
onClickChooseJob(index: number, jobId: number, send: boolean = false) {
{
for (let i = 0; i < 3; i++) {
if (i != index) {
this.jobList.children[i].active = false;
}
}
let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/icon/" + areanMgr.cfgMgr.JobDatas.getData(jobId).occupationIcon, ModuleDef.Arean);
if (sp) this.heroJobIcon.spriteFrame = sp;
this.node.getComponent(Animation).play("chooseJob");
if (send) {
setTimeout(() => {
AreanNetMgr.inst.sendMsg_SelectCareer(jobId);
//console.log("当前玩家的信息 === ", AreanNetMgr.inst._playerMap)
this.getLocalPlayerData().careerId = jobId;
this.chooseJobBool = true;
this.detailView.getComponent(DetailView).updateJobDetail(jobId);
}, 1000);
}
}
}
// 获取玩家座位号
getLocalPlayerData(): IAreanPlayer {
let data = AreanNetMgr.inst.selfPlayer;
//console.log("当前玩家的信息 === ", data)
return data;
// for (const index of Object.keys(data)) {
// let element = data[index];
// if (element.uid === UserMgr.inst.uid) {
// this.curChoosePlayer = parseInt(index);
// return element;
// }
// }
}
getLocalPlayerId() {
// let data = AreanNetMgr.inst.playerMap;
// for (const index of Object.keys(data)) {
// let element = data[index];
// if (element.uid === UserMgr.inst.uid) {
// return parseInt(index);
// }
// }
return AreanNetMgr.inst.selfPlayer.playerId;
}
async initPlayerStatus() {
//首次获得玩家数据
let data = AreanNetMgr.inst.playerMap;
this.node.getComponent(Animation).play("beginGame");
this.detailView.getComponent(DetailView).init(this.getLocalPlayerData().heroId);
for (const seatId of Object.keys(data)) {
if (parseInt(seatId) > 7) continue;
this.playerListNode.getChildByName("player" + seatId).getComponent(Animation).play("roleIn");
let skin = areanMgr.cfgMgr.SkinData.getData(areanMgr.cfgMgr.HeroDatas.getData(data[seatId].heroId).skinRes[0]).icon;
let imagePath = 'res/Spine/' + skin;
let spAsset: sp.SkeletonData = resLoader.get(imagePath, sp.SkeletonData, ModuleDef.Arean);
let spineAnimation = this.playerListNode.getChildByPath("player" + seatId + "/Node/monsterHeadIcon/skin").getComponent(sp.Skeleton);
spineAnimation.skeletonData = spAsset;
if (parseInt(seatId) == this.getLocalPlayerId()) {
this.playerListNode.getChildByPath("player" + seatId + "/Node/monsterHeadIcon/localBg").active = true;
}
await new Promise(resolve => setTimeout(resolve, 100));
}
setTimeout(() => {
for (const key of Object.keys(data)) {
if (parseInt(key) > 7) continue;
let spineAnimation = this.playerListNode.getChildByPath("player" + key + "/Node/monsterHeadIcon/skin").getComponent(sp.Skeleton);
spineAnimation.setAnimation(0, "idle", true);
this.refreshPlayerRank(parseInt(key));
}
}, 1000);
let heroData = areanMgr.cfgMgr.HeroDatas.getData(data[this.getLocalPlayerId()].heroId);
let SkillPerformanceData = areanMgr.cfgMgr.SkillPerformanceDatas.getData(heroData.mainSkill[0]);
let sf: SpriteFrame = resLoader.getSpriteFrame("res/Image/skill/" + SkillPerformanceData.icon, ModuleDef.Arean);
if (sf) this.heroSkillIcon.spriteFrame = sf;
this.heroSkillName.string = SkillPerformanceData.skillname;
this.heroSkillDesc.string = CommonFun.getInstance().HighlightNumbers(SkillPerformanceData.effectDescribe);
let skin = areanMgr.cfgMgr.SkinData.getData(heroData.skinRes[0]).icon;
let imagePath = 'res/Spine/' + skin;
let spAsset: sp.SkeletonData = resLoader.get(imagePath, sp.SkeletonData, ModuleDef.Arean);
this.headIconNode.getChildByName("spine").getComponent(sp.Skeleton).skeletonData = spAsset;
this.playerName.string = this.getLocalPlayerData().nickname;
this.btnETList.active = this.getLocalPlayerData().treasureList.length > 0;
this.lockBool = this.getLocalPlayerData().listLock;
this._updateSectAttr();
this.detailView.getComponent(DetailView).updateEquipAndTreasure(this.getLocalPlayerData());
}
// 刷新羁绊
public _updateSectAttr(): void {
this.detailView.getComponent(DetailView).updateSect();
}
// 根据战报刷新属性
private updateAttrForReport(data: iAttribute): void {
this.detailView.getComponent(DetailView).updateAttrForReport(data);
}
refreshExpLevel() {
let level = this.getLocalPlayerData().lv;
let expValue = this.getLocalPlayerData().exp;
let data = areanMgr.cfgMgr.LevelDatas.getData(level);
let nextLvData = null;
if (level < 5) {
nextLvData = areanMgr.cfgMgr.LevelDatas.getData(level + 1);
this.expValue.string = expValue + "/" + nextLvData.experience;
tween(this.expNode.getComponent(ProgressBar))
.to(0.3, { progress: expValue / nextLvData.experience })
.start();
}
this.expLvl.string = level + "";
if (level != this.curExpLvl) {
this.curExpLvl = level;
this.rare0Probability.string = data.corProbability[0] + "%";
this.rare1Probability.string = data.corProbability[1] + "%";
this.rare2Probability.string = data.corProbability[2] + "%";
this.expNode.getComponent(Animation).play("showLvlup");
//满级特殊处理
if (level == 5) {
this.expValue.string = "MAX";
this.btnLvlup.node.active = false;
this.expNode.getComponent(ProgressBar).progress = 1;
}
}
}
refreshSectList() {
let sect = this.getLocalPlayerData().sect;
for (const index of Object.keys(sect)) {
let label = this.skillPoolList.getChildByPath("sect" + index + "/value").getComponent(Label);
let value = sect[index];
// let max = 5;
// if (value >= 5) max = 10;
// if (value >= 10) max = 20;
// label.string = value + "/" + max;
let max: number = (value >= 10) ? 20 : (value >= 5) ? 10 : 5;
label.string = `${value}/${max}`;
}
// for (const index of Object.keys(this.getLocalPlayerData().sect)) {
// let node = this.skillPoolList.getChildByPath("sect" + index);
// let value = this.getLocalPlayerData().sect[index];
// for (let i = 1; i <= 5; i++) {
// if (i <= value) {
// node.getChildByName("item" + i).getComponent(Sprite).color = new Color(255, 255, 255, 255);
// }
// else {
// node.getChildByName("item" + i).getComponent(Sprite).color = new Color(255, 255, 255, 128);
// }
// }
// }
// let value = 0;
// let allTypeValue = 0;
// let sect = this.getLocalPlayerData().sect;
// let node = this.chooseCombo.getChildByPath("choosetypeLIst");
// for (let i = value; i < node.children.length; i++) {
// node.children[i].active = false;
// }
// this.chooseCombo.getChildByPath("attrList/attr0").active = false;
// for (const index of Object.keys(sect)) {
// this.chooseCombo.getChildByPath("attrList/attr" + index).active = false;
// if (sect[index] == 0) continue;
// allTypeValue++;
// let len = value + sect[index];
// for (let i = value; i < len; i++) {
// if (!node.children[i].active) {
// node.children[i].getComponent(Animation).play("sectJump");
// node.children[i].active = true;
// }
// let sp: SpriteFrame = resLoader.getSpriteFrame("res/Image/type/type" + index, ModuleDef.Arean);
// node.children[i].getChildByName("icon").getComponent(Sprite).spriteFrame = sp;
// }
// value = len;
// if (sect[index] > 1) {
// let data = areanMgr.cfgMgr.SectData.getData(parseInt(index) * 10 + sect[index]);
// this.chooseCombo.getChildByPath("attrList/attr" + index + "/desc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(data.desc);
// this.chooseCombo.getChildByPath("attrList/attr" + index).active = true;
// }
// }
// if (allTypeValue == 4) {
// this.chooseCombo.getChildByPath("attrList/attr0").active = true;
// let data = areanMgr.cfgMgr.SectData.getData(1);
// this.chooseCombo.getChildByPath("attrList/attr0/desc").getComponent(RichText).string = CommonFun.getInstance().HighlightNumbers(data.desc);
// }
}
onClickShowDetail() {
let test = this.getComponent(TouchListener)
if (test.uiStage == 1) return;
if (this.getComponent(TouchListener).uiStage == 2) this.topUI.getChildByName("players").getComponent(Animation).play("closePlayersDetail");
this.getComponent(TouchListener).uiStage = 1;
this.detailView.getChildByPath("ToggleGroup/Toggle1").getComponent(Toggle).isChecked = true;
this.bottomUI.getComponent(Animation).play("showDetail");
}
onClickSectDetail() {
if (this.getComponent(TouchListener).uiStage == 1) return;
if (this.getComponent(TouchListener).uiStage == 2) this.topUI.getChildByName("players").getComponent(Animation).play("closePlayersDetail");
this.getComponent(TouchListener).uiStage = 1;
this.detailView.getChildByPath("ToggleGroup/Toggle3").getComponent(Toggle).isChecked = true;
this.bottomUI.getComponent(Animation).play("showDetail");
}
onClickCloseDetail() {
if (this.getComponent(TouchListener).uiStage == 0) return;
this.getComponent(TouchListener).uiStage = 0;
this.bottomUI.getComponent(Animation).play("closeDetail");
}
onClickRefreshCardList() {
if (this.getLocalPlayerData().freeRefreshTime < 1 && this.getLocalPlayerData().money < 1) {
this.playwarning("金币不足");
} else {
AreanNetMgr.inst.sendMsg_BuySelectCardListRefresh();
}
}
onClickLockCardList() {
AreanNetMgr.inst.sendMsg_SelectCardListLock(!this.lockBool);
}
onClickBuyExp() {
console.log("onClickBuyExp", this.getLocalPlayerData().money);
if (this.getLocalPlayerData().money < 1) {
this.playwarning("金币不足");
} else {
AreanNetMgr.inst.sendMsg_BuyExp();
}
}
onClickReady() {
if (this.btnPrepare.isChecked) AreanNetMgr.inst.sendMsg_Ready();
// AreanNetMgr.inst.sendMsg_Ready();
}
// 点击刷新装备
onClickRefreshEquip(): void {
AreanNetMgr.inst.sendMsg_refresh_equip().then((data) => {
console.log("刷新装备返回 == ", data);
if (data.isSucc) {
if (data.res.status) {
this._refreshEquipList(data.res.selectEquipList, true);
}
}
})
}
// 点击刷新圣物
onClickRefreshTreasure(): void {
AreanNetMgr.inst.sendMsg_refresh_treasure().then((data) => {
console.log("刷新圣物返回 == ", data);
if (data.isSucc) {
if (data.res.status) {
this._refreshTreasureList(data.res.selectTreasureList, true);
}
}
})
}
onClickShowPlayersDetail(index: number = this.curChoosePlayer) {
this._updatePlayerInfo(index);
this.curChoosePlayer = index;
let stage = this.getComponent(TouchListener).uiStage;
if (stage == 2) return;
if (stage == 1) this.bottomUI.getComponent(Animation).play("closeDetail");
this.getComponent(TouchListener).uiStage = 2;
this.topUI.getChildByPath("players").getComponent(Animation).play("showPlayersDetail");
}
onClickClosePlayersDetail() {
if (this.getComponent(TouchListener).uiStage == 0) return;
this.getComponent(TouchListener).uiStage = 0;
this.topUI.getChildByPath("players").getComponent(Animation).play("closePlayersDetail");
}
refreshPlayerRank(seatID: number) {
if (AreanNetMgr.inst.playerMap[seatID].bloodVolume <= 0) {
this.playerListNode.getChildByPath("player" + seatID + "/Node/monsterHeadIcon/deathMask").active = true;
let spineAnimation = this.playerListNode.getChildByPath("player" + seatID + "/Node/monsterHeadIcon/skin").getComponent(sp.Skeleton);
spineAnimation.timeScale == 0;
}
else {
this.playerListNode.getChildByPath("player" + seatID + "/Node/monsterHeadIcon/deathMask").active = false;
}
let bar = this.playerListNode.getChildByPath("player" + seatID + "/hp").getComponent(ProgressBar);
bar.progress = AreanNetMgr.inst.playerMap[seatID].bloodVolume / 20;
if (seatID == this.getLocalPlayerId()) {
this.btnHeadIcon.node.getChildByName("hpValue").getComponent(Label).string = this.getLocalPlayerData().bloodVolume + "/ 20";
}
// 获取所有玩家的血量
let playersBloodVolume = [];
for (let playerId in AreanNetMgr.inst.playerMap) {
let player = AreanNetMgr.inst.playerMap[playerId];
if (player.bloodVolume > 0) {
playersBloodVolume.push({ playerId: Number(playerId), bloodVolume: player.bloodVolume });
}
}
// 按血量从大到小排序
playersBloodVolume.sort((a, b) => b.bloodVolume - a.bloodVolume);
// 重新排列节点层级
for (let i = 0; i < playersBloodVolume.length; i++) {
let playerId = playersBloodVolume[i].playerId;
this.playerListNode.getChildByPath("player" + playerId).setSiblingIndex(i);
}
// 检查位置是否发生变化
for (let i = 0; i < playersBloodVolume.length; i++) {
let playerId = playersBloodVolume[i].playerId;
if (i != playerId) {
this.playerListNode.getChildByName("player" + playerId).getComponent(Animation).play("roleIn");
}
}
}
onClickBtnQuit() {
tgxUIAlert.show(`是否确认退出 ? `, true).onClick(async b => {
if (b) {
AreanNetMgr.inst.sendMsg_exit();
}
});
}
onClickBtnSurrender() {
tgxUIAlert.show(`这就投了 ? `, true).onClick(async b => {
if (b) {
AreanNetMgr.inst.sendMsg_surrender();
}
});
}
showSettlementView(rank: number) {
this.hasSettlement = true;
this.btnSurrender.node.active = false;
this.btnExit.node.active = true;
const path = 'res/Prefebs/settlementView';
let sp: Prefab = resLoader.get(path, Prefab, ModuleDef.Arean);
let node = instantiate(sp);
this.node.addChild(node);
node.getComponent(settlementView).setData(rank);
}
switchSoloRole(isAdd: boolean) {
if (this.monsterTurn.indexOf(this.curTurn) != -1) return;
let nextGroup = this.curGroup;
for (let i = 0; i < this.battleReportNum; i++) {
if (isAdd) {
nextGroup = nextGroup == this.battleReportNum - 1 ? 0 : nextGroup + 1;
}
else {
nextGroup = nextGroup == 0 ? this.battleReportNum - 1 : nextGroup - 1;
}
let group = this.roleLayer.getChildByName("group" + nextGroup);
if (group) {
if (group.children.length > 0) {
this.curGroup = nextGroup;
break;
};
}
}
this.checkSoloMode();
}
checkSoloMode() {
this.soloMode = this.btnSolo.isChecked;
this.btnSolo.node.getChildByName("zoomin").active = !this.btnSolo.isChecked;
this.btnSolo.node.getChildByName("zoomout").active = this.btnSolo.isChecked;
// for (const seat of Object.keys(this.seatRole)) {
// const role = this.seatRole[seat];
// if (role.curGroup == this.seatRole[this.soloSeat].curGroup) role.changeHpBarType();
// }
if (this.soloMode) {
tween(this.node.getChildByName("bg"))
.to(0.2, { scale: new Vec3(1.5, 1.5) })
.start();
let curGroupNode = this.roleLayer.getChildByName("group" + this.curGroup);
let pos = new Vec3(curGroupNode.position.x * - 4, curGroupNode.position.y * -4)
tween(this.node.getChildByName("bg"))
.to(0.2, { position: pos })
.start();
} else {
tween(this.node.getChildByName("bg"))
.to(0.2, { scale: new Vec3(1, 1) })
.start();
tween(this.node.getChildByName("bg"))
.to(0.2, { position: new Vec3(0, 0) })
.start();
}
for (const seat of Object.keys(this.seatRole)) {
const role = this.seatRole[seat];
role.changeHpBarType();
}
}
playwarning(text: string) {
this.warningNum++;
setTimeout(() => {
const path = 'res/Prefebs/warningTips';
let sp: Prefab = resLoader.get(path, Prefab, ModuleDef.Arean);
let node = instantiate(sp);
this.node.addChild(node);
node.getChildByPath("node/text").getComponent(RichText).string = text;
setTimeout(() => {
node.removeFromParent();
this.warningNum--;
}, 2000);
}, this.warningNum * 200);
}
deadCount() {
let dieNum = 0;
for (const key in AreanNetMgr.inst.playerMap) {
let data = AreanNetMgr.inst.playerMap[key];
if (data.bloodVolume <= 0) dieNum++;
}
return dieNum;
}
_updatePlayerDan(data: MsgAreanDanUpdatePush) {
this.dan = data;
// console.log("收到的段位信息 === ",this.dan);
let node = this.node.getChildByName("settlementView");
if (node && this.dan.danInfo.uid == UserMgr.inst.uid) {
node.getComponent(settlementView).updateDan(this.dan.danInfo);
}
}
_updateRewards(data: MsgAreanBattleRewardsPush) {
this.rewards = data;
let node = this.node.getChildByName("settlementView");
if (node && this.rewards.uid == UserMgr.inst.uid) {
node.getComponent(settlementView).updateRewards(this.rewards.items);
}
}
}