import GameModel from "../core/GameModel"; import ItemUtil from "../core/ItemUtil"; import MsgAlert from "../game/msg/MsgAlert"; import SkillUtil from "../game/skill/core/SkillUtil"; 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; @ccclass export default class RechargeReward extends cc.Component { /** * 充值獎勵單例實例 */ public static Instance: RechargeReward = null; /** * 充值獎勵面板 */ rewardPanel: fgui.GComponent = null; /** * 需要加載的預製體 */ prefabObject: any = {}; /** * 是否正在領取獎勵 */ isRewarding: Boolean = false; /** * 正在領取的獎勵列表 */ rewardList: any = []; /** * 正在領取的是第幾個獎勵 */ rewardIdx: number = -1; /** * 類型 面板1還是面板2 */ panelType: number = 0; onLoad() { if (RechargeReward.Instance === null) { RechargeReward.Instance = this; this.loadPrefab(); } else { this.destroy(); return; } } /** * 加載預製體 */ loadPrefab() { // 加載所需的預製體 var prefabList = [ { url: "Prefabs/BagItemDetail", name: "BagItemDetail" }, { url: "Prefabs/dragonBones", name: "dragonBones" }, ] 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; } }) } } openRewardPanel(refresh: Boolean = false) { if (!this.rewardPanel || (this.rewardPanel && !this.rewardPanel.node && !SKUIUtil.isValid(this.rewardPanel.node))) { this.rewardPanel = FGUtil.create("main_ui", "rechargeRewardPanel"); FGUtil.root().addChild(this.rewardPanel); this.rewardPanel.makeFullScreen(); } this.panelType = 1; this.initRewardList(); // let charge = GameModel.conf_charge["1"]; FGUtil.getTextField(this.rewardPanel, "alert/count").text = String(GameModel.player.chargesum); var mask = FGUtil.getComponent(this.rewardPanel, "mask"); var close = FGUtil.getButton(this.rewardPanel, "alert/n10"); this.pushCloseEvent(mask, this.rewardPanel); this.pushCloseEvent(close, this.rewardPanel); } /** * 添加關閉事件 */ pushCloseEvent(item: fairygui.GComponent, target: fairygui.GComponent, call: Function = null) { item.clearClick(); item.onClick(() => { call && call() this.panelType = -0; this.unscheduleAllCallbacks(); FGUtil.dispose(target); }, this) } /** * 初始化獎勵列表 */ initRewardList() { let reward_list = GameModel.conf_charge_reward; let list = []; for (let i = 1; reward_list[i]; ++i) { let item = reward_list[i]; list.push(item); } list.sort((a, b) => { return a.money - b.money; }); this.fillAmout(GameModel.player.chargesum) let rewardList = FGUtil.getComponent(this.rewardPanel, "alert/n49") var rewalrdLevel = [0, 0, 1, 1, 1, 1, 1, 2, 2] for (let i = 0; i < list.length; i++) { let rewardItem = FGUtil.getComponent(rewardList, `n${i}`); rewardItem.clearClick(); rewardItem.onClick(() => { if (this.isRewarding) { MsgAlert.addMsg("您點擊太快了") return } let arr = []; arr[0] = list[i].gid1; if (list[i].gid2) arr[1] = list[i].gid2; this.rewardList = arr; this.isRewarding = true; this.rewardIdx = i; GameModel.send('c2s_charge_reward', { rewardid: i + 1 }); }) FGUtil.getTextField(rewardItem, "num").text = list[i].money; rewardItem.getController("level").selectedIndex = rewalrdLevel[i]; var rewardsNum = list[i].gid2 ? 2 : 1; if (rewardsNum == 1) { rewardItem.getController("oneReward").selectedIndex = 1; let data = ItemUtil.getItemData(list[i].gid1); FGUtil.getLoader(rewardItem, "reward1").texture = ItemUtil.getItemIconBy(data); FGUtil.getTextField(rewardItem, "reward1Count").text = SKDataUtil.transform(list[i].count1); var r1 = FGUtil.getComponent(rewardItem, "reward1") r1.clearClick(); r1.onClick((eve) => { eve.stopPropagation() this.showInfo(data) }) } else { let data1 = ItemUtil.getItemData(list[i].gid1); FGUtil.getLoader(rewardItem, "reward1").texture = ItemUtil.getItemIconBy(data1); FGUtil.getTextField(rewardItem, "reward1Count").text = SKDataUtil.transform(list[i].count1); var r1 = FGUtil.getComponent(rewardItem, "reward1") r1.clearClick(); r1.onClick((eve) => { eve.stopPropagation() this.showInfo(data1) }) let data2 = ItemUtil.getItemData(list[i].gid2); FGUtil.getLoader(rewardItem, "reward2").texture = ItemUtil.getItemIconBy(data2); FGUtil.getTextField(rewardItem, "reward2Count").text = SKDataUtil.transform(list[i].count2); var r2 = FGUtil.getComponent(rewardItem, "reward2") r2.clearClick(); r2.onClick((eve) => { eve.stopPropagation() this.showInfo(data2) }) } let has_gain = ((GameModel.player.rewardrecord & (1 << (i))) > 0); FGUtil.getControl(rewardItem, "check").selectedIndex = has_gain ? 1 : 0; } } showInfo(itemInfo) { if (itemInfo != null && this.prefabObject["BagItemDetail"] != null) { let detail = cc.instantiate(this.prefabObject["BagItemDetail"]); detail.parent = this.rewardPanel.node; detail.setPosition(this.rewardPanel.node.width / 2, -this.rewardPanel.node.height / 2) detail.name = 'BagItemDetail'; detail.getComponent('BagItemDetail').loadInfo(itemInfo); } } dropItemsToBag() { this.isRewarding = false; let timeWait = 0 if (this.rewardList.length == 0) return FGUtil.getControl(this.rewardPanel, `alert/n49/n${this.rewardIdx}/check`).selectedIndex = 1; for (let i in this.rewardList) { this.scheduleOnce(() => { this.dropItemToBag(this.rewardList[i]) }, timeWait) timeWait += 0.4 } } dropItemToBag(id) { var t = cc.tween; var itemNode = new cc.Node("dropItem"); itemNode.addComponent(cc.Sprite).spriteFrame; var data = ItemUtil.getItemData(id); itemNode.getComponent(cc.Sprite).spriteFrame = ItemUtil.getItemIconBy(data); itemNode.getComponent(cc.Sprite).sizeMode = cc.Sprite.SizeMode.CUSTOM itemNode.width = 50; itemNode.height = 50; itemNode.setPosition(this.rewardPanel.node.width / 2 + 120, -this.rewardPanel.node.height + 80) itemNode.opacity = 0; itemNode.parent = this.rewardPanel.node; t(itemNode) .parallel( t().by(0.4, { y: 80 }), t().to(0.2, { opacity: 255 }) ) .delay(0.15) .call(() => { let bezerby = cc.bezierBy(0.5, [cc.v2(88, 10), cc.v2(130, 80), cc.v2(155, -350)]); itemNode.runAction(cc.sequence(cc.spawn(bezerby, cc.rotateBy(0.3, 90)), cc.removeSelf())); }) .start() } fillAmout(num) { var ratioArr = [0, 7.2, 18.8, 30, 41, 52.2, 63.5, 75, 86, 97] var moneyArr = [0, 30, 98, 300, 600, 2000, 3000, 4500, 6000, 10000] var ratio = 0; if (num >= 10000) { FGUtil.getImage(this.rewardPanel, "alert/n49/sz1").fillAmount = 1 return; } for (let i = 1; i < 10; i++) { if (num < moneyArr[i]) { ratio = ratioArr[i - 1] + (ratioArr[i] - ratioArr[i - 1]) * ((num - moneyArr[i - 1]) / moneyArr[i]) break; } } FGUtil.getImage(this.rewardPanel, "alert/n49/sz1").fillAmount = ratio / 100; } openRewardPanel2(refresh: Boolean = false) { if (!this.rewardPanel || (this.rewardPanel && !this.rewardPanel.node && !SKUIUtil.isValid(this.rewardPanel.node))) { this.rewardPanel = FGUtil.create("main_ui", "rechargeRewardPanel2"); FGUtil.root().addChild(this.rewardPanel); this.rewardPanel.makeFullScreen(); } this.panelType = 2; let charge = GameModel.conf_charge["1"]; // var num = GameModel.player.chargesum * (charge.jade / charge.money) var num = GameModel.player.chargesum; FGUtil.getTextField(this.rewardPanel, "alert/count").text = String(num); this.initRewardList2(num); var mask = FGUtil.getComponent(this.rewardPanel, "mask"); var close = FGUtil.getButton(this.rewardPanel, "alert/close"); this.pushCloseEvent(mask, this.rewardPanel); this.pushCloseEvent(close, this.rewardPanel); if (this.prefabObject["dragonBones"] != null) { var db = cc.instantiate(this.prefabObject["dragonBones"]); db.setPosition(10, -120) db.parent = FGUtil.getComponent(this.rewardPanel, "alert/role").node; } } /** * 初始化獎勵列表 */ initRewardList2(num) { let reward_list = GameModel.conf_charge_reward2; let list = []; for (let i = 1; reward_list[i]; ++i) { let item = reward_list[i]; list.push(item); } list.sort((a, b) => { return a.money - b.money; }); let rewardList = FGUtil.getList(this.rewardPanel, "alert/list") rewardList.removeChildrenToPool(); for (let i = 0; i < list.length; i++) { let rewardItem = rewardList.addItemFromPool().asCom; FGUtil.getTextField(rewardItem, "title").text = `累計充值${list[i].money}元(${num}元/${list[i].money}元)` let has_gain = ((GameModel.player.rewardrecord & (1 << (i))) > 0); let getBtn = FGUtil.getButton(rewardItem, "get_btn"); let flag = FGUtil.getComponent(rewardItem, "flag"); // console.log("是否領取", i, has_gain) if (has_gain) { flag.visible = true; getBtn.visible = false; } else { flag.visible = false; if (num >= list[i].money) { getBtn.data = i + 1; getBtn.onClick(this.clickGet, this); } else { getBtn.visible = false } } for (let j = 0; j < list[i].list.length; j++) { let itemData = ItemUtil.getItemData(list[i].list[j].itemIid); let itemBtn = FGUtil.getButton(rewardItem, `item_${j + 1}`); itemBtn.icon = `ui://main_ui/${itemData.icon}`; itemBtn.clearClick(); itemBtn.onClick((eve) => { eve.stopPropagation() this.showInfo(itemData) }) let tip = FGUtil.getTextField(itemBtn, "tip"); tip.text = `${SKDataUtil.transform(list[i].list[j].count)}`; tip.visible = true; let anim = FGUtil.getAnim(itemBtn, "effect"); anim.visible = getBtn.visible; anim.playing = getBtn.visible; } } } clickGet(event: fgui.Event) { if (this.isRewarding) { MsgAlert.addMsg("您點擊太快了") return } this.isRewarding = true; let temp = fgui.GObject.cast(event.currentTarget); let idx = temp.data; let rewardList = FGUtil.getList(this.rewardPanel, "alert/list") var rewardItem = rewardList.getChildAt(idx - 1).asCom; let getBtn = FGUtil.getButton(rewardItem, "get_btn"); let flag = FGUtil.getComponent(rewardItem, "flag"); getBtn.visible = false flag.visible = true GameModel.send('c2s_charge_reward', { rewardid: idx }); this.scheduleOnce(() => { this.isRewarding = false; }, 0.5) } openRewardPanel3(refresh: Boolean = false) { if (!SKUIUtil.isFGUIValid(this.rewardPanel)) { this.rewardPanel = FGUtil.create("main_ui", "rechargeRewardPanel3"); FGUtil.root().addChild(this.rewardPanel); this.rewardPanel.makeFullScreen(); } this.panelType = 3; var num = GameModel.player.chargesum; FGUtil.getTextField(this.rewardPanel, "alert/count").text = String(num); this.initRewardList3(num); var mask = FGUtil.getComponent(this.rewardPanel, "mask"); var close = FGUtil.getButton(this.rewardPanel, "alert/close"); this.pushCloseEvent(mask, this.rewardPanel); this.pushCloseEvent(close, this.rewardPanel); } initRewardList3(num) { let reward_list = GameModel.conf_charge_reward3; let list = []; for (let i = 1; reward_list[i]; ++i) { let item = reward_list[i]; list.push(item); } list.sort((a, b) => { return a.money - b.money; }); let rewardList = FGUtil.getList(this.rewardPanel, "alert/list") rewardList.removeChildrenToPool(); for (let i = 0; i < list.length; i++) { let rewardItem = rewardList.addItemFromPool().asCom; FGUtil.getTextField(rewardItem, "title").text = `累計充值${list[i].money}元(${num}元/${list[i].money}元)` let has_gain = ((GameModel.player.sprewardrecord & (1 << (i))) > 0); let getBtn = FGUtil.getButton(rewardItem, "get_btn"); let flag = FGUtil.getComponent(rewardItem, "flag"); if (has_gain) { flag.visible = true; getBtn.visible = false; } else { flag.visible = false; if (num >= list[i].money) { getBtn.data = i + 1; getBtn.onClick(this.clickGet3, this); } else { getBtn.visible = false } } for (let j = 0; j < 4; j++) { if (j >= list[i].list.length) { FGUtil.getButton(rewardItem, `item_${j + 1}`).visible = false; continue } let itemData = ItemUtil.getItemData(list[i].list[j].itemIid); let itemBtn = FGUtil.getButton(rewardItem, `item_${j + 1}`); itemBtn.visible = true itemBtn.icon = `ui://main_ui/${itemData.icon}`; itemBtn.clearClick(); itemBtn.onClick((eve) => { eve.stopPropagation() this.showInfo(itemData) }) let tip = FGUtil.getTextField(itemBtn, "tip"); tip.text = `${SKDataUtil.transform(list[i].list[j].count)}`; tip.visible = true; let anim = FGUtil.getAnim(itemBtn, "effect"); anim.visible = getBtn.visible; anim.playing = getBtn.visible; } } } clickGet3(event: fgui.Event) { if (this.isRewarding) { MsgAlert.addMsg("您點擊太快了") return } this.isRewarding = true; let temp = fgui.GObject.cast(event.currentTarget); let idx = temp.data; let rewardList = FGUtil.getList(this.rewardPanel, "alert/list") var rewardItem = rewardList.getChildAt(idx - 1).asCom; let getBtn = FGUtil.getButton(rewardItem, "get_btn"); let flag = FGUtil.getComponent(rewardItem, "flag"); getBtn.visible = false flag.visible = true GameModel.send('c2s_special_reward', { rewardid: idx }); this.scheduleOnce(() => { this.isRewarding = false; }, 0.5) } }