squidGame/tgx-games-client/assets/level1/Script/BattleView.ts

475 lines
11 KiB
TypeScript
Raw Normal View History

2025-02-21 10:45:46 +08:00
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到9Z轴50-53
const x = Math.random() * 19 - 10; // -10到9
const z = Math.random() * 3 + 50; // 50到53
// 随机角色ID1-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);
}
}
}