import GameModel from "../core/GameModel"; import FGUtil from "../gear_2.3.4/fgui/FGUtil"; import SKUIUtil from "../gear_2.3.4/util/SKUIUtil"; import MsgAlert from "../game/msg/MsgAlert"; import ItemUtil from "../core/ItemUtil"; import GameUtil from "../core/GameUtil"; import SKDataUtil from "../gear_2.3.4/util/SKDataUtil"; const { ccclass, property } = cc._decorator; export default class DebateDao extends cc.Component { /** * 逐鹿單例實例 */ public static Instance: DebateDao = null; /** * 逐鹿面板 */ battlePanel: fgui.GComponent = null; /** * 排名面板 */ battleSortPanel: fgui.GComponent = null; /** * 勝利面板 */ battleWinPanel: fgui.GComponent = null; /** * 失敗面板 */ battleLosePanel: fgui.GComponent = null; /** * 逐鹿玩法面板 */ playInfoPanel: fgui.GComponent = null; /** * 勝利公告面板 */ winNoticePanel: fgui.GComponent = null; /** * 開啟時間 */ cutdownTime: number = 0; /** * 階段狀態 */ stageType: number = 0; /** * 惡鬼積分 */ yuanmoScore: number = 0; /** * 巔峰積分 */ peakScore: number = 0; /** * 逐鹿積分 */ zhengdaoScore: number = 0; /** * 倒計時函數 */ cutdownTimeFunc: any = null; /** * 排名數據 */ sortData: any = null; /** * 需要加載的預製體 */ prefabObject: any = {}; onLoad() { if (DebateDao.Instance === null) { DebateDao.Instance = this; // this.loadPrefab(); } else { this.destroy(); return; } } /** * 加載預製體 */ loadPrefab() { // 加載所需的預製體 var prefabList = [ // { url: "Prefabs/UIRole", name: "UIRole" }, ] this.prefabObject = {} for (let item of prefabList) { cc.loader.loadRes(item.url, cc.Prefab, (err, prefab) => { if (err) console.warn(err); else { this.prefabObject[item.name] = prefab; } }) } } openDebateDaoPanel() { if (!this.battlePanel || (this.battlePanel && !this.battlePanel.node && !SKUIUtil.isValid(this.battlePanel.node))) { this.battlePanel = FGUtil.create("main_ui", "debate_panel"); FGUtil.root().addChild(this.battlePanel); this.battlePanel.makeFullScreen(); } FGUtil.getTextField(this.battlePanel, "alert/n2/title").text = "逐鹿之戰" let zdBtn = FGUtil.getButton(this.battlePanel, "btn/n2"); zdBtn.onClick(this.openDebateDaoInfoPanel, this); let sortBtn = FGUtil.getButton(this.battlePanel, "alert/n14"); sortBtn.onClick(this.openDebateDaoSortPanel, this); let leaveBtn = FGUtil.getButton(this.battlePanel, "alert/n15"); leaveBtn.onClick(this.leaveTip, this) let mask = FGUtil.getComponent(this.battlePanel, "mask"); let close = FGUtil.getComponent(this.battlePanel, "alert/n17"); this.pushCloseDebatePanelEvent(mask); this.pushCloseDebatePanelEvent(close); FGUtil.getTextField(this.battlePanel, "btn/n3").text = `惡鬼積分:${this.yuanmoScore}`; FGUtil.getTextField(this.battlePanel, "btn/n4").text = `逐鹿積分:${this.zhengdaoScore}`; if (this.stageType == 1 || this.stageType == 3) { FGUtil.getControl(this.battlePanel, "alert/noWatch").selectedIndex = 1 } else { FGUtil.getControl(this.battlePanel, "alert/noWatch").selectedIndex = 0 } this.setTitle(this.stageType); } leaveTip() { MsgAlert.addMsg("本地圖只能通過逐鹿離開") } leaveSuccess() { this.unscheduleAllCallbacks() if (this.battlePanel) FGUtil.dispose(this.battlePanel); this.battlePanel = null; if (this.battleSortPanel) FGUtil.dispose(this.battleSortPanel); this.battleSortPanel = null; if (this.battleWinPanel) FGUtil.dispose(this.battleWinPanel); this.battleWinPanel = null; if (this.battleLosePanel) FGUtil.dispose(this.battleLosePanel); this.battleLosePanel = null; this.cutdownTime = 0; this.stageType = 0; this.yuanmoScore = 0; this.zhengdaoScore = 0; this.cutdownTimeFunc = null; this.sortData = null; } setScore(matchScore, satScore, peakScore, type) { if (!SKUIUtil.isFGUIValid(this.battlePanel)) return; this.yuanmoScore = matchScore; this.zhengdaoScore = satScore; let matchScoreLabel = FGUtil.getTextField(this.battlePanel, "btn/n3") let satScoreLabel = FGUtil.getTextField(this.battlePanel, "btn/n4") if (type == 1) { if (matchScoreLabel) matchScoreLabel.text = `惡鬼積分:${this.yuanmoScore}`; } else { this.peakScore = peakScore; if (matchScoreLabel) matchScoreLabel.text = `巔峰積分:${this.peakScore}`; } if (satScoreLabel) satScoreLabel.text = `逐鹿積分:${this.zhengdaoScore}`; } updateSayPeakScore(peakScore) { if (!SKUIUtil.isFGUIValid(this.battlePanel)) return; this.peakScore = peakScore; let matchScoreLabel = FGUtil.getTextField(this.battlePanel, "btn/n3") if (matchScoreLabel) matchScoreLabel.text = `巔峰積分:${this.peakScore}`; } openDebateDaoInfoPanel() { if (!this.battlePanel || (this.battlePanel && !this.battlePanel.node && !SKUIUtil.isValid(this.battlePanel.node))) { console.warn("未找到面板"); return; } GameModel.send("c2s_say_team_info", { teamId: GameModel.player.teamid, }) FGUtil.getControl(this.battlePanel, "show").selectedIndex = 1 } refreshBattlePanel(data: any = null) { if (!this.battlePanel || (this.battlePanel && !this.battlePanel.node && !SKUIUtil.isValid(this.battlePanel.node))) { console.warn("未找到面板"); return; } if (data == null) { console.warn("數據錯誤"); return; } var list = FGUtil.getList(this.battlePanel, "alert/n10"); list.removeChildrenToPool(); var teamInfo = JSON.parse(data.teamInfo) for (let i in teamInfo) { var item = list.addItem().asCom; FGUtil.getImage(item, "cap").visible = parseInt(i) == 0 ? true : false; FGUtil.getLoader(item, "icon").texture = GameModel.getRoleHead(teamInfo[i].resid); FGUtil.getLoader(item, "race").url = `ui://main_ui/icon_race${teamInfo[i].race}`; FGUtil.getTextField(item, "name").text = teamInfo[i].name; FGUtil.getTextField(item, "grade").text = `${teamInfo[i].relive}轉${teamInfo[i].level}級`; } } openDebateDaoSortPanel() { if (!this.battleSortPanel || (this.battleSortPanel && !this.battleSortPanel.node && !SKUIUtil.isValid(this.battleSortPanel.node))) { this.battleSortPanel = FGUtil.create("main_ui", "debate_sort_panel"); FGUtil.root().addChild(this.battleSortPanel); this.battleSortPanel.makeFullScreen(); } var closeBtn = FGUtil.getButton(this.battleSortPanel, "alert/close") var mask = FGUtil.getComponent(this.battleSortPanel, "mask") this.pushCloseEvent(closeBtn, this.battleSortPanel); this.pushCloseEvent(mask, this.battleSortPanel); GameModel.send("c2s_say_integral_info", { type: this.stageType < 3 ? 1 : 0, }); FGUtil.getTextField(this.battleSortPanel, "alert/n12/title").text = this.stageType < 3 ? "惡鬼" : "逐鹿" var chooseTypeBtn = FGUtil.getComponent(this.battleSortPanel, "alert/n12"); chooseTypeBtn.onClick(this.showChooseType, this); var typeBtn1 = FGUtil.getComponent(this.battleSortPanel, "alert/yuanmo"); typeBtn1.node["name"] = "yuanmo" var typeBtn2 = FGUtil.getComponent(this.battleSortPanel, "alert/zhengdao"); typeBtn2.node["name"] = "zhengdao" typeBtn1.onClick(this.chooseType, this); typeBtn2.onClick(this.chooseType, this); var list = FGUtil.getList(this.battleSortPanel, "alert/list"); // 設置初始化方法 list.itemRenderer = this.initSortItem.bind(this); // 虛擬列表 list.setVirtual(); } showChooseType() { if (!this.battleSortPanel || (this.battleSortPanel && !this.battleSortPanel.node && !SKUIUtil.isValid(this.battleSortPanel.node))) { console.warn("未找到面板"); return; } FGUtil.getControl(this.battleSortPanel, "alert/showChose").selectedIndex = 1; } chooseType(e: Event) { var idx = "yuanmo"; if (e && e.target && e.target["name"]) idx = e.target["name"]; if (!this.battleSortPanel || (this.battleSortPanel && !this.battleSortPanel.node && !SKUIUtil.isValid(this.battleSortPanel.node))) { console.warn("未找到面板"); return; } FGUtil.getControl(this.battleSortPanel, "alert/showChose").selectedIndex = 0; if (idx == "yuanmo") { GameModel.send("c2s_say_integral_info", { type: 1, }); FGUtil.getTextField(this.battleSortPanel, "alert/n12/title").text = "惡鬼" } else { GameModel.send("c2s_say_integral_info", { type: 0, }); FGUtil.getTextField(this.battleSortPanel, "alert/n12/title").text = "逐鹿" } } refreshSortPanel(data: any = null) { this.sortData = JSON.parse(data); if (!this.battleSortPanel || (this.battleSortPanel && !this.battleSortPanel.node && !SKUIUtil.isValid(this.battleSortPanel.node))) { console.warn("未找到面板"); return; } if (data == null) { console.warn("數據錯誤"); return; } var list = FGUtil.getList(this.battleSortPanel, "alert/list"); // 虛擬列表更新 list.numItems = this.sortData.length; } initSortItem(idx, obj: fairygui.GObject) { var item = obj.asCom; if (idx < 3) { // 前三名 FGUtil.getControl(item, "sort").selectedIndex = idx + 1; } else { FGUtil.getControl(item, "sort").selectedIndex = 0; FGUtil.getTextField(item, "index_tf").text = (idx + 1).toString(); } FGUtil.getRichTextField(item, "name_rt").text = this.sortData[idx].captainName; FGUtil.getTextField(item, "two_tf").text = this.sortData[idx].score.toString(); var teamInfo = JSON.parse(this.sortData[idx].teamInfo); FGUtil.getControl(item, "num").selectedIndex = teamInfo.length - 1; for (let i in teamInfo) { FGUtil.getLoader(item, `h${i}/icon`).texture = GameModel.getRoleHead(teamInfo[i].resid); } } setCutDownTime(t: number = 0) { this.unscheduleAllCallbacks(); this.cutdownTimeFunc = function () { if (this.cutdownTime <= 0) { this.unschedule(this.cutdownTimeFunc); } this.cutdownTime -= 1000; if (this.cutdownTime < 0) this.cutdownTime = 0; if (this.battlePanel && this.battlePanel.node) { var t = Math.floor(this.cutdownTime / 1000); var m = Math.floor(t / 60); var s = t % 60; FGUtil.getTextField(this.battlePanel, "alert/n12").text = `準備中\n還有${m}:${s}開始`; } } this.cutdownTime = t; this.schedule(this.cutdownTimeFunc, 1) } setTitle(type) { this.stageType = type; var str = ""; switch (type) { case 1: str = "惡鬼競賽(備戰)"; break; case 2: str = "惡鬼競賽"; break; case 3: str = "巔峰對決(備戰)"; break; case 4: str = "巔峰對決"; break; default: str = "逐鹿"; } if (this.battlePanel && this.battlePanel.node) FGUtil.getTextField(this.battlePanel, "alert/n6").text = str; } openWinPanel(data) { if (!this.battleWinPanel || (this.battleWinPanel && !this.battleWinPanel.node && !SKUIUtil.isValid(this.battleWinPanel.node))) { this.battleWinPanel = FGUtil.create("main_ui", "crosspk_war_win_panel"); FGUtil.root().addChild(this.battleWinPanel); this.battleWinPanel.makeFullScreen(); } FGUtil.getRichTextField(this.battleWinPanel, "alert/n15").text = `${data.exp}`; FGUtil.getRichTextField(this.battleWinPanel, "alert/n17").text = `${data.petExp}`; FGUtil.getRichTextField(this.battleWinPanel, "alert/n19").text = `${data.score}`; var icon = ItemUtil.getItemData(data.icon).icon; FGUtil.getLoader(this.battleWinPanel, "alert/item/icon").url = `ui://main_ui/${icon}`; let closeBtn = FGUtil.getComponent(this.battleWinPanel, "alert/mask") let mask = FGUtil.getComponent(this.battleWinPanel, "mask") this.pushCloseEvent(closeBtn, this.battleWinPanel); this.pushCloseEvent(mask, this.battleWinPanel); this.scheduleOnce(() => { if (this.battleWinPanel && this.battleWinPanel.node) { FGUtil.dispose(this.battleWinPanel); } }, 3) } openLosePanel(data) { if (!this.battleLosePanel || (this.battleLosePanel && !this.battleLosePanel.node && !SKUIUtil.isValid(this.battleLosePanel.node))) { this.battleLosePanel = FGUtil.create("main_ui", "crosspk_war_lose_panel"); FGUtil.root().addChild(this.battleLosePanel); this.battleLosePanel.makeFullScreen(); } FGUtil.getRichTextField(this.battleLosePanel, "alert/n15").text = `${data.exp}`; FGUtil.getRichTextField(this.battleLosePanel, "alert/n17").text = `${data.petExp}`; FGUtil.getRichTextField(this.battleLosePanel, "alert/n19").text = `${data.score}`; var icon = ItemUtil.getItemData(data.icon).icon; FGUtil.getLoader(this.battleLosePanel, "alert/item/icon").url = `ui://main_ui/${icon}`; let closeBtn = FGUtil.getComponent(this.battleLosePanel, "alert/mask") let mask = FGUtil.getComponent(this.battleLosePanel, "mask") this.pushCloseEvent(closeBtn, this.battleLosePanel); this.pushCloseEvent(mask, this.battleLosePanel); this.scheduleOnce(() => { if (this.battleLosePanel && this.battleLosePanel.node) { FGUtil.dispose(this.battleLosePanel); } }, 3) } openPlayInfo(index) { if (!this.playInfoPanel || (this.playInfoPanel && !this.playInfoPanel.node && !SKUIUtil.isValid(this.playInfoPanel.node))) { this.playInfoPanel = FGUtil.create("main_ui", "play_info_panel"); FGUtil.root().addChild(this.playInfoPanel); this.playInfoPanel.makeFullScreen(); } let closeBtn = FGUtil.getButton(this.playInfoPanel, "alert/close"); let mask = FGUtil.getComponent(this.playInfoPanel, "mask"); this.pushCloseEvent(closeBtn, this.playInfoPanel); this.pushCloseEvent(mask, this.playInfoPanel); let rT = FGUtil.getRichTextField(this.playInfoPanel, "alert/info/title"); let info = GameModel.conf_playing_method[index]; let str = ""; if (info && SKDataUtil.hasProperty(info, "content")) { str = info.content; } rT.text = str; if (info && SKDataUtil.hasProperty(info, "bg")) { FGUtil.getControl(this.playInfoPanel, "alert/bg").selectedIndex = info.bg; } } /** * 打開胜利公告面板 * info=[{ name: "玩家名字", relive: 3, level: 11, resid: 1101 }, * { name: "玩家名字", relive: 3, level: 11, resid: 1101 }]) */ openWinNoticePanel(info: any = null) { var num = info.length; if (!SKUIUtil.isFGUIValid(this.winNoticePanel)) { this.winNoticePanel = FGUtil.create("main_ui", "win_notice_panel"); FGUtil.getControl(this.winNoticePanel, "alert/type").selectedIndex = num - 1; FGUtil.root().addChild(this.winNoticePanel); this.winNoticePanel.makeFullScreen(); FGUtil.getComponent(this.winNoticePanel, "alert/n67").visible = false; } var alert = FGUtil.getComponent(this.winNoticePanel, "alert"); for (let i = 1; i <= num; i++) { FGUtil.getLoader(alert, `l${num}/role${i}`).texture = GameModel.getRolePosterHead(info[i - 1].resid); FGUtil.getTextField(alert, `l${num}/name${i}`).text = info[i - 1].name; FGUtil.getRichTextField(alert, `l${num}/level${i}`).text = GameUtil.getReliveRichText(info[i - 1].relive, info[i - 1].level); } var mask = FGUtil.getComponent(this.winNoticePanel, "mask"); this.pushCloseEvent(mask, this.winNoticePanel); } /** * 添加關閉事件 */ pushCloseDebatePanelEvent(item: fairygui.GComponent) { item.clearClick(); item.onClick(() => { FGUtil.getControl(this.battlePanel, "show").selectedIndex = 0; }, this) } /** * 添加關閉事件 */ pushCloseEvent(item: fairygui.GComponent, target: fairygui.GComponent, call: Function = null) { item.clearClick(); item.onClick(() => { call && call() FGUtil.dispose(target); target = null; }, this) } }