427 lines
14 KiB
TypeScript
427 lines
14 KiB
TypeScript
import GameModel from "../core/GameModel";
|
|
import ItemUtil from "../core/ItemUtil";
|
|
import MsgAlert from "../game/msg/MsgAlert";
|
|
import FGUtil from "../gear_2.3.4/fgui/FGUtil";
|
|
import SKDataUtil from "../gear_2.3.4/util/SKDataUtil";
|
|
import SKUIUtil from "../gear_2.3.4/util/SKUIUtil";
|
|
|
|
const { ccclass, property } = cc._decorator;
|
|
export default class Arena extends cc.Component {
|
|
|
|
/**
|
|
* 競技場單例實例
|
|
*/
|
|
public static Instance : Arena = null;
|
|
|
|
/**
|
|
* 競技場面板
|
|
*/
|
|
arenaPanel : fgui.GComponent = null;
|
|
|
|
/**
|
|
* 戰報面板
|
|
*/
|
|
reportPanel : fgui.GComponent = null;
|
|
|
|
/**
|
|
* 兌換面板
|
|
*/
|
|
convertPanel : fgui.GComponent = null;
|
|
|
|
/**
|
|
* 需要加載的預製體
|
|
*/
|
|
prefabObject : any = {};
|
|
|
|
/**
|
|
* 刷新冷卻時間
|
|
*/
|
|
refreshCD : number = 0;
|
|
|
|
/**
|
|
* 積分兌換商品列表
|
|
*/
|
|
convertItemsList : any = [];
|
|
/**
|
|
* 當前選擇的商品信息
|
|
*/
|
|
selectedGoodItemsInfo : any = [];
|
|
/**
|
|
* 是否是進入戰鬥後隱藏
|
|
*/
|
|
isBtlHide : boolean = false;
|
|
|
|
onLoad() {
|
|
if (Arena.Instance === null) {
|
|
Arena.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;
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
openArenaPanel(list : any = [], selfInfo = null, refresh : Boolean = false) {
|
|
if (!this.arenaPanel || (this.arenaPanel && !this.arenaPanel.node && !SKUIUtil.isValid(this.arenaPanel.node))) {
|
|
this.arenaPanel = FGUtil.create("main_ui", "arena_panel");
|
|
FGUtil.root().addChild(this.arenaPanel);
|
|
this.arenaPanel.makeFullScreen();
|
|
this.addUIRole();
|
|
}
|
|
|
|
let listBox = FGUtil.getList(this.arenaPanel, "alert/list")
|
|
listBox.removeChildrenToPool();
|
|
|
|
if (this.refreshCD > 0) {
|
|
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1;
|
|
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
|
|
}
|
|
|
|
if (refresh) {
|
|
var score = 0;
|
|
if (GameModel.equipData && GameModel.equipData.score)
|
|
score = GameModel.equipData.score;
|
|
|
|
FGUtil.getTextField(this.arenaPanel, "alert/rank").text = selfInfo.arena.ranking;
|
|
FGUtil.getTextField(this.arenaPanel, "alert/arena").text = selfInfo.arena.jpoint;
|
|
FGUtil.getTextField(this.arenaPanel, "alert/hasTimes").text = selfInfo.arena.count;
|
|
FGUtil.getTextField(this.arenaPanel, "alert/equipScore").text = score.toString();
|
|
|
|
let timeWait = 0;
|
|
for (let i = 0; i < list.length; i++) {
|
|
this.scheduleOnce(() => {
|
|
let item = listBox.addItemFromPool().asCom;
|
|
item.visible = false
|
|
FGUtil.getTextField(item, "rankLabel").text = list[i][7];
|
|
FGUtil.getTextField(item, "name").text = list[i][2];
|
|
FGUtil.getLoader(item, "ava").texture = GameModel.getRoleHead(list[i][1]);
|
|
FGUtil.getTextField(item, "eqScore").text = list[i][8];
|
|
var btn = FGUtil.getButton(item, "btn");
|
|
btn.visible = (selfInfo.arena.ranking > 10 && i < 5) ? false : true
|
|
btn.clearClick();
|
|
btn.onClick(() => {
|
|
GameModel.send("c2s_arenaPK", { troleid: list[i][0], type: 2 });
|
|
}, this)
|
|
|
|
this.scheduleOnce(() => {
|
|
item.visible = true
|
|
}, 0)
|
|
}, timeWait)
|
|
timeWait += 0.01;
|
|
}
|
|
this.arenaPanel.visible = true;
|
|
return
|
|
}
|
|
|
|
var mask = FGUtil.getComponent(this.arenaPanel, "mask");
|
|
var close = FGUtil.getButton(this.arenaPanel, "alert/closeBtn");
|
|
this.pushCloseEvent(mask, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); });
|
|
this.pushCloseEvent(close, this.arenaPanel, () => { listBox.removeChildrenToPool(); this.unscheduleAllCallbacks(); });
|
|
|
|
var historyBtn = FGUtil.getButton(this.arenaPanel, "alert/history");
|
|
historyBtn.onClick(() => {
|
|
GameModel.send("c2s_report", { troleid: GameModel.player.roleid })
|
|
this.openReportPanel();
|
|
}, this)
|
|
|
|
var convertBtn = FGUtil.getButton(this.arenaPanel, "alert/convert");
|
|
convertBtn.onClick(() => {
|
|
this.openConvertPanel();
|
|
}, this)
|
|
|
|
var cdBtn = FGUtil.getButton(this.arenaPanel, "alert/refreshBtn");
|
|
cdBtn.onClick(() => {
|
|
if (this.refreshCD > 0) {
|
|
MsgAlert.addMsg("請稍等再重置");
|
|
return;
|
|
}
|
|
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
|
|
|
|
this.refreshCD = 5;
|
|
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 1;
|
|
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
|
|
|
|
this.schedule(() => {
|
|
this.refreshCD--;
|
|
if (this.refreshCD <= 0) {
|
|
FGUtil.getControl(this.arenaPanel, "alert/refreshBtn/cding").selectedIndex = 0
|
|
this.unscheduleAllCallbacks()
|
|
return
|
|
}
|
|
FGUtil.getTextField(this.arenaPanel, "alert/refreshBtn/title").text = `00:0${this.refreshCD}`;
|
|
}, 1, 4)
|
|
}, this)
|
|
|
|
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
|
|
}
|
|
|
|
hideArenaPanel() {
|
|
if (!this.arenaPanel || !this.arenaPanel.node) return
|
|
this.isBtlHide = true;
|
|
this.arenaPanel.visible = false;
|
|
this.unscheduleAllCallbacks();
|
|
}
|
|
|
|
showArenaPanel() {
|
|
if (!this.arenaPanel || !this.arenaPanel.node) return
|
|
this.isBtlHide = false;
|
|
GameModel.send("c2s_ask_paihang", { nByWhat: 4, object: "", nRoleid: GameModel.player.roleid })
|
|
}
|
|
openReportPanel(list : any = [], refresh : Boolean = false) {
|
|
if (!this.reportPanel || (this.reportPanel && !this.reportPanel.node && !SKUIUtil.isValid(this.reportPanel.node))) {
|
|
this.reportPanel = FGUtil.create("main_ui", "report_panel");
|
|
FGUtil.root().addChild(this.reportPanel);
|
|
this.reportPanel.makeFullScreen();
|
|
}
|
|
|
|
let listBox = FGUtil.getList(this.reportPanel, "alert/list")
|
|
listBox.removeChildrenToPool();
|
|
|
|
if (refresh) {
|
|
for (let i = 0; i < list.length; i++) {
|
|
let item = listBox.addItemFromPool().asCom;
|
|
FGUtil.getTextField(item, "idx").text = list[i].ranking;
|
|
FGUtil.getTextField(item, "name").text = list[i].erolename;
|
|
FGUtil.getTextField(item, "time").text = this.getTimeStr(list[i].cdate);
|
|
FGUtil.getLoader(item, "icon").texture = GameModel.getRoleHead(list[i].eresid);
|
|
FGUtil.getControl(item, "type").selectedIndex = list[i].iswin ? list[i].ranking > 0 ? 1 : 2 : 0;
|
|
}
|
|
return
|
|
}
|
|
|
|
var mask = FGUtil.getComponent(this.reportPanel, "mask");
|
|
var close = FGUtil.getButton(this.reportPanel, "alert/close");
|
|
this.pushCloseEvent(mask, this.reportPanel, () => { listBox.removeChildrenToPool() });
|
|
this.pushCloseEvent(close, this.reportPanel, () => { listBox.removeChildrenToPool() });
|
|
}
|
|
|
|
openConvertPanel(list : any = [], refresh : Boolean = false) {
|
|
console.log("openConvertPanelopenConvertPanelopenConvertPanelopenConvertPanel")
|
|
if (!this.convertPanel || (this.convertPanel && !this.convertPanel.node && !SKUIUtil.isValid(this.convertPanel.node))) {
|
|
this.convertPanel = FGUtil.create("main_ui", "arena_exchange_panel");
|
|
FGUtil.root().addChild(this.convertPanel);
|
|
this.convertPanel.makeFullScreen();
|
|
}
|
|
|
|
FGUtil.dispose(this.arenaPanel);
|
|
this.arenaPanel = null;
|
|
|
|
let listBox = FGUtil.getList(this.convertPanel, "alert/list")
|
|
listBox.removeChildrenToPool();
|
|
this.convertItemsList = []
|
|
if (refresh) {
|
|
console.log(refresh)
|
|
for (let i = 0; i < list.length; i++) {
|
|
let item = listBox.addItemFromPool().asCom;
|
|
this.convertItemsList.push(item);
|
|
let itemData = SKDataUtil.clone(ItemUtil.getItemData(list[i].itemid));
|
|
itemData.price = list[i].price = list[i].price
|
|
FGUtil.getTextField(item, "title").text = itemData.name;
|
|
FGUtil.getTextField(item, "price").text = itemData.price;
|
|
FGUtil.getLoader(item, "icon").texture = ItemUtil.getItemIcon(itemData.icon);
|
|
item.clearClick();
|
|
item.onClick(() => {
|
|
this.selectConvertGoodItems(i, itemData);
|
|
}, this)
|
|
if (i == 0)
|
|
this.selectConvertGoodItems(0, itemData)
|
|
}
|
|
return;
|
|
}
|
|
|
|
var mask = FGUtil.getComponent(this.convertPanel, "mask");
|
|
var close = FGUtil.getButton(this.convertPanel, "alert/n4");
|
|
this.pushCloseEvent(mask, this.convertPanel, () => { listBox.removeChildrenToPool() });
|
|
this.pushCloseEvent(close, this.convertPanel, () => { listBox.removeChildrenToPool() });
|
|
this.initClacPad(FGUtil.getButton(this.convertPanel, "alert/calc"));
|
|
FGUtil.getButton(this.convertPanel, "alert/n48").onClick(() => {
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = "";
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
|
|
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = true
|
|
})
|
|
FGUtil.getButton(this.convertPanel, "alert/reduce").onClick(() => {
|
|
this.reduceGoods();
|
|
})
|
|
FGUtil.getButton(this.convertPanel, "alert/add").onClick(() => {
|
|
this.addGoods();
|
|
})
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").onClick(() => {
|
|
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
|
|
num = num > 0 ? num : 1;
|
|
GameModel.send("c2s_buy_from_npc", {
|
|
nCnt: num,
|
|
nConfigID: 10240,
|
|
nItemID: this.selectedGoodItemsInfo.id
|
|
})
|
|
})
|
|
|
|
GameModel.send("c2s_ask_npc_shop_item", { nNpcConfigID: 10240 })
|
|
}
|
|
|
|
/**
|
|
* 選擇積分兌換商品項目
|
|
* @param idx 商品下標
|
|
*/
|
|
selectConvertGoodItems(idx, info) {
|
|
for (let i in this.convertItemsList) {
|
|
FGUtil.getControl(this.convertItemsList[i], "selected").selectedIndex = i == idx ? 1 : 0;
|
|
}
|
|
this.showConvertGoodInfo(info)
|
|
}
|
|
|
|
/**
|
|
* 顯示積分兌換商品信息
|
|
*/
|
|
showConvertGoodInfo(data : any) {
|
|
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
|
|
return;
|
|
this.selectedGoodItemsInfo = data;
|
|
FGUtil.getTextField(this.convertPanel, "alert/name").text = data.name;
|
|
FGUtil.getTextField(this.convertPanel, "alert/des").text = data.description + "\n【類型】" + data.typedetail + "\n【用途】" + data.usedetail;
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = data.price;
|
|
}
|
|
|
|
/**
|
|
* 減少商品數量
|
|
*/
|
|
reduceGoods() {
|
|
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
|
|
return;
|
|
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
|
|
if (num <= 1)
|
|
return
|
|
num--;
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
|
|
}
|
|
/**
|
|
* 增加商品數量
|
|
*/
|
|
addGoods() {
|
|
if (!this.convertPanel || !this.convertPanel.node || !SKUIUtil.isValid(this.convertPanel.node))
|
|
return;
|
|
var num = parseInt(FGUtil.getTextField(this.convertPanel, "alert/count").text);
|
|
if (num >= 99999)
|
|
return
|
|
num++;
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
|
|
}
|
|
|
|
initClacPad(pad) {
|
|
for (let i = 0; i < 10; i++) {
|
|
FGUtil.getButton(pad, `n${i}`).clearClick();
|
|
FGUtil.getButton(pad, `n${i}`).onClick(() => {
|
|
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
|
|
numStr += i;
|
|
var num = parseInt(numStr);
|
|
if (num >= 99999)
|
|
num = 99999
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = num.toString();
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (num * this.selectedGoodItemsInfo.price).toString();
|
|
})
|
|
}
|
|
|
|
FGUtil.getButton(pad, `n10`).clearClick();
|
|
FGUtil.getButton(pad, `n10`).onClick(() => {
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = "";
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
|
|
})
|
|
FGUtil.getButton(pad, `n12`).clearClick();
|
|
FGUtil.getButton(pad, `n12`).onClick(() => {
|
|
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false;
|
|
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
|
|
if (numStr == "") {
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
|
|
}
|
|
})
|
|
FGUtil.getButton(pad, `mask`).clearClick();
|
|
FGUtil.getButton(pad, `mask`).onClick(() => {
|
|
FGUtil.getComponent(this.convertPanel, "alert/calc").visible = false;
|
|
var numStr = FGUtil.getTextField(this.convertPanel, "alert/count").text;
|
|
if (numStr == "") {
|
|
FGUtil.getTextField(this.convertPanel, "alert/count").text = "1";
|
|
FGUtil.getButton(this.convertPanel, "alert/buy_btn").title = (this.selectedGoodItemsInfo.price).toString();
|
|
}
|
|
})
|
|
}
|
|
|
|
/**
|
|
* 獲取時間對比字符串
|
|
*/
|
|
getTimeStr(str) {
|
|
var timeArr = str.split(/[: -]/)
|
|
if (timeArr.length != 6) return "";
|
|
|
|
var startTime = new Date(timeArr[0], timeArr[1] - 1, timeArr[2], timeArr[3], timeArr[4], timeArr[5]);
|
|
var endTime = new Date();
|
|
var t = (endTime.getTime() - startTime.getTime()) / 1000;
|
|
var num = Math.floor(t);
|
|
if (num < 60)
|
|
return `${num}秒前`;
|
|
|
|
t = t / 60;
|
|
num = Math.floor(t);
|
|
if (num < 60)
|
|
return `${num}分鐘前`;
|
|
|
|
t = t / 60;
|
|
num = Math.floor(t);
|
|
if (num < 24)
|
|
return `${num}小時前`;
|
|
|
|
t = t / 24;
|
|
num = Math.floor(t);
|
|
if (num < 365)
|
|
return `${num}天前`;
|
|
|
|
t = t / 365;
|
|
num = Math.floor(t);
|
|
return `${num}年前`;
|
|
}
|
|
|
|
/**
|
|
* 添加人物UI
|
|
*/
|
|
addUIRole() {
|
|
if (!this.arenaPanel.node || this.prefabObject["UIRole"] == null) return;
|
|
var roleNode = cc.instantiate(this.prefabObject["UIRole"]);
|
|
roleNode.parent = this.arenaPanel.node;
|
|
roleNode.setPosition(this.arenaPanel.node.width / 2 - 276, -285);
|
|
roleNode.getComponent("UIRole").setInfo(GameModel.player)
|
|
roleNode.getComponent("UIRole").offTouchRole();
|
|
}
|
|
|
|
/**
|
|
* 添加關閉事件
|
|
*/
|
|
pushCloseEvent(item : fairygui.GComponent, target : fairygui.GComponent, call : Function = null) {
|
|
item.clearClick();
|
|
item.onClick(() => {
|
|
call && call()
|
|
FGUtil.dispose(target);
|
|
}, this)
|
|
}
|
|
} |