2025-04-24 17:03:28 +08:00

453 lines
16 KiB
TypeScript

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)
}
}