You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
470 lines
16 KiB
470 lines
16 KiB
import { _decorator, Component, Node, sys } from 'cc';
|
|
import { Singleton } from '../../mx/tools/Singleton';
|
|
import { ItemNumType, OtherDataType, StatisticsType, StatusType } from '../game/GameData';
|
|
import { TableNames } from '../game/ConfigTableData';
|
|
import { DEBUG, DEV } from 'cc/env';
|
|
import { sdkConfig } from '../sdk/sdkConfig';
|
|
import { ItemData } from '../game/ConfigProjectData';
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
/**内购模块 */
|
|
@ccclass('Purchase')
|
|
export class Purchase extends Singleton {
|
|
|
|
/**购买商品 */
|
|
buy(payId: string, callback: Function) {
|
|
if (DEV || DEBUG || sys.isBrowser) {
|
|
callback(true);
|
|
return;
|
|
}
|
|
if (!sdkConfig.isIAPVersion) {
|
|
gg.sdk.showVideoAd(callback);
|
|
return;
|
|
}
|
|
|
|
|
|
//验证时间
|
|
gg.sdk.checkTime((curentTime) => {
|
|
if (curentTime) {
|
|
console.error("时间异常");
|
|
gg.ui.showToast("时间异常,请检查时间设置");
|
|
} else {
|
|
//在这后面调内购的API并返回callback回调....
|
|
callback(true);
|
|
|
|
|
|
|
|
|
|
|
|
gg.data.saveToServer(null, true);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**每天重置 */
|
|
everyDayInit() {
|
|
gg.data.setStatus(StatusType.MonCardDailyReward1, 0);
|
|
gg.data.setStatus(StatusType.MonCardDailyReward2, 0);
|
|
gg.data.setStatus(StatusType.MonCardDailyReward3, 0);
|
|
this.resetCurentFinishBuyContinuousBag();
|
|
}
|
|
|
|
/**根据商品key获取支付配置信息 */
|
|
getPayConfig(payId: string) {
|
|
let payConfig = gg.data.table.getTableList<ITablePay>(TableNames.Pay).find(x => x.payId == payId);
|
|
if (!payConfig) {
|
|
console.error("未找到支付配置", payId);
|
|
return null;
|
|
}
|
|
return payConfig;
|
|
}
|
|
|
|
//#region 月卡相关
|
|
/**
|
|
* 判断是否激活月卡(1:小月卡,2:大月卡,3:终身卡)
|
|
*/
|
|
isActiveMonCard(type: MonthCardType = MonthCardType.Small) {
|
|
let t = this.getMonCardStatisticsType(type);
|
|
let expireTime = gg.data.getStatistics(t);
|
|
let now = gg.sdk.getServerTime();
|
|
return expireTime > now;
|
|
}
|
|
/**获取月卡剩余时间 */
|
|
getMonCardRemainTime(type: MonthCardType = MonthCardType.Small) {
|
|
let t = this.getMonCardStatisticsType(type);
|
|
let expireTime = gg.data.getStatistics(t);
|
|
let now = gg.sdk.getServerTime();
|
|
return Math.max(0, expireTime - now);
|
|
}
|
|
/**激活月卡 */
|
|
activeMonCard(type: MonthCardType = MonthCardType.Small) {
|
|
//剩余时间
|
|
let now = gg.sdk.getServerTime();
|
|
let remainTime = this.getMonCardRemainTime(type);
|
|
let expireTime = remainTime + now + 1000 * 60 * 60 * 24 * 30;
|
|
if (type == MonthCardType.Forever)//终身卡
|
|
expireTime = 999999999999999999;
|
|
|
|
let t = this.getMonCardStatisticsType(type);
|
|
gg.data.setStatistics(t, expireTime);
|
|
}
|
|
|
|
/**领取月卡每日奖励 */
|
|
getDailyReward(type: MonthCardType = MonthCardType.Small) {
|
|
let t = this.getMonCardStatusType(type);
|
|
gg.data.setStatus(t, 1);
|
|
}
|
|
|
|
/**今日月卡奖励是否已经领取 */
|
|
isGetDailyReward(type: MonthCardType = MonthCardType.Small) {
|
|
let isActiv = this.isActiveMonCard(type);
|
|
if (!isActiv) return true;
|
|
let t = this.getMonCardStatusType(type);
|
|
return gg.data.getStatus(t) == 1;
|
|
}
|
|
|
|
/**根据类型获取状态类型 */
|
|
getMonCardStatusType(type: MonthCardType = MonthCardType.Small) {
|
|
let t = StatusType.MonCardDailyReward1;
|
|
if (type == MonthCardType.Big) t = StatusType.MonCardDailyReward2;
|
|
if (type == MonthCardType.Forever) t = StatusType.MonCardDailyReward3;
|
|
return t;
|
|
}
|
|
/**根据类型获取月卡统计类型 */
|
|
getMonCardStatisticsType(type: MonthCardType = MonthCardType.Small) {
|
|
let t = StatisticsType.MonCardExpireTime1;
|
|
if (type == MonthCardType.Big) t = StatisticsType.MonCardExpireTime2;
|
|
if (type == MonthCardType.Forever) t = StatisticsType.MonCardExpireTime3;
|
|
return t;
|
|
}
|
|
|
|
/**获取出怪倍数 */
|
|
getMonCardSpawerTimeScale() {
|
|
let count = 0;
|
|
for (let key in MonthCardType) {
|
|
let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
let isActiv = this.isActiveMonCard(typeNum);
|
|
let data = this.getMonCardFunctionData(typeNum, 1);
|
|
if (isActiv && data && data.function_num > count) count = data.function_num;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
/**获取免费刷新次数 */
|
|
getFreeRefreshTimes() {
|
|
let count = 0;
|
|
for (let key in MonthCardType) {
|
|
let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
let isActiv = this.isActiveMonCard(typeNum);
|
|
let data = this.getMonCardFunctionData(typeNum, 2);
|
|
if (isActiv && data) count += data.function_num;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
/**获取每日关卡及副本免费扫荡次数 */
|
|
getFreeSweepTimes(type: MonthCardType = null) {
|
|
let count = 0;
|
|
for (let key in MonthCardType) {
|
|
let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
if (type && typeNum != type) continue;
|
|
let isActiv = this.isActiveMonCard(typeNum);
|
|
let data = this.getMonCardFunctionData(typeNum, 3);
|
|
if (isActiv && data) count += data.function_num;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
/**是否可以卸载彩虹飞弹 */
|
|
isCanUninstallRainbowBullet() {
|
|
for (let key in MonthCardType) {
|
|
let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
let isActiv = this.isActiveMonCard(typeNum);
|
|
let data = this.getMonCardFunctionData(typeNum, 4);
|
|
if (isActiv && data) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**获取主线奖励加成 */
|
|
getMainLineRewardAdd() {
|
|
let count = 0;
|
|
// for (let key in MonthCardType) {
|
|
// let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
// let isActiv = this.isActiveMonCard(typeNum);
|
|
// let data = this.getMonCardFunctionData(typeNum, 5);
|
|
// if (isActiv && data) count += data.function_num;
|
|
// }
|
|
return count / 10000;
|
|
}
|
|
|
|
|
|
/**根据月卡类型和功能类型查询月卡功能数据 */
|
|
getMonCardFunctionData(type: MonthCardType, functionType: number) {
|
|
return gg.data.table.getTableList<ITableMonthCard>(TableNames.MonthCard).find(x => x.type == type && x.function_type == functionType);
|
|
}
|
|
|
|
/**检查是否有可领取的月卡奖励 */
|
|
checkHaveCanGetMonthReward() {
|
|
for (let key in MonthCardType) {
|
|
let typeNum = MonthCardType[key as keyof typeof MonthCardType]
|
|
let isActiv = this.isActiveMonCard(typeNum);
|
|
let isGet = this.isGetDailyReward(MonthCardType.Small);
|
|
if (isActiv && !isGet) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//#endregion
|
|
|
|
//#region 首充礼包
|
|
/**根据天数获取首充礼包数据 */
|
|
getFirstRechargeData() {
|
|
let dataList = gg.data.table.getTableList<ITableFirstBag>(TableNames.FirstBag);
|
|
return dataList;
|
|
}
|
|
/**是否已经购买 */
|
|
isBuyFirstRecharge() {
|
|
return gg.data.getStatus(StatusType.FirstRecharge) > 0;
|
|
}
|
|
/**激活首充礼包 */
|
|
activeFirstRecharge() {
|
|
gg.data.setStatus(StatusType.FirstRecharge, gg.sdk.getServerTime());
|
|
}
|
|
/**根据天数设置领取首充礼包状态 */
|
|
setGetFirstRecharge(day: number) {
|
|
gg.data.setkeyKeyValue(OtherDataType.FirstRechargeGetRewardStatus, day, "1");
|
|
}
|
|
/**根据天数检查是否已经领取 */
|
|
isGetFirstRecharge(day: number) {
|
|
let status = gg.data.getkeyKeyValue(OtherDataType.FirstRechargeGetRewardStatus, day);
|
|
return status == "1";
|
|
}
|
|
/**根据天数判断是否可以领取 */
|
|
canGetFirstRecharge(day: number) {
|
|
if (!this.isBuyFirstRecharge()) return false;
|
|
let activeTime = gg.data.getStatus(StatusType.FirstRecharge);
|
|
let now = gg.sdk.getServerTime();
|
|
let diff = now - activeTime;
|
|
let dayDiff = Math.floor(diff / (1000 * 60 * 60 * 24));
|
|
return dayDiff >= day - 1;
|
|
}
|
|
/**检查是否有可领取的首充礼包 */
|
|
checkFirstRechargeCanGet() {
|
|
if (!this.isBuyFirstRecharge()) return false;
|
|
for (let i = 1; i <= 3; i++) {
|
|
let canGet = this.canGetFirstRecharge(i);
|
|
let isfinish = this.isGetFirstRecharge(i);
|
|
if (canGet && !isfinish) return true;
|
|
}
|
|
return false;
|
|
}
|
|
//#endregion
|
|
|
|
//#region 连续礼包
|
|
/**获取当前可以购买的连续礼包列表 */
|
|
getCurentCanGetContinuousBagList(day: number) {
|
|
let list = this.getContinuousList(day);
|
|
if (list.length == 0) return [];
|
|
let curentBuyIndex = this.getCurentFinishBuyContinuousBag();
|
|
let resultList: ContinuousBagData[] = list.filter(x => x.index > curentBuyIndex);
|
|
return resultList;
|
|
}
|
|
/**获取当前连续礼包列表 */
|
|
getContinuousList(day: number) {
|
|
let dataList: ContinuousBagData[] = [];
|
|
let config = this.getContinuousBagData(day);
|
|
if (config) {
|
|
dataList = gg.purchase.parseContinuousBagData(config.reward);
|
|
}
|
|
return dataList;
|
|
}
|
|
/**根据天数获取连续礼包配置 */
|
|
getContinuousBagData(day: number) {
|
|
let dataList = gg.data.table.getTableList<ITableContinueBag>(TableNames.ContinueBag);
|
|
let data: ITableContinueBag = null;
|
|
for (let i = day; i > 1; i--) {
|
|
data = dataList.find(x => x.id == i);
|
|
if (data) break;
|
|
}
|
|
return data;
|
|
}
|
|
/**解析连续礼包配置 */
|
|
parseContinuousBagData(configStr: string) {
|
|
// 支付id;奖励1|奖励2#支付id;奖励1|奖励2 */
|
|
// 字符串解析规则:#分割档位,;分割类型和奖励,|分割奖励
|
|
let result: ContinuousBagData[] = [];
|
|
let arr = configStr.split("#");
|
|
for (let i = 0; i < arr.length; i++) {
|
|
let item = arr[i];
|
|
let data = new ContinuousBagData();
|
|
let arr2 = item.split(";");
|
|
data.index = i + 1;
|
|
data.payID = arr2[0];
|
|
let rewardStr = arr2[1];
|
|
let rewardArr = rewardStr.split("|");
|
|
for (let j = 0; j < rewardArr.length; j++) {
|
|
let [id, num] = rewardArr[j].split(",");
|
|
let itemData = new ItemData(Number(id), parseInt(num));
|
|
itemData.staticData = gg.data.table.getItemData(Number(id));
|
|
data.rewards.push(itemData);
|
|
}
|
|
result.push(data);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
/**获取当前购买的连续礼包索引 */
|
|
getCurentFinishBuyContinuousBag() {
|
|
return gg.data.getStatus(StatusType.CurrentBuyContinuousBagIndex);
|
|
}
|
|
/**设置当前购买的连续礼包索引 */
|
|
setCurentFinishBuyContinuousBag(index: number) {
|
|
gg.data.setStatus(StatusType.CurrentBuyContinuousBagIndex, index);
|
|
}
|
|
/**重置当前购买的连续礼包索引 */
|
|
resetCurentFinishBuyContinuousBag() {
|
|
this.setCurentFinishBuyContinuousBag(0);
|
|
}
|
|
/**根据天数验证是否有连续礼包可显示 */
|
|
canShowContinuousBag(day: number) {
|
|
let data = this.getCurrentUnlockedContinuousBag(day);
|
|
return data != null;
|
|
}
|
|
/**检查是否有可领取的免费连续礼包 */
|
|
checkCanGetFreeContinuousBag(day: number) {
|
|
let daily = this.getCurrentUnlockedContinuousBag(day);
|
|
return daily && daily.payID == "0";
|
|
}
|
|
/**获取当前解锁的连续礼包 */
|
|
getCurrentUnlockedContinuousBag(day: number) {
|
|
let list = this.getCurentCanGetContinuousBagList(day);
|
|
if (list.length == 0) return null;
|
|
return list[0];
|
|
}
|
|
//#endregion
|
|
|
|
//#region 基金
|
|
/**获取基金配置列表 */
|
|
getFundList() {
|
|
let dataList = gg.data.table.getTableList<ITableFund>(TableNames.Fund);
|
|
return dataList;
|
|
}
|
|
/**检查基金是否开放 */
|
|
checkIsOpen() {
|
|
return gg.data.doc.chapter > 3;
|
|
}
|
|
/**检查基金是否已购买 */
|
|
checkIsBuyFund() {
|
|
return gg.data.getStatus(StatusType.CurrentBuyFundIndex) > 0;
|
|
}
|
|
/**设置已经购买基金索引 */
|
|
setCurentFinishBuyFundIndex(index: number) {
|
|
gg.data.setStatus(StatusType.CurrentBuyFundIndex, index);
|
|
}
|
|
/**根据等级查询是否已经领取等级基金奖励
|
|
* @param lv 等级
|
|
* @param isPay 是否付费
|
|
* @returns 是否已领取
|
|
*/
|
|
checkIsGetFundReward(lv: number, isPay = false) {
|
|
let t = isPay ? OtherDataType.PayFundRewardLv : OtherDataType.FreeFundRewardLv;
|
|
let arr = gg.data.getArrayData(t);
|
|
let index = arr.indexOf(lv + "");
|
|
return index >= 0;
|
|
}
|
|
/**设置已领取基金奖励状态 */
|
|
setGetFundRewardStatus(lv: number, isPay) {
|
|
if (this.checkIsGetFundReward(lv, isPay)) return;
|
|
let t = isPay ? OtherDataType.PayFundRewardLv : OtherDataType.FreeFundRewardLv;
|
|
let arr = gg.data.getArrayData(t);
|
|
arr.push(lv + "");
|
|
gg.data.setArrayData(t, arr);
|
|
}
|
|
/**获取所有基金付费奖励的钻石数量 */
|
|
getAllFundPayRewardNum() {
|
|
let dataList = this.getFundList();
|
|
let num = 0;
|
|
for (let i = 0; i < dataList.length; i++) {
|
|
let data = dataList[i];
|
|
let rewardStrArr = data.buy_reward.split("|");
|
|
let [id, itemNum] = rewardStrArr[0].split(",");
|
|
if (Number(id) == ItemNumType.diamond) num += parseInt(itemNum);
|
|
}
|
|
return num;
|
|
}
|
|
/**检查是否有可领取的基金奖励 */
|
|
checkCanGetFundReward() {
|
|
let isPay = this.checkIsBuyFund();
|
|
let lv = gg.game.getRoleLv();
|
|
let list = this.getFundList();
|
|
for (let i = 0; i < list.length; i++) {
|
|
let data = list[i];
|
|
if (data.player_level > lv) break;
|
|
if (!this.checkIsGetFundReward(data.player_level, false)) return true;
|
|
if (isPay && !this.checkIsGetFundReward(data.player_level, true)) return true;
|
|
}
|
|
return false;
|
|
}
|
|
//#endregion
|
|
|
|
//#region 章节礼包
|
|
/**获取可显示的章节礼包 */
|
|
getCanShowChapterGiftList() {
|
|
let chapter = gg.data.doc.chapter;
|
|
let list = gg.data.table.getTableList<ITableChapter_chest>(TableNames.Chapter_chest);
|
|
let result: ITableChapter_chest[] = [];
|
|
for (let i = 0; i < list.length; i++) {
|
|
let data = list[i];
|
|
if (data.chapter > chapter) {
|
|
if (result.length == 0) {
|
|
result.push(data);
|
|
}
|
|
break;
|
|
}
|
|
if (!this.checkIsBuyChapterGift(data.chapter)) {
|
|
result.push(data);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
/**检查章节礼包是否已购买 */
|
|
checkIsBuyChapterGift(chapterid: number) {
|
|
let arr = gg.data.getArrayData(OtherDataType.ChapterGiftBuy);
|
|
let index = arr.indexOf(chapterid + "");
|
|
return index >= 0;
|
|
}
|
|
/**设置章节礼包已购买 */
|
|
setChapterGiftBuy(chapterid: number) {
|
|
if (this.checkIsBuyChapterGift(chapterid)) return;
|
|
let arr = gg.data.getArrayData(OtherDataType.ChapterGiftBuy);
|
|
arr.push(chapterid + "");
|
|
gg.data.setArrayData(OtherDataType.ChapterGiftBuy, arr);
|
|
}
|
|
//#endregion
|
|
|
|
//#region 钻石商店
|
|
/**获取钻石商店配置列表 */
|
|
getDiamondShopList() {
|
|
let dataList = gg.data.table.getTableList<ITableShopBuy>(TableNames.ShopBuy);
|
|
return dataList;
|
|
}
|
|
/**检查是否已购买过钻石商店商品 */
|
|
checkIsBuyDiamondShop(payID: string) {
|
|
let arr = gg.data.getArrayData(OtherDataType.BuyDiamondShop);
|
|
let index = arr.indexOf(payID);
|
|
return index >= 0;
|
|
}
|
|
/**设置已购买钻石商店商品 */
|
|
setBuyDiamondShop(payID: string) {
|
|
if (this.checkIsBuyDiamondShop(payID)) return;
|
|
let arr = gg.data.getArrayData(OtherDataType.BuyDiamondShop);
|
|
arr.push(payID);
|
|
gg.data.setArrayData(OtherDataType.BuyDiamondShop, arr);
|
|
}
|
|
|
|
//#endregion
|
|
|
|
}
|
|
|
|
/**月卡类型 */
|
|
export enum MonthCardType {
|
|
/**小月卡 */
|
|
Small = 1,
|
|
/**大月卡 */
|
|
Big = 2,
|
|
/**终身卡 */
|
|
Forever = 3,
|
|
}
|
|
|
|
export class ContinuousBagData {
|
|
/**索引 */
|
|
index: number = 1;
|
|
/**天数 */
|
|
payID: string = "";
|
|
/**奖励 */
|
|
rewards: ItemData[] = [];
|
|
}
|
|
|
|
|
|
|