475 lines
11 KiB
TypeScript
475 lines
11 KiB
TypeScript
import {
|
||
_decorator,
|
||
Animation,
|
||
Button,
|
||
Color,
|
||
Component,
|
||
director,
|
||
instantiate,
|
||
Prefab,
|
||
RichText,
|
||
Sprite,
|
||
Vec3,
|
||
Node,
|
||
Label
|
||
} from "cc";
|
||
import { IAreanPlayer, IAreanUserTreasure, stage } from "db://assets/module_basic/shared/protocols/public/arean/AreanTypeDef";
|
||
import { EMusicDefine } from "db://assets/module_basic/Define/MusicDefine";
|
||
import { MsgAreanDanUpdatePush } from "db://assets/module_basic/shared/protocols/public/arean/MsgAreanDanUpdatePush";
|
||
import { UserMgr } from "db://assets/module_basic/scripts/UserMgr";
|
||
import { MsgAreanBattleRewardsPush } from "../../module_basic/shared/protocols/public/arean/MsgAreanBattleRewardsPush";
|
||
import { resLoader } from "../../core_tgx/base/utils/ResLoader";
|
||
import { tgxAudioMgr, tgxUIAlert } from "../../core_tgx/tgx";
|
||
import { areanMgr } from "../../module_arean/scripts/AreanManager";
|
||
import { AreanNetMgr, AreanEvent } from "../../module_arean/scripts/AreanNetMgr";
|
||
import { MsgAreanGameStatusPush } from "../../module_basic/shared/protocols/public/arean/MsgAreanGameStatusPush";
|
||
import { ModuleDef } from "../../scripts/ModuleDef";
|
||
import { settlementView } from "./settlementView";
|
||
|
||
const { ccclass, property } = _decorator;
|
||
|
||
|
||
|
||
@ccclass('BattleView')
|
||
export class BattleView extends Component {
|
||
|
||
|
||
curTurn: number = 1; //当前回合数
|
||
curSeat: number = 0; //当前玩家座位号
|
||
remainingTime: number = 0;
|
||
curStage: stage = stage.await;
|
||
|
||
// 当前播放的背景音乐
|
||
_curPlayBgm: string = "bgm_battle";
|
||
hasSettlement: boolean = false;
|
||
warningNum: number = 0;
|
||
rewards: MsgAreanBattleRewardsPush = null;
|
||
|
||
|
||
@property({ type: Prefab })
|
||
roleItem: Prefab = null;
|
||
@property({ type: Label })
|
||
timerLabel: Label = null;
|
||
@property({ type: Label })
|
||
stageLabel: Label = null;
|
||
@property({ type: Label })
|
||
personLabel: Label = null;
|
||
|
||
chooseJobBool: boolean = false;
|
||
curTurnLable: RichText = null;
|
||
cardList: Node = null;
|
||
treasureList: Node = null;
|
||
jobList: Node = null;
|
||
btnSurrender: Button = null;
|
||
btnExit: Button = null;
|
||
chooseJobView: Node = null;
|
||
|
||
private minRoleId: number = 1;
|
||
private maxRoleId: number = 5;
|
||
|
||
// 添加相机引用属性
|
||
@property({ type: Node })
|
||
private camera: Node = null;
|
||
|
||
private localPlayer: Node = null;
|
||
isInit: boolean = false;
|
||
|
||
|
||
|
||
start() {
|
||
areanMgr.BattleView = this;
|
||
|
||
console.log("储存的玩家数据", AreanNetMgr.inst.playerMap);
|
||
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_BATTLE, 1, ModuleDef.BASIC);
|
||
director.on(AreanEvent.BattleReportPush, this.playBattleReport, 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.SelectTreasureList, this.refreshTreasureList, this);
|
||
director.on(AreanEvent.UpdateBattleResult, this._updateRewards, this);
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
protected onDestroy() {
|
||
// Remove event listeners
|
||
director.off(AreanEvent.BattleReportPush, this.playBattleReport, this);
|
||
director.off(AreanEvent.PlayerStatus, this.initPlayerStatus, this);
|
||
director.off(AreanEvent.BattleStagePush, this.refreshBattleStage, this);
|
||
director.off(AreanEvent.SelectCardList, this.SelectCardList, this);
|
||
director.off(AreanEvent.SelectTreasureList, this.refreshTreasureList, this);
|
||
director.off(AreanEvent.UpdateBattleResult, this._updateRewards, this);
|
||
|
||
// Play hall BGM
|
||
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_HALL, 1, ModuleDef.BASIC);
|
||
}
|
||
|
||
|
||
|
||
|
||
update(dt: number): void {
|
||
if (!this.isInit && Object.keys(AreanNetMgr.inst.playerMap).length > 7) {
|
||
this.isInit = true;
|
||
this.initPlayerStatus();
|
||
}
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
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.getLocalPlayerData().bloodVolume > 0) {
|
||
|
||
|
||
this.refreshCardList();
|
||
if (this._curPlayBgm !== 'bgm_select_card') {
|
||
this._curPlayBgm = 'bgm_select_card';
|
||
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_SELECT_CARD, 1, ModuleDef.BASIC);
|
||
}
|
||
|
||
|
||
}
|
||
}
|
||
|
||
|
||
break;
|
||
case stage.battle:
|
||
if (this.stageLabel.string != "战斗阶段") {
|
||
stageLabel = "战斗阶段";
|
||
|
||
this.updatePlayerLocalData();
|
||
|
||
if (this._curPlayBgm !== 'bgm_battle') {
|
||
this._curPlayBgm = 'bgm_battle';
|
||
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_BATTLE, 1, ModuleDef.BASIC);
|
||
}
|
||
|
||
}
|
||
|
||
break;
|
||
case stage.equip:
|
||
if (this.stageLabel.string != "选择装备") {
|
||
stageLabel = "选择装备";
|
||
|
||
if (this.getLocalPlayerData().bloodVolume > 0) {
|
||
}
|
||
}
|
||
|
||
|
||
break;
|
||
case stage.treasure:
|
||
|
||
if (this.stageLabel.string != "选择圣物") {
|
||
|
||
stageLabel = "选择圣物";
|
||
if (this.getLocalPlayerData().bloodVolume > 0) {
|
||
this.refreshTreasureList(this.getLocalPlayerData().selectTreasureList);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
break;
|
||
case stage.await:
|
||
break;
|
||
case stage.afterCard:
|
||
|
||
if (this.stageLabel.string != "即将开战") {
|
||
stageLabel = "即将开战";
|
||
}
|
||
|
||
|
||
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
|
||
//战斗结束
|
||
if (this.curStage == stage.battle && data.stageId != stage.battle) {
|
||
for (let i = 0; i < 8; i++) {
|
||
}
|
||
|
||
if (!this.hasSettlement && (this.deadCount() >= 7 || this.getLocalPlayerData().bloodVolume <= 0)) {
|
||
|
||
this.showSettlementView(this.getLocalPlayerData().rank);
|
||
}
|
||
}
|
||
|
||
//选择职业结束
|
||
if (this.curStage == stage.career && data.stageId != stage.career && !this.chooseJobBool) {
|
||
|
||
this.onClickChooseJob(0, 0, true);
|
||
}
|
||
|
||
this.curStage = data.stageId;
|
||
this.stageLabel.string = stageLabel;
|
||
this.curTurnLable.string = this.curTurn + "";
|
||
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
updatePlayerLocalData() {
|
||
// Update the local player data from AreanNetMgr
|
||
const localPlayer = this.getLocalPlayerData();
|
||
// Add implementation as needed
|
||
}
|
||
|
||
playBattleReport() {
|
||
|
||
//玩家移动,被击杀
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
SelectCardList() {
|
||
|
||
this.refreshCardList();
|
||
}
|
||
|
||
refreshCardList() {
|
||
|
||
let data = AreanNetMgr.inst.playerMap[this.getLocalPlayerId()].selectCardList;
|
||
|
||
|
||
for (let i = 0; i < data.length; i++) {
|
||
let card = data[i];
|
||
let cardItem = this.cardList.children[i];
|
||
cardItem.active = true;
|
||
|
||
let index = i;
|
||
cardItem.off("click");
|
||
cardItem.on("click", () => {
|
||
|
||
AreanNetMgr.inst.sendMsg_SelectCard(index);
|
||
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
|
||
private _refreshTreasureList(data: IAreanUserTreasure[], isCustom: boolean = false): void {
|
||
this.refreshTreasureList(data, isCustom)
|
||
}
|
||
|
||
refreshTreasureList(data: IAreanUserTreasure[], isCustom: boolean = false) {
|
||
|
||
this.stageLabel.string = "选择圣物";
|
||
if (this._curPlayBgm !== 'bgm_select_card') {
|
||
this._curPlayBgm = 'bgm_select_card';
|
||
tgxAudioMgr.inst.play(EMusicDefine.MUSIC_BGM_SELECT_CARD, 1, ModuleDef.BASIC);
|
||
}
|
||
|
||
for (let i = 0; i < data.length; i++) {
|
||
let d = data[i];
|
||
let cardItem = this.treasureList.children[i];
|
||
cardItem.active = true;
|
||
|
||
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;
|
||
|
||
for (let i = 0; i < 3; i++) {
|
||
let jobItem = this.jobList.children[i];
|
||
jobItem.active = true;
|
||
|
||
|
||
let index = i;
|
||
jobItem.on("click", () => {
|
||
|
||
this.onClickChooseJob(index, 0, true);
|
||
this.playwarning("");
|
||
})
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
onClickChooseJob(index: number, jobId: number, send: boolean = false) {
|
||
{
|
||
|
||
|
||
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;
|
||
}, 1000);
|
||
}
|
||
}
|
||
}
|
||
|
||
// 获取玩家座位号
|
||
getLocalPlayerData(): IAreanPlayer {
|
||
let data = AreanNetMgr.inst.selfPlayer;
|
||
return data;
|
||
}
|
||
|
||
getLocalPlayerId() {
|
||
return AreanNetMgr.inst.selfPlayer.playerId;
|
||
}
|
||
|
||
|
||
|
||
initPlayerStatus() {
|
||
this.createRoles();
|
||
}
|
||
|
||
|
||
private async createRoles() {
|
||
// 先创建本地玩家
|
||
const localPlayerX = 0; // 本地玩家的初始位置
|
||
const localPlayerZ = 51;
|
||
|
||
// 创建其他玩家
|
||
for (let i = 1; i < Object.keys(AreanNetMgr.inst.playerMap).length; i++) {
|
||
// 随机位置:X轴-10到9,Z轴50-53
|
||
const x = Math.random() * 19 - 10; // -10到9
|
||
const z = Math.random() * 3 + 50; // 50到53
|
||
|
||
// 随机角色ID(1-5)
|
||
const roleId = Math.floor(Math.random() * (this.maxRoleId - this.minRoleId + 1)) + this.minRoleId;
|
||
const roleIdStr = roleId.toString().length < 3 ? '0'.repeat(3 - roleId.toString().length) + roleId : roleId.toString();
|
||
|
||
const prefab: Prefab = resLoader.get(`common/role/Character${roleIdStr}`,Prefab,ModuleDef.Arean);
|
||
if (prefab) {
|
||
let role = instantiate(prefab);
|
||
this.node.addChild(this.node);
|
||
role.setPosition(new Vec3(x, 0, z));
|
||
role.setRotationFromEuler(0, 180, 0);
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
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);
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
playwarning(text: string) {
|
||
|
||
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 * 500);
|
||
this.warningNum++;
|
||
|
||
}
|
||
|
||
deadCount() {
|
||
let dieNum = 0;
|
||
for (const key in AreanNetMgr.inst.playerMap) {
|
||
let data = AreanNetMgr.inst.playerMap[key];
|
||
if (data.bloodVolume <= 0) dieNum++;
|
||
}
|
||
|
||
return dieNum;
|
||
}
|
||
|
||
|
||
_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);
|
||
}
|
||
}
|
||
|
||
}
|
||
|