消消方块阵换皮表情
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.
 
 
 

2014 lines
75 KiB

import { Game, game, sys } from 'cc';
import { ConfigTableData, IBoxLevelData, IRoleLevelData, IShopItemData, ITaskData, ITaskRewardData, TableNames } from './ConfigTableData';
import { Singleton } from '../../mx/tools/Singleton';
import { ConfigProjectData as Project } from './ConfigProjectData';
import { DEBUG, EDITOR } from 'cc/env';
import { GEvent } from '../../mx/module/event/GEvent';
import MTools from '../../mx/tools/MTools';
import { ConstManager, ConstEnum } from '../manager/ConstManager';
import { ChapterDataManager, BattleType, ChapterDifficulty } from '../manager/ChapterDataManager';
import { sdkConfig } from '../sdk/sdkConfig';
import { ConstReplicaEnum } from '../manager/ConstReplicaManager';
/**
* 游戏数据
*/
export class GameData extends Singleton {
/**是否首次登录(新玩家注册) */
get IsFirstLogin() { return this._IsFirstLogin; }
/**今天是否首次登录 */
get IsFirstLoginToday() { return this._IsFirstLoginToday; }
set IsFirstLoginToday(isFirst) { this._IsFirstLoginToday = isFirst }
/**登录天数 */
get LoginDays() { return this._LoginDays; }
/**离线时长(单位:秒) */
get OfflineTime() { return this._OfflineTime; }
/**本次登录在线时长(单位:秒) */
get OnlineTime() { return this._OnlineTime; }
/**当日累计在线时长(单位:秒) */
get OnlineTimeForToDay() { return this._OnlineTimeForToDay; }
/**所有累计在线时长(单位:秒) */
get OnlineTimeForAll() { return this._OnlineTimeForAll; }
/**当前登录时的日期 */
get CurrentLoginDate() { return this._CurrentLoginDate; }
private _IsFirstLogin = false;
private _IsFirstLoginToday = false;
private _LoginDays = 0;
private _OfflineTime = 0;
private _OnlineTime = 0;
private _OnlineTimeForToDay = 0;
private _OnlineTimeForAll = 0;
private _docName = "doc";
/**当前登录时的日期 */
private _CurrentLoginDate = -1;
/**项目配表数据 */
table: ConfigTableData = ConfigTableData.getInstance();
/**项目动态逻辑数据 */
project: Project = Project.getInstance();
/**初始化 */
init(docName, userData) {
// userData = '{"key":"","uid":"","playerTitleLevel":0,"dataVersion":14,"chapter":2,"level":1,"itemCount":["4_24","2_50","1_200","3_10","21_6","27_3","25_1","26_1","29_1"],"status":["2_2"],"statistics":["3_1766805850400","5_300","6_300","8_1766834348327","21_200","25_3","22_10","26_0","303_6","304_6","305_0","308_2","309_8","310_0","331_1","318_1766834643292"],"guide":[],"other":["37_","29_1&1&10&2&0|2&1&10&2&1|3&1&0&0&0|4&1&10&2&2|5&1&10&2&3|6&1&10&2&4|7&1&10&2&5|8&1&0&0&0|9&1&10&2&6|10&1&0&0&0|11&1&10&2&7|12&1&0&0&0|13&1&0&0&0|14&1&0&0&0|15&1&0&0&0|16&1&0&0&0|17&1&0&0&0|18&1&0&0&0|19&1&0&0&0","33_0&0&1","34_0&10&0&0&0&0&0","43_0&0&0&0&0","44_0&0&0&0&0","45_0&1&1&0&0&0&0&0&0&0&6&0&0&0","46_0&0&0&0&0&0&0&0&0&0&0&0&0&0","30_1|1#2|1","35_100&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0"],"onlyLocal":[]}'
if (userData && typeof userData === "object" && !Array.isArray(userData) && userData["key"] && userData["key"] != "") {
this._docName = userData["key"];
}
if (docName != "") {
this._docName = docName;
}
this.doc = new Doc();
this.initDoc();
let LocalStr = sys.localStorage.getItem(this._docName);
////本地测试时,调取的存档字符串,记得发布时注释
//LocalStr = `{"key":"","uid":"","playerTitleLevel":0,"dataVersion":17996,"chapter":40,"level":1,"itemCount":["4_30","2_50","1_4944","3_3386","21_1387","25_1299","27_271","26_463","29_413","31_327","24_429","33_47","22_474","28_131","32_77","35_97","36_72","34_35","106_155","30_19","99_2","23_20","37_118","38_66","39_11","97_1"],"status":["2_2","5_0","4_1"],"statistics":["3_1768306060819","5_118","6_250284","8_1767995850105","21_1094834","25_106","22_27075","26_68","303_6","304_6","305_0","308_0","309_3","330_26","310_17","331_0","318_1767959448067","312_10","23_1089890","27_106","316_0","311_0","336_4","4_25","7_1768334223735","314_0","315_0","317_0","319_0","324_0","332_0","322_1","323_1","327_1","334_0","326_0","325_0","24_23689","28_67","306_21300","320_2","333_5","329_0","328_1","337_5","335_0"],"guide":[],"other":["37_","29_1&18&10&2&0|2&16&10&2&3|3&11&0&2&6|4&16&10&1&-1|5&18&10&1&-1|6&16&10&1&-1|7&28&10&1&-1|8&11&0&1&-1|9&16&10&1&-1|10&11&0&1&-1|11&16&10&1&-1|12&11&0&2&5|13&24&0&1&-1|14&11&0&2&1|15&11&0&2&7|16&11&0&2&4|17&10&0&1&-1|18&10&0&1&-1|19&12&0&2&2","33_2&0","34_280&530&930&4500&7&3&0","43_0&0&0&0&0","44_0&0&0&0&0","45_0&0&0&0&0&0&0&0&0&0&0&0&0&0","46_0&0&0&0&0&0&0&0&0&0&0&0&0&0","30_1|1#2|1#3|3#4|2#5|6#6|6#7|6#8|4#9|8#10|6#11|3#12|11#13|8#14|12#15|4#16|23#17|6#18|10#19|10#10021|6#10022|1#10023|1#10024|1#10025|22#10001|4#10011|270#10012|2#10013|10#20|13#21|10#22|33#10002|1#1001|1#2001|1#1002|1#2002|1#1003|1#2003|1#1004|1#2004|1#23|13#1005|1#24|22#25|24#26|16#27|24#64|1#59|1#65|1#66|1#69|1#41|2#33|9#45|1#30|31#32|83#28|5#29|4#31|37#34|37#35|14#36|14#37|8#38|13#39|36#40|67","35_100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#98&1&1&0#32&1&0&0#0&0&0&0#0&0&0&0#0&0&0&0#34&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#40&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#31&0&0&0#58&0&0&0#45&0&0&0#0&0&0&0#0&0&0&0#32&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0","40_100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#73&1&1&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0","41_100&1&1&1#100&1&1&1#100&1&1&1#100&1&1&1#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0#0&0&0&0","32_1|10|0&24|7|1&9|10|1&8|10|1&69|5|1&55|9|1","31_3|2#5|3#6|2#7|3#8|2#9|7#10|5#11|2#12|9#13|6#14|8#15|2#16|18#17|3#18|8#19|9#10025|9#10001|3#10011|231#10013|5#20|12#21|7#22|29#23|9#1005|1#24|19#25|19#26|13#27|23#64|1#59|1#65|1#66|1#69|1#41|2#45|1#30|29#32|71#28|4#29|3#31|33#33|7#34|36#35|13#36|13#37|7#38|12#39|34#40|66","36_5&2|16&2","38_,1001,1002,1003,1004","39_,2001,2002,2003,2004","50_wuqi|2#daoju|2#wujin|2#baoxiang|2"],"onlyLocal":[],"failCount":0,"lastFailCount":0}`
let local = LocalStr ? JSON.parse(LocalStr) : null;
let myChapterid = -1
if (local) {
myChapterid = local["chapter"];
}
let sd = null
if (userData != null && userData !== "") {
if (typeof userData === "string") {
try {
sd = JSON.parse(userData);
} catch (parseErr) {
console.error("[GameData.init] 存档 JSON 解析失败", parseErr);
sd = null;
}
} else if (typeof userData === "object") {
sd = userData as any;
}
if (sd) {
let serverChapterId = sd["chapter"];
if (serverChapterId < myChapterid) {
sd = null;
gg.sdk.reportDY("inLevel", `存档异常-使用本地数据${myChapterid}|${serverChapterId}`);
let str = typeof userData === "string" ? userData : JSON.stringify(userData);
if (str.length > 350) {
str = str.substring(0, 350);
}
gg.sdk.reportDY("inLevel", `存档异常-远端数据|${str}`);
let str2 = LocalStr;
if (LocalStr && LocalStr.length > 350) {
str2 = LocalStr.substring(0, 350);
}
gg.sdk.reportDY("inLevel", `存档异常-本地数据|${str2}`);
}
}
}
if (sd) {
for (let key in this.doc) {
if (Object.prototype.hasOwnProperty.call(sd, key))
this.doc[key] = sd[key];
}
//上报数据
//恢复仅存本地的数据
if (local) {
console.log("恢复仅存本地的数据", local.onlyLocal);
this.doc.onlyLocal = local.onlyLocal;
}
let _IsFirstLogin = this.getStatus(StatusType.IsFirstLogin) == 0
gg.sdk.reportDY("inLevel", `
-IsFirstLogin=${_IsFirstLogin}`);
} else if (local) {
for (let key in this.doc) {
if (Object.prototype.hasOwnProperty.call(local, key))
this.doc[key] = local[key];
}
//上报数据
let _IsFirstLogin = this.getStatus(StatusType.IsFirstLogin) == 0
gg.sdk.reportDY("inLevel", `首次登录本地-IsFirstLogin=${_IsFirstLogin}`);
}
//首次登录
this._IsFirstLogin = this.getStatus(StatusType.IsFirstLogin) == 0
// let n = this.getStatus(StatusType.IsFirstLogin)
// if (n == 0 || n == 1) {
// console.error("首次登录重置数据", n);
// this.reset(null, '首次登录重置')
// }
this.setStatus(StatusType.IsFirstLogin, 2);
if (this.project.syncNormalChapterProgress()) {
this.saveLocal();
}
//今天首次登录
this.checkIsFirstLoginToday();
//每天首次登录初始化逻辑
if (this._IsFirstLoginToday) {
this.onFirstLoginToday();
}
// this.saveToServer();
//开始计时
this.startTimer();
this.setStatistics(StatisticsType.LastLoginTime, this.getCurentTime2());
game.on(Game.EVENT_HIDE, this.onHide, this);
sdkConfig.isInitGameData = true;
}
onFirstLoginToday() {
console.log("每天首次登录初始化逻辑");
this._LoginDays++;
this.setStatistics(StatisticsType.LoginDays, this._LoginDays);
this._OnlineTimeForToDay = 0;
if (!this.IsFirstLogin)
gg.data.setStatistics(StatisticsType.FailContinuousCountReset, 5)
gg.data.setStatistics(StatisticsType.SuccessContinuousCount, 0)
this.setStatistics(StatisticsType.ShopBuyGoldAdCount, 6)
this.setStatistics(StatisticsType.ShopBuyItemAdCount, 6)
this.setStatistics(StatisticsType.FreeBoxCount, 0)
this.setStatistics(StatisticsType.FirstLoginWeight, 0)
this.setStatistics(StatisticsType.TodayAdCount, 0)
this.setStatus(StatusType.DayGiftGetFinish, 0);
if(this.getStatistics(StatisticsType.GreatGiftStatus) == 1){
gg.data.setStatistics(StatisticsType.GreatGiftStatus, 0)
let day = this.getStatistics(StatisticsType.GreatGiftGetDay)
gg.data.setStatistics(StatisticsType.GreatGiftGetDay, day+1)
}
// let greatGiftGetDay = this.getStatistics(StatisticsType.GreatGiftGetDay)
// gg.data.setStatistics(StatisticsType.GreatGiftGetDay, greatGiftGetDay + 1)
//签到数据更新//
let signData = this.getStringData(OtherDataType.SignData)
if (signData) {
let [day, status] = signData.split('&');
let curDay = Number(day);
let curStatus = Number(status);
if (curStatus > 0) {
curDay++;
if (curDay >= 14) {
curDay = 0
}
curStatus = 0;
}
this.setStringData(OtherDataType.SignData, curDay.toString() + '&' + curStatus.toString())
}
this.setStatistics(StatisticsType.buyPowerAdCount, 0)
this.setStatistics(StatisticsType.buyPowerMoneyCount, 0)
this.setStatistics(StatisticsType.saodangNormalCount, 0)
this.setStatistics(StatisticsType.saodangAdCount, 0)
// 丧尸农场 / 工厂 / 矿产各自独立的扫荡统计(btnArray 按 curChooseZombieType 读写),须随每日首登一并清零
this.setStatistics(StatisticsType.farmSaodangNormalCount, 0)
this.setStatistics(StatisticsType.framSaodangAdCount, 0)
this.setStatistics(StatisticsType.mineSaodangNormalCount, 0)
this.setStatistics(StatisticsType.mineSaodangAdCount, 0)
this.setStatistics(StatisticsType.factorySaodangNormalCount, 0)
this.setStatistics(StatisticsType.factorySaodangAdCount, 0)
this.setStatistics(StatisticsType.ShopDiamondShareCount, 1)
this.setStatistics(StatisticsType.SuccessShareGetRewardCount, 1)
this.setStatistics(StatisticsType.BuyGoldShareCount, 1)
//每日任务状态和进度重置
this.setStatistics(StatisticsType.DayActiveCount, 0)
//免费获得宠物次数
this.setStatistics(StatisticsType.FreePetCount, 0)
this.setStatistics(StatisticsType.FreeGetPetState, 0)
//战火防线奖励次数
this.setStatistics(StatisticsType.GaoyaguoRewardCount, 0)
//绝境瞄准奖励次数
this.setStatistics(StatisticsType.AtGameRewardCount, 0)
//重置副本进入次数,扫荡次数
// let count = 2 + gg.purchase.getFreeSweepTimes();
let rList = this.table.getTableList<ITableReplica>(TableNames.Replica);
for (let i = 0; i < rList.length; i++) {
let item = rList[i];
gg.data.setkeyKeyValue(OtherDataType.ReplicaCanEnterCountToday, item.id, 0);
gg.data.setkeyKeyValue(OtherDataType.SweepNum, item.id, 0);
}
gg.data.setStringData(OtherDataType.DayTaskRewardGetData, '0&0&0&0&0')
gg.data.setStringData(OtherDataType.DayTaskProgressData, '0&0&0&0&0&0&0&0&0&0&0&0&0&0')
gg.data.setStringData(OtherDataType.DayActiveGetRewardData, '0&0&0&0&0&0&0&0&0&0&0&0&0&0')
gg.data.setkeyKeyValueDayClear(OtherDataType.FreeUpgradeZombieFactory) //重置免费升级僵尸工厂次数重置
//重置副本扫荡次数
//每天重置内购相关
gg.purchase.everyDayInit();
gg.data.getShopItemList()
// gg.data.setStatistics(StatisticsType.PropModelLevel, 0);
// gg.data.setStatistics(StatisticsType.BoxModelLevel, 0);
// //抽卡挑战模式挑战等级
// gg.data.setStatistics(StatisticsType.GachaChallengeModeLevel, 0);
GEvent.Ins.emit(GEvent.CrossDay);
}
onHide() {
if (gg.game.isInitAllData) {
this.saveLocal();
this.saveToServer();
}
}
/**
* 重置游戏数据为「未完成首登」的空档,以便下次 init / 小游戏 restart 后走与新号相同的发奖逻辑。
*/
reset(callback: Function, tagStr: string = '') {
this.clearServerData((res) => {
if (res) {
//白名单不能清除
let whiteUseruuid = this.getStringData(OtherDataType.BaiMingTianUUIid);
this._IsFirstLogin = true;
this._IsFirstLoginToday = true;
this._LoginDays = 0;
this._OfflineTime = 0;
this._OnlineTime = 0;
this._OnlineTimeForToDay = 0;
this._OnlineTimeForAll = 0;
sys.localStorage.clear();
this.initDoc();
this.setStringData(OtherDataType.BaiMingTianUUIid, whiteUseruuid);
// 关键:不可在此写入 IsFirstLogin=2。
// 抖音等会 restartMiniProgram,冷启动只认存档;写成 2 会导致不发体力/金币/钻石,也不走新号武器初始化。
// initDoc 后 status 为空 → getStatus 为 0 → 与真正新号一致。
this.setStatus(StatusType.IsFirstLogin, 0);
this.setStatistics(StatisticsType.LoginDays, 0);
this.saveLocal();
try {
MTools.clearBeforeTimesMapForEnterHall();
} catch { /* ignore */ }
callback && callback(true);
} else {
callback && callback(false);
}
}, tagStr);
}
/** 首登礼包与新号初始化发完后调用,避免本会话重复发奖 */
public markFirstLoginCompleted(): void {
this._IsFirstLogin = false;
this.setStatus(StatusType.IsFirstLogin, 2);
}
private getSaveData() {
let result = "";
let temp = this.deepClone(this.doc);
temp.onlyLocal = []
result = JSON.stringify(temp);
temp = null;
return result;
}
/**保存本地 */
saveLocal() {
console.log('保存本地');
this.setStatistics(StatisticsType.TodayOnLineTime, this._OnlineTimeForToDay);
this.setStatistics(StatisticsType.AllOnLineTime, this._OnlineTimeForAll);
this.doc.dataVersion++;
sys.localStorage.setItem(this._docName, JSON.stringify(this.doc));
}
/**保存到服务器(部分必要数据备份)
* @param callback 保存成功回调
* @param bForceSave 是否强制保存,默认false
*/
saveToServer(callback?: Function, bForceSave: boolean = false) {
this.saveLocal();
//1秒内不重复保存(强制保存除外)
if (MTools.beforeTimes(1000, "saveToServer") && !bForceSave) return;
let d = this.getSaveData();
if (EDITOR || DEBUG || sys.isBrowser) {
if (callback) callback(false);
return;
}
if (bForceSave) {
GEvent.Ins.emit(GEvent.SHOW_NET_UI);
}
ZYSDK.ZYSDK.setGameData(d, this.doc.chapter + "", this.OnlineTimeForAll, "", "", "", () => {
GEvent.Ins.emit(GEvent.HIDE_NET_UI);
if (this.doc.failCount != this.doc.lastFailCount) {
gg.sdk.reportDY("inLevel", `存档失败次数-${this.doc.lastFailCount}`);
}
this.doc.failCount = this.doc.lastFailCount;
if (callback) callback(true);
}, () => {
this.doc.lastFailCount++;
if (bForceSave) {
this.saveToServer(callback, true);
gg.ui.showToast("通关数据存档中");
}
if (callback) callback(false);
});
}
clearServerData(callback?: Function, tagStr: string = '') {
if (EDITOR || DEBUG || sys.isBrowser) {
if (callback) callback(true);
return;
}
gg.sdk.reportDY("inLevel", `存档重置-${tagStr}`);
ZYSDK.ZYSDK.setGameData("", "", 0, "", "", "", () => {
if (callback) callback(true);
}, () => {
if (callback) callback(false);
});
}
/**获取当前时间 */
getCurentTime() {
return new Date().getTime() + 8 * 60 * 60 * 1000;//转换本地时间+8小时
}
getCurentTime2() {
return new Date().getTime()//转换本地时间+8小时
}
/**获取当天剩余时间 */
getTodayResidualTime() {
let dayTime = 24 * 60 * 60 * 1000;
let curentTime = this.getCurentTime();
return dayTime - (curentTime % dayTime);
}
isSameWeek(date1, date2) {
// 设置周起始日为周一(1表示周一,0表示周日)
const weekStartDay = 1; // 可以根据需要调整为0(周日)
// 计算两个日期是星期几(0-6,0表示周日)
const dayOfWeek1 = date1.getDay();
const dayOfWeek2 = date2.getDay();
// 计算距离周起始日的天数差
const diff1 = dayOfWeek1 >= weekStartDay ? dayOfWeek1 - weekStartDay : 7 - (weekStartDay - dayOfWeek1);
const diff2 = dayOfWeek2 >= weekStartDay ? dayOfWeek2 - weekStartDay : 7 - (weekStartDay - dayOfWeek2);
// 设置为周起始日的日期
date1.setDate(date1.getDate() - diff1);
date2.setDate(date2.getDate() - diff2);
// 重置时间部分,只比较日期
date1.setHours(0, 0, 0, 0);
date2.setHours(0, 0, 0, 0);
// 比较两个周起始日是否相同
return date1.getTime() === date2.getTime();
}
/**
* 验证今天是否首次登录
*/
private checkIsFirstLoginToday() {
let lastLoginTime = this.getStatistics(StatisticsType.LastLoginTime);
let currentTime = this.getCurentTime2();
//判断是不是同一天
const lastDate = new Date(lastLoginTime);
const currentDate = new Date(currentTime); //已经转换为北京本地时间+8小时
//打印详细年月日时分秒
// console.log('lastDate:', lastDate.getFullYear(), lastDate.getMonth(), lastDate.getDate(), lastDate.getHours(), lastDate.getMinutes(), lastDate.getSeconds()); // 调试用
// console.log('currentDate:', currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate(), currentDate.getHours(), currentDate.getMinutes(), currentDate.getSeconds()); // 调试用
// 检查是否是同一天(年、月、日相同)
const isSameDay =
lastDate.getFullYear() === currentDate.getFullYear() &&
lastDate.getMonth() === currentDate.getMonth() &&
lastDate.getDate() === currentDate.getDate();
this._IsFirstLoginToday = !isSameDay;
//获取是不是同一周
let isWeek = this.isSameWeek(lastDate, currentDate)
if (!isWeek) {
gg.data.setStringData(OtherDataType.TaskRewardGetData, '0&0&0&0&0')
//WeekActiveCount
this.setStatistics(StatisticsType.WeekActiveCount, 0);
}
this._LoginDays = this.getStatistics(StatisticsType.LoginDays);
this._OnlineTimeForAll = this.getStatistics(StatisticsType.AllOnLineTime);
this._OnlineTimeForToDay = this.getStatistics(StatisticsType.TodayOnLineTime);
//检测是不是第二周
//TaskRewardGetData是不是同一周
this._CurrentLoginDate = new Date().getDay();
//gg.data.setStringData(OtherDataType.TaskRewardGetData,'0&0&0&0&0')
}
/**验证跨天 */
public checkIsCrossDay() {
let currentDay = new Date().getDay();
if (currentDay != this._CurrentLoginDate) {
//跨天了
this._CurrentLoginDate = currentDay;
//触发跨天事件
console.log('触发跨天事件');
this._IsFirstLoginToday = true;
this._OnlineTimeForToDay = 0;
this._LoginDays++;
this.setStatistics(StatisticsType.LoginDays, this._LoginDays);
this.setStatistics(StatisticsType.TodayFirstLoginTime, this.getCurentTime());
this.onFirstLoginToday();
}
}
/**
* 开始计时
*/
private startTimer() {
this._OnlineTime = 1;
if (!this._timer_flag) {
this._timer_flag = setInterval(() => {
this._OnlineTime++;
this._OnlineTimeForToDay++;
this._OnlineTimeForAll++;
this.project.autoAddVigour();
if (this._OnlineTime % 30 == 0) {
this.saveLocal();
this.saveToServer();
}
}, 1000)
}
}
private _timer_flag = null;
//#region 存档数据
/**存档数据对象 */
doc: Doc = new Doc();
/**获取道具数量 */
getItemNum(itmeId) {
let v = this.getDataFromArrayKeyValueArray(this.doc.itemCount, itmeId)
return v == "" ? 0 : Number(v);
}
/**设置道具数量(警告:设置会覆盖道具的数量,请谨慎使用) */
setItemNum(itmeId, num: number) {
if (isNaN(num)) {
console.log("设置道具数量有问题", itmeId, num);
return
}
this.reportItemNumChange(itmeId, num);
this.setKeyValueArray(this.doc.itemCount, itmeId, num);
GEvent.Ins.emit(GEvent.UpdateItemNum, itmeId);
}
/**数量变动打点 */
reportItemNumChange(itmeId, num: number) {
let v = this.getItemNum(itmeId);
if (itmeId == ItemNumType.money) {
let pArr = [50]
for (let i = 100; i < 500; i += 50) {
pArr.push(i);
}
for (let i = 500; i < 2000; i += 100) {
pArr.push(i);
}
for (let i = 2000; i < 5000; i += 200) {
pArr.push(i);
}
for (let i = 5000; i < 10000; i += 500) {
pArr.push(i);
}
for (let i = 10000; i < 100000; i += 5000) {
pArr.push(i);
}
for (let i = 100000; i < 500000; i += 10000) {
pArr.push(i);
}
if (num > v) {
//增加
this.addStatistics(StatisticsType.AccumulateGetCoin, num - v);
let localIndex = this.getStatistics(StatisticsType.ReportIndexAccGetCoin);
let money = this.getStatistics(StatisticsType.AccumulateGetCoin);
console.log("累积增加金币", money);
for (let i = 0; i < pArr.length; i++) {
if (money >= pArr[i] && localIndex < i) {
localIndex = i;
gg.sdk.reportDY("inLevel", `金币获取-累积${pArr[i]}`)
}
}
this.setStatistics(StatisticsType.ReportIndexAccGetCoin, localIndex);
} else if (num < v) {
//减少
this.addStatistics(StatisticsType.AccumulateWasteCoin, v - num);
let localIndex = this.getStatistics(StatisticsType.ReportIndexAccWasteCoin);
let money = this.getStatistics(StatisticsType.AccumulateWasteCoin);
console.log("累积减少金币", money);
for (let i = 0; i < pArr.length; i++) {
if (money >= pArr[i] && localIndex < i) {
localIndex = i;
gg.sdk.reportDY("inLevel", `金币消耗-累积${pArr[i]}`)
}
}
this.setStatistics(StatisticsType.ReportIndexAccWasteCoin, localIndex);
}
} else if (itmeId == ItemNumType.diamond) {
let pArr = [10]
for (let i = 20; i < 500; i += 20) {
pArr.push(i);
}
for (let i = 500; i < 2000; i += 100) {
pArr.push(i);
}
for (let i = 2000; i < 5000; i += 200) {
pArr.push(i);
}
for (let i = 5000; i < 10000; i += 500) {
pArr.push(i);
}
for (let i = 10000; i < 100000; i += 5000) {
pArr.push(i);
}
for (let i = 100000; i < 500000; i += 10000) {
pArr.push(i);
}
if (num > v) {
//增加
this.addStatistics(StatisticsType.AccumulateGetDiamond, num - v);
let localIndex = this.getStatistics(StatisticsType.ReportIndexAccGetDiamond);
let diamond = this.getStatistics(StatisticsType.AccumulateGetDiamond);
console.log("累积增加钻石", diamond);
for (let i = 0; i < pArr.length; i++) {
if (diamond >= pArr[i] && localIndex < i) {
localIndex = i;
gg.sdk.reportDY("inLevel", `钻石获取-累积${pArr[i]}`)
}
}
this.setStatistics(StatisticsType.ReportIndexAccGetDiamond, localIndex);
} else if (num < v) {
//减少
this.addStatistics(StatisticsType.AccumulateWasteDiamond, v - num);
let localIndex = this.getStatistics(StatisticsType.ReportIndexAccWasteDiamond);
let diamond = this.getStatistics(StatisticsType.AccumulateWasteDiamond);
console.log("累积减少钻石", diamond);
for (let i = 0; i < pArr.length; i++) {
if (diamond >= pArr[i] && localIndex < i) {
localIndex = i;
gg.sdk.reportDY("inLevel", `钻石消耗-累积${pArr[i]}`)
}
}
this.setStatistics(StatisticsType.ReportIndexAccWasteDiamond, localIndex);
}
}
}
/**添加道具数量 */
addItemNum(itmeId, num: number) {
let v = this.getItemNum(itmeId);
this.setItemNum(itmeId, v + num);
}
/**减少道具数量 */
subItemNum(itmeId, num: number) {
let v = this.getItemNum(itmeId);
let count = v - num;
if (count < 0) {
count = 0;
}
this.setItemNum(itmeId, count);
}
/**获取所有道具 */
getAllItemNum(): IItemSaveData[] {
let arr: IItemSaveData[] = [];
for (let i = 0; i < this.doc.itemCount.length; i++) {
let data = this.doc.itemCount[i].split("_");
arr.push({ id: Number(data[0]), count: Number(data[1]) });
}
return arr;
}
/**获取当前金钱 */
getMoney() {
return this.getItemNum(ItemNumType.money);
}
/**设置金钱数量 */
setMoney(num: number) {
this.setItemNum(ItemNumType.money, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateMoney);
}
/**添加金钱数量 */
addMoney(num: number) {
this.addItemNum(ItemNumType.money, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateMoney);
}
/**减少金钱数量 */
subMoney(num: number) {
this.subItemNum(ItemNumType.money, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateMoney);
}
/**获取当前战力 */
getCombatPower() {
return this.getItemNum(ItemNumType.combatPower);
}
/**设置战力数量 */
setCombatPower(num: number) {
this.setItemNum(ItemNumType.combatPower, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateCombatPower);
}
/**添加战力数量 */
addCombatPower(num: number) {
this.addItemNum(ItemNumType.combatPower, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateCombatPower);
}
/**减少战力数量 */
subCombatPower(num: number) {
this.subItemNum(ItemNumType.combatPower, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateCombatPower);
}
/**获取当前钻石 */
getDiamond() {
return this.getItemNum(ItemNumType.diamond);
}
/**设置钻石数量 */
setDiamond(num: number) {
this.setItemNum(ItemNumType.diamond, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateDiamond);
}
/**添加钻石数量 */
addDiamond(num: number) {
this.addItemNum(ItemNumType.diamond, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateDiamond);
}
/**减少钻石数量 */
subDiamond(num: number) {
this.subItemNum(ItemNumType.diamond, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateDiamond);
}
/**获取当前体力 */
getVigour() {
return this.getItemNum(ItemNumType.vigour);
}
/**设置体力数量 */
setVigour(num: number) {
this.setItemNum(ItemNumType.vigour, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateVigour);
}
/**添加体力数量 */
addVigour(num: number) {
this.addItemNum(ItemNumType.vigour, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateVigour);
}
/**减少体力数量 */
subVigour(num: number) {
gg.data.addDayTaskProgressData(TaskType.powerConsumption, num)
this.subItemNum(ItemNumType.vigour, Math.floor(num));
GEvent.Ins.emit(GEvent.UpdateVigour);
}
/**获取状态信息 */
getStatus(type: StatusType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.status, type)
return v == "" ? 0 : Number(v);
}
/**设置状态信息 */
setStatus(type: StatusType, status: number) {
this.setKeyValueArray(this.doc.status, type, status);
}
/**获取统计信息 */
getStatistics(type: StatisticsType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.statistics, type)
return v == "" ? 0 : Number(v);
}
/**设置统计信息 */
setStatistics(type: StatisticsType, count: number) {
this.setKeyValueArray(this.doc.statistics, type, count);
}
/**添加统计信息 */
addStatistics(type: StatisticsType, count: number) {
let v = this.getStatistics(type);
this.setStatistics(type, v + count);
}
/**保存数组数据 */
setArrayData(key: OtherDataType, arr: any[]) {
this.setKeyValueArray(this.doc.other, key, arr.join("#"));
}
/**获取数组数据 */
getArrayData(key: OtherDataType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.other, key);
return v ? v.split("#") : [];
}
/**转化为int数组 */
getArrayDataInt(key: OtherDataType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.other, key);
let array = v ? v.split("#") : [];
return array.map(Number);
}
/**
* 保存键值对数据(额外接口)
* @param key 您自己维护的key请保持唯一性
* @param value 存储的值字符串(“_”下划线是该接口保留的字符,请不要在value中包含下划线)
*/
setStringData(key: OtherDataType, value: string) {
this.setKeyValueArray(this.doc.other, key, value);
}
/**获取键值对数据 */
getStringData(key: OtherDataType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.other, key);
return v ? v : "";
}
/** 保存同一个key下,多个key2的值 每日清空状态 */
setkeyKeyValueDayClear(key: OtherDataType, onlyLocal = false) {
let saveArr = onlyLocal ? this.doc.onlyLocal : this.doc.other;
this.setKeyValueArray(saveArr, key, '');
}
/**保存同一个key下,多个key2的值(例如:XX角色多少级,key为角色等级的key,key2为角色id,value为等级) */
setkeyKeyValue(key: OtherDataType, key2: number | string, value: number | string, onlyLocal = false) {
let saveArr = onlyLocal ? this.doc.onlyLocal : this.doc.other;
let v = this.getDataFromArrayKeyValueArray(saveArr, key);
let arr = v ? v.split("#") : [];
let prefix = key2 + "|";
let foundIndex = -1;
for (let i = 0; i < arr.length; i++) {
if (arr[i].startsWith(prefix)) {
foundIndex = i;
break;
}
}
if (foundIndex !== -1) {
arr[foundIndex] = prefix + value;
} else {
arr.push(prefix + value);
}
this.setKeyValueArray(saveArr, key, arr.join("#"));
}
/**获取同一个key下,多个key2的值(例如:XX角色多少级,key为角色等级的key,key2为角色id,value为等级) */
getkeyKeyValue(key: OtherDataType, key2: number | string, onlyLocal = false) {
const saveArr = onlyLocal ? this.doc.onlyLocal : this.doc.other;
const v = this.getDataFromArrayKeyValueArray(saveArr, key);
if (!v) return "";
const prefix = key2.toString() + '|';
const arr = v.split("#");
const found = arr.find(item => item.startsWith(prefix));
return found ? found.substring(prefix.length) : "";
}
/**
* 保存键值对数据(仅存本地存储,不会备份到服务器)
* @param key 您自己维护的key请保持唯一性
* @param value 存储的值字符串(“_”下划线是该接口保留的字符,请不要在value中包含下划线)
*/
setStringDataOnlyLocal(key: OtherDataType, value: string) {
this.setKeyValueArray(this.doc.onlyLocal, key, value);
}
/**获取键值对数据(仅存本地存储,不会备份到服务器) */
getStringDataOnlyLocal(key: OtherDataType) {
let v = this.getDataFromArrayKeyValueArray(this.doc.onlyLocal, key);
return v ? v : "";
}
/**根据key获取键值对数组中的数据 */
private getDataFromArrayKeyValueArray(arr: string[], key: any): string {
const keyStr = key.toString();
const prefix = keyStr + '_';
const found = arr.find(item => item.startsWith(prefix));
return found ? found.substring(prefix.length) : '';
}
/**设置键值对数据中的数据 */
private setKeyValueArray(arr: string[], key: any, value: any): void {
const keyStr = key.toString();
const prefix = keyStr + '_';
const newEntry = prefix + value;
// 使用 findIndex 一次遍历找到匹配项的索引
const index = arr.findIndex(item => item.startsWith(prefix));
if (index !== -1) {
arr[index] = newEntry; // 替换
} else {
arr.push(newEntry); // 新增
}
//console.log('setKeyValueArray==',arr)
}
/**
* 获取引导状态
* @param key 您自己维护的key请保持唯一性
*/
public getLocalGuideValue(key: string) {
let v = this.getDataFromArrayKeyValueArray(this.doc.onlyLocal, key);
return v ? v : 0;
}
/**
* 设置引导状态
* @param key 您自己维护的key请保持唯一性
* @param value 存储的值字符串(“_”下划线是该接口保留的字符,请不要在value中包含下划线)
*/
public setLocalGuideValue(key: string, value: string) {
this.setKeyValueArray(this.doc.onlyLocal, key, value);
}
/**
* 深拷贝
* @param target 目标对象
*/
private deepClone<T>(target: T, visited = new WeakMap()): T {
if (typeof target !== 'object' || target === null) {
return target;
}
if (visited.has(target)) {
return visited.get(target);
}
if (Array.isArray(target)) {
let cloneArray: any[] = [];
visited.set(target, cloneArray);
for (let i = 0; i < target.length; i++) {
cloneArray[i] = this.deepClone(target[i], visited);
}
return cloneArray as T;
}
let cloneObject: { [key: string]: any } = {};
visited.set(target, cloneObject);
for (let key in target) {
if (Object.prototype.hasOwnProperty.call(target, key)) {
cloneObject[key] = this.deepClone((target as { [key: string]: any })[key], visited);
}
}
return cloneObject as T;
}
//------------------------------------------------------------------------------------------------------------------
//获取商城列表
public getShopItemList() {
// let localStr = this.getStringData(OtherDataType.ShopBuyListData)
// console.log('localStr==',localStr)
let haveArr = gg.data.project.getHaveWeaponDataList().map(x => x.scrapId);
//
if (haveArr.length == 0) {
//重新给武器数据???
console.log('一个武器都没有了,重新给武器数据???')
return []
}
//console.log('已拥有武器',haveArr);
let suiPianShopList = this.table.getTableList<IShopItemData>(TableNames.Shop)
//[21, 22, 23, 24, 25, 26]
//找出suiPianShopList里面frag==21,22,23,24,25,26的
let filterArr = suiPianShopList.filter(x => haveArr.includes(x.frag) && x.weight != 0)
//console.log('筛选后的商城列表',filterArr);
//根据筛选后的商城列表 权重weight,选取5个商品不重复,但是钻石购买和金币购买商品算2中商品
let allNum = 5
let totalWeight = filterArr.reduce((sum, item) => sum + item.weight, 0);
//console.log('所有商品权重',totalWeight);
let findArray = []
//添加保护如果已经执行了300次没有找出来,就跳出循环
let maxTryNum = 300
let tryNum = 0
while (findArray.length < allNum) {
tryNum++
if (tryNum > maxTryNum) {
break;
}
const random = Math.random() * totalWeight;
//根据权重找到filterArr中的商品
let weightSum = 0;
let findData = null
for (let j = 0; j < filterArr.length; j++) {
weightSum += filterArr[j].weight;
if (random <= weightSum) {
findData = filterArr[j];
break;
}
}
//判断是不是重复
if (findData) {
if (findArray.indexOf(findData.id) != -1) {
continue;
}
findArray.push(findData.id)
}
}
if (findArray.length < allNum) {
//如果没有找到5个商品,就把filterArr里面没有的加入就可以
//console.log('没有找到5个商品 筛选后的商城列表',filterArr);
for (let i = 0; i < filterArr.length; i++) {
let item = filterArr[i]
if (findArray.indexOf(item.id) == -1) {
findArray.push(item.id)
if (findArray.length >= allNum) {
break;
}
}
}
}
//打乱顺序
findArray.sort(() => Math.random() - 0.5);
//console.log('随机选取的5个商品',findArray);
//开始缝合 id,折扣,是否购买完成 1|10|0
//折扣是需要更加权重随机的
let discountWeight = ConstManager.getConstStringById(ConstEnum.DiscountWeight);
console.log('折扣权重', discountWeight);
if (!discountWeight) {
discountWeight = "5,7,8,9,10|15,20,20,25,30"
}
//5,7,8,9,10|1,2,3,4,5
let discountArray = discountWeight.split('|')[0].split(',')
let discountWeightArray = discountWeight.split('|')[1].split(',')
let shopArray = []
shopArray[0] = "1|10|0"
for (let i = 0; i < findArray.length; i++) {
let zhekou = MTools.getRandomByWeightArray(1, discountArray, discountWeightArray)
let str = findArray[i] + '|' + zhekou + '|0'
shopArray.push(str)
}
//console.log('随机选取的5个商品 折扣',shopArray);
//设置
this.setStringData(OtherDataType.ShopBuyListData, shopArray.join('&'))
return shopArray
}
//获取打开宝箱的奖励数组
public getBoxRewardArray(boxLevelData: IBoxLevelData) {
let haveArr = gg.data.project.getHaveWeaponDataList().map(x => x.scrapId);
//console.log('已拥有武器',haveArr);
let fragment = boxLevelData.fragment;
//104,52:105,12
//104,50 -物品104类型50个
//let itemArray = this.table.getTableList<ITableItem>(TableNames.item)
//105,16-物品类型105类型16个
//104,110:105,45:106,7
let fragmentArrayAll = []
let fragmentList = fragment.split(':')
for (let i = 0; i < fragmentList.length; i++) {
let data1 = fragmentList[i];
let item1 = data1.split(',')[0];
let quality1 = this.table.getItemData(Number(item1)).quality;
let num1 = data1.split(',')[1];
let qualityArray1 = []
let weightArray1 = []
for (let i = 0; i < haveArr.length; i++) {
let goodID = haveArr[i]
let itemData = this.table.getItemData(goodID)
if (itemData.quality == quality1) {
qualityArray1.push(goodID)
weightArray1.push(itemData.weight)
}
}
let fragmentArray1 = MTools.getRandomByWeightArray(Number(num1), qualityArray1, weightArray1)
fragmentArrayAll = fragmentArrayAll.concat(fragmentArray1)
}
//console.log('合并后的武器碎片',fragmentArrayAll);
//长数组合并 [21, 25, 25, 25, 21, 25, 21, 21, 25, 22]
return fragmentArrayAll;
}
//获取特定碎片的数量
public getFragmentNumArray(fragmentStr) {
//105,15
let haveArr = gg.data.project.getHaveWeaponDataList().map(x => x.scrapId);
//console.log('已拥有武器',haveArr);
let fragment = fragmentStr;
//104,52:105,12
//104,50 -物品104类型50个
//let itemArray = this.table.getTableList<ITableItem>(TableNames.item)
//105,16-物品类型105类型16个
//104,110:105,45:106,7
let fragmentArrayAll = []
let fragmentList = fragment.split(':')
for (let i = 0; i < fragmentList.length; i++) {
let data1 = fragmentList[i];
let item1 = data1.split(',')[0];
let quality1 = this.table.getItemData(Number(item1)).quality;
let num1 = data1.split(',')[1];
let qualityArray1 = []
let weightArray1 = []
//如果没有获得对应品质的任何武器,则将当前品质降级
for (let i = quality1; i > 0; i) {
let d = haveArr.find(x => this.table.getItemData(x).quality == quality1);
if (d) break;
quality1--;
}
for (let i = 0; i < haveArr.length; i++) {
let goodID = haveArr[i]
let itemData = this.table.getItemData(goodID)
if (itemData.quality == quality1) {
qualityArray1.push(goodID)
weightArray1.push(itemData.weight)
}
}
let fragmentArray1 = MTools.getRandomByWeightArray(Number(num1), qualityArray1, weightArray1)
fragmentArrayAll = fragmentArrayAll.concat(fragmentArray1)
}
//console.log('合并后的武器碎片',fragmentArrayAll);
//长数组合并 [21, 25, 25, 25, 21, 25, 21, 21, 25, 22]
return fragmentArrayAll;
}
//获取当前是不是可以武器升级
public getIsCanUpgradeWeapon() {
let haveArr = gg.data.project.getHaveWeaponDataList()
for (let i = 0; i < haveArr.length; i++) {
let t = haveArr[i]
if(!t){
continue;
}
let weaponSPNum = gg.data.getItemNum(t.scrapId);
let needNum = gg.data.project.getWeaponFlagNumByLevel(t.weaponid);
if (weaponSPNum >= needNum) {
return true
}
}
return false;
}
//获取玩家的钱够不够升级
public getIsCanUpgradeWeaponByMoney() {
let myMoney = this.getItemNum(ItemNumType.money)
let curData = this.getStringData(OtherDataType.UserLevelupData)
let suiPianShopList = this.table.getTableList<IRoleLevelData>(TableNames.Role)
if (!suiPianShopList || suiPianShopList.length === 0) {
return false;
}
if (!curData) {
curData = '0&10&0&0&0&0&0';
this.setStringData(OtherDataType.UserLevelupData, curData);
}
let curDataArr = curData.split('&')
if (curDataArr.length < 7) {
curData = '0&10&0&0&0&0&0';
this.setStringData(OtherDataType.UserLevelupData, curData);
curDataArr = curData.split('&');
}
const roleLevelNum = Number(curDataArr[0])
let _index = Math.floor((Number.isFinite(roleLevelNum) ? roleLevelNum : 0) / 30)
if (_index < 0) {
_index = 0
}
if (_index >= suiPianShopList.length) {
_index = suiPianShopList.length - 1
}
let curListData = suiPianShopList[_index] || suiPianShopList[0]
if (!curListData) {
return false;
}
//console.log('curListData', curListData)
//攻击
let levelNum1 = Number(curDataArr[4])
let spendMoney1 = curListData.initial_coin1 + curListData.coefficient_coin1 * levelNum1
//暴击
let levelNum2 = Number(curDataArr[5])
let spendMoney2 = curListData.initial_coin2 + curListData.coefficient_coin2 * levelNum2
//冷却
let levelNum3 = Number(curDataArr[6])
let spendMoney3 = curListData.initial_coin3 + curListData.coefficient_coin3 * levelNum3
let showRed = false
if (levelNum1 >= 10) {
showRed = false
} else {
if (myMoney >= spendMoney1) {
showRed = true
return showRed
}
}
if (levelNum2 >= 10) {
showRed = false
} else {
if (myMoney >= spendMoney2) {
showRed = true
return showRed
}
}
if (levelNum3 >= 10) {
showRed = false
} else {
if (myMoney >= spendMoney3) {
showRed = true
return showRed
}
}
return showRed
}
//商店是不是有免费的领取
public getIsCanGetFreeItem() {
let freeSpendNum = this.getStatistics(StatisticsType.ShopBuyGoldAdCount)
if (freeSpendNum >= 6) {
return true
}
let freeSpendNum2 = this.getStatistics(StatisticsType.ShopBuyItemAdCount)
if (freeSpendNum2 >= 6) {
return true
}
if (gg.data.getDiamond() >= 200) {
return true
}
return false
}
//获取玩家等级
public getPlayerLevel() {
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
this.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0')
curData = '0&10&0&0&0&0&0'
}
let curDataArr = curData.split('&')
return Number(curDataArr[0])
}
/**获取玩家攻击力系数*/
public getPlayerAtk() {
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
this.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0')
curData = '0&10&0&0&0&0&0'
}
let curDataArr = curData.split('&')
let num = Number(curDataArr[1]);
return num
}
/**获取玩家全局攻击力系数*/
public getPlayerAtkCoefficient() {
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
this.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0')
curData = '0&10&0&0&0&0&0'
}
let curDataArr = curData.split('&')
let num = Number(curDataArr[1]);
num = num ;
return num
}
/**获取玩家暴击系数*/
public getPlayerCritCoefficient() {
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
this.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0')
curData = '0&10&0&0&0&0&0'
}
let curDataArr = curData.split('&')
return Number(curDataArr[2])
}
/**获取玩家冷却系数*/
public getPlayerCoolCoefficient() {
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
this.setStringData(OtherDataType.UserLevelupData, '0&10&0&0&0&0&0')
curData = '0&10&0&0&0&0&0'
}
let curDataArr = curData.split('&')
return Number(curDataArr[3])
}
//获取当前宝箱等级配置
public getCurBoxLevelData(boxType) {
let level = this.getCurBoxLevel();
//满级20级
if (level >= 20) {
level = 20
}
if (boxType == 1) {
//高级
let boxTabList = this.table.getTableList<IBoxLevelData>(TableNames.Box).filter(x => x.type == 1);
let boxLevelData = boxTabList.find(x => x.level == level);
return boxLevelData;
} else {
//稀有
let boxTabList = this.table.getTableList<IBoxLevelData>(TableNames.Box).filter(x => x.type == 2);
let boxLevelData = boxTabList.find(x => x.level == level);
return boxLevelData;
}
return null;
}
//获取当前宝箱等级
public getCurBoxLevel() {
//StatisticsType.FreeBoxExp
let exp = this.getStatistics(StatisticsType.FreeBoxExp);
//高级宝箱
let boxTabList = this.table.getTableList<IBoxLevelData>(TableNames.Box).filter(x => x.type == 1);
//稀有宝箱
//let rareBoxTabList = this.table.getTableList<IBoxLevelData>(TableNames.boxTab).filter(x => x.type == 2);
//查看当前等级, 需要减去大于当前等级的经验
let curLevel = 0;
for (let i = 0; i < boxTabList.length; i++) {
let item = boxTabList[i];
if (exp >= item.exp) {
exp -= item.exp;
} else {
curLevel = item.level;
break;
}
}
//console.log("curLevel:", curLevel);
if (curLevel == 0) {
let exp2 = this.getStatistics(StatisticsType.FreeBoxExp);
if (exp2 > 0) {
//满级了
curLevel = 20;
}
}
return curLevel;
}
//获取当前宝箱经验值
public getCurBoxExp() {
let exp = this.getStatistics(StatisticsType.FreeBoxExp);
//高级宝箱
let boxTabList = this.table.getTableList<IBoxLevelData>(TableNames.Box).filter(x => x.type == 1);
//稀有宝箱
//let rareBoxTabList = this.table.getTableList<IBoxLevelData>(TableNames.boxTab).filter(x => x.type == 2);
//查看当前等级, 需要减去大于当前等级的经验
let maxExp = 0;
for (let i = 0; i < boxTabList.length; i++) {
let item = boxTabList[i];
if (exp >= item.exp) {
exp -= item.exp;
} else {
maxExp = item.exp;
break;
}
}
let curExp = exp
return [curExp, maxExp];
}
//获取战力
//获取当前战力
public getCurPower() {
let power = 100
//UserLevelupData
let curData = this.getStringData(OtherDataType.UserLevelupData)
if (curData == '') {
return power
}
let curDataArr = curData.split('&')
let attack = Number(curDataArr[1])
let dAttack = Number(curDataArr[2])
let lengque = Number(curDataArr[3])
// console.log('attack', attack)
// console.log('dAttack', dAttack)
// console.log('lengque', lengque)
//皮肤加成
attack = attack ;
power = 100 * (attack / 10) * (1 + dAttack / 10000) * (1 + lengque / 10000)
//四舍五入不保留小数
power = Math.round(power)
// console.log('角色升级 power++++++++++====', attack, dAttack, lengque, power)
return power;
}
//获取战斗奖励加成比率(道具id=98)
public getFightRewardRatio() {
let id = 98
let itemArray = gg.data.table.getTableList<ITableItem>(TableNames.Item)
let rate = itemArray.find(x => x.id == id).parameter / 10000
let num = this.getItemNum(id)
return num * rate
}
// //每日任务进度 任务进度
// DayTaskProgressData = 45,
// //每日活跃奖励领取情况
// DayActiveGetRewardData = 46,
//周任务奖励领取状态设置
public setWeekTaskRewardGetData(index, rewardGet) {
let rewardGetDataList = gg.data.getStringData(OtherDataType.TaskRewardGetData).split('&')
rewardGetDataList[index] = rewardGet
this.setStringData(OtherDataType.TaskRewardGetData, rewardGetDataList.join('&'))
}
public setDayTaskRewardGetData(index, rewardGet) {
let rewardGetDataList = gg.data.getStringData(OtherDataType.DayTaskRewardGetData).split('&')
rewardGetDataList[index] = rewardGet
this.setStringData(OtherDataType.DayTaskRewardGetData, rewardGetDataList.join('&'))
}
public addDayTaskProgressData(taskType: TaskType, addPro = 1) {
//根据taskType taskType, 获取索引
let progressDataList = gg.data.getStringData(OtherDataType.DayTaskProgressData).split('&')
let rewardGetDataList = gg.data.getStringData(OtherDataType.DayActiveGetRewardData).split('&')
let taskTab = gg.data.table.getTableList<ITaskData>(TableNames.Task);
let index = -1
for (let i = 0; i < taskTab.length; i++) {
let item = taskTab[i]
if (item && item.type == taskType) {
index = i
//进度加addPro
let progress = Number(progressDataList[index])
if (Number.isNaN(progress)) {
progress = 0
}
progress += addPro
progressDataList[index] = progress + ''
//如果进度值大于freq
}
}
//如果进度值大于freq,设置setDayTaskProgressData状态
for (let i = 0; i < progressDataList.length; i++) {
let progress = Number(progressDataList[i])
if (taskTab[i] && progress >= Number(taskTab[i].freq)) {
//设置领取状态,如果状态值是2或者是1不重新设置
if (Number(rewardGetDataList[i]) == 2 || Number(rewardGetDataList[i]) == 1) {
continue
}
this.setDayTaskProgressData(i, 1)
}
}
if (index == -1) {
console.log('getDayTaskProgressData 未找到任务')
return
} else {
//设置新的进度
this.setStringData(OtherDataType.DayTaskProgressData, progressDataList.join('&'))
}
}
//活跃奖励进度领取状态设置
public setDayTaskProgressData(index, rewardGet) {
let progressDataList = gg.data.getStringData(OtherDataType.DayActiveGetRewardData).split('&')
if (isNaN(rewardGet)) {
rewardGet = 1
}
progressDataList[index] = rewardGet
this.setStringData(OtherDataType.DayActiveGetRewardData, progressDataList.join('&'))
}
//每日任务积分累加
public addDayTaskScore(score = 1) {
let myScore = gg.data.getStatistics(StatisticsType.DayActiveCount)
myScore += score
gg.data.setStatistics(StatisticsType.DayActiveCount, myScore)
//设置每日宝箱状态
let taskRewardTab: ITaskRewardData[] = gg.data.table.getTableList<ITaskRewardData>(TableNames.TaskReward);
let progressDataList = gg.data.getStringData(OtherDataType.DayTaskRewardGetData).split('&')
//type == 1 周
let dayRewardTab: ITaskRewardData[] = []
for (let i = 0; i < taskRewardTab.length; i++) {
if (taskRewardTab[i].type == 2) {
dayRewardTab.push(taskRewardTab[i])
} else {
}
}
//
for (let i = 0; i < dayRewardTab.length; i++) {
let _data = dayRewardTab[i]
if (myScore >= _data.points) {
//设置领取状态,如果状态值是2或者是1不重新设置
if (Number(progressDataList[i]) == 2 || Number(progressDataList[i]) == 1) {
continue
}
this.setDayTaskRewardGetData(i, 1)
}
}
}
//每周任务积分累加
public addWeekTaskScore(score = 1) {
let myScore = gg.data.getStatistics(StatisticsType.WeekActiveCount)
myScore += score
gg.data.setStatistics(StatisticsType.WeekActiveCount, myScore)
//设置每周宝箱状态
let taskRewardTab: ITaskRewardData[] = gg.data.table.getTableList<ITaskRewardData>(TableNames.TaskReward);
let progressDataList = gg.data.getStringData(OtherDataType.TaskRewardGetData).split('&')
//type == 1 周
let weekRewardTab: ITaskRewardData[] = []
for (let i = 0; i < taskRewardTab.length; i++) {
if (taskRewardTab[i].type == 1) {
weekRewardTab.push(taskRewardTab[i])
}
}
//
for (let i = 0; i < weekRewardTab.length; i++) {
let _data = weekRewardTab[i]
if (myScore >= _data.points) {
//设置领取状态,如果状态值是2或者是1不重新设置
if (Number(progressDataList[i]) == 2 || Number(progressDataList[i]) == 1) {
continue
}
this.setWeekTaskRewardGetData(i, 1)
}
}
}
//判断任务是不是有奖励可以领取
public checkTaskRewardGetData() {
let progressDataList = gg.data.getStringData(OtherDataType.TaskRewardGetData).split('&')
let rewardGetDataList = gg.data.getStringData(OtherDataType.DayActiveGetRewardData).split('&')
let dayTaskRewardGetData = gg.data.getStringData(OtherDataType.DayTaskRewardGetData).split('&')
// console.log('checkTaskRewardGetData',progressDataList,rewardGetDataList,dayTaskRewardGetData)
//y有1就返回true
for (let i = 0; i < progressDataList.length; i++) {
if (Number(progressDataList[i]) == 1) {
return true
}
}
//每日任务奖励领取情况
for (let i = 0; i < dayTaskRewardGetData.length; i++) {
if (Number(dayTaskRewardGetData[i]) == 1) {
return true
}
}
//每日活跃奖励领取情况
for (let i = 0; i < rewardGetDataList.length; i++) {
if (Number(rewardGetDataList[i]) == 1) {
return true
}
}
return false
}
public savePlaySelectLevelData(chapterId: number, battleMode: ChapterDifficulty) {
gg.data.setStringDataOnlyLocal(OtherDataType.playSelectLevelData, chapterId + '&' + battleMode);
}
/**初始化存档 */
private initDoc() {
this.doc.uid = "";
this.doc.roleId = 1;
this.doc.playerTitleLevel = 0;
this.doc.dataVersion = 0;
this.doc.chapter = 1;
this.doc.level = 1;
this.doc.itemCount = [];
this.doc.status = [];
this.doc.statistics = [];
this.doc.guide = [];
this.doc.other = [];
this.doc.onlyLocal = [];
this.doc.failCount = 0;
this.doc.lastFailCount = 0;
}
//#endregion
}
/**存档数据结构 */
export class Doc {
/**存档key */
key: string = "";
/**用户id */
uid: string = "";
/**角色id 男1 女 0 */
roleId: number = 1;
/**玩家称号等级 */
playerTitleLevel: number = 0;
/**版本号 */
dataVersion: number = 0;
/**当前章节 */
chapter: number = 1;
/**当前关卡 */
level: number = 1;
/**所有道具数量 */
itemCount: string[] = [];
/**存储所有状态 */
status: string[] = [];
/**统计信息 */
statistics: string[] = [];
/**引导状态 */
guide: string[] = [];
/**其他数据 */
other: string[] = [];
/**仅存本地缓存的数据,无需备份到服务器,数据丢失也没关系的数据 */
onlyLocal: string[] = [];
/**上报失败次数 */
failCount: number = 0;
/**上一次上报失败的次数 */
lastFailCount: number = 0;
}
/**部分道具id定义枚举,方便零散的调用统一管理,未定义的更多的道具id直接使用(例如配表的,批量的) */
export enum ItemNumType {
/**金钱 */
money = 1,
/**战力*/
combatPower = 2,
/**钻石*/
diamond = 3,
/**体力*/
vigour = 4,
/**钥匙*/
petKey = 11,
/**免广券*/
skipAd = 61,
/**橙色武器碎片*/
orange = 107,
/**紫武器碎片*/
purple = 106,
/**蓝武器碎片*/
blue = 105,
/**绿色武器碎片*/
green = 104,
}
export interface IItemSaveData {
id: number;
count: number;
}
/**
* 定义状态类型
*/
export enum StatusType {
/**是否首次登录 */
IsFirstLogin = 2,
/**是否今天首次登录 */
IsTodayFirstLogin = 3,
/**是否可领取每日奖励 */
DayGiftCanGet = 4,
/**是否领取每日奖励完成 */
DayGiftGetFinish = 5,
/**是否开启背景音乐 */
MuteMusic = 6,
/**是否开启音效 */
MuteEffect = 7,
/**是否开启震动 */
IsOpenShake = 8,
/**是否开启视频 */
IsOpenVideo = 9,
/**时间跳转 */
ChangeTime = 10,
/**当前皮肤 */
CurrentSkin = 11,
/**是否有新的皮肤 */
HaveNewSkin = 12,
/**小月卡每日奖励是否已经领取 */
MonCardDailyReward1 = 13,
/**大月卡每日奖励是否已经领取 */
MonCardDailyReward2 = 14,
/**终身卡每日奖励是否已经领取 */
MonCardDailyReward3 = 15,
/**是否已经购买首充礼包 */
FirstRecharge = 16,
/**当前购买的连续礼包索引 */
CurrentBuyContinuousBagIndex = 17,
/**当前购买的基金索引 */
CurrentBuyFundIndex = 18,
/**当前选择的章节ID */
CurSelectSaveChapterId = 19,
/**当前选择的章节难度 */
CurSelectSaveChapterDifficulty = 20,
/**当前装备的宠物 */
EquipPet = 21,
/**玩家是否自动弹出过玩法说明 */
IsShowPlayGuidePop = 22,
/**玩家是否自动弹出过玩法说明的无重力引导 */
IsShowPlayGuidePopNoGravity = 23,
}
/**
* 定义统计类型
*/
export enum StatisticsType {
/**离线时间 */
OutLineTime = 1,
/**在线时间 */
OnLineTime = 2,
/**最后登录时间 */
LastLoginTime = 3,
/**登录天数 */
LoginDays = 4,
/**每日在线时间 */
TodayOnLineTime = 5,
/**累计在线时间 */
AllOnLineTime = 6,
/**每日第一次登录时间 */
TodayFirstLoginTime = 7,
/**自动恢复体力时间 */
AutoAddVigourTime = 8,
/**累计获得金币 */
AccumulateGetCoin = 21,
/**累计获得钻石 */
AccumulateGetDiamond = 22,
/**累计浪费金币 */
AccumulateWasteCoin = 23,
/**累计浪费钻石 */
AccumulateWasteDiamond = 24,
/**累积获得金币打点索引 */
ReportIndexAccGetCoin = 25,
/**累积获得钻石打点索引 */
ReportIndexAccGetDiamond = 26,
/**累积浪费金币打点索引 */
ReportIndexAccWasteCoin = 27,
/**累积浪费钻石打点索引 */
ReportIndexAccWasteDiamond = 28,
//商店购买金币看广告次数
ShopBuyGoldAdCount = 303,
//商店购买item看广告次数
ShopBuyItemAdCount = 304,
//高级宝箱免费次数
FreeBoxCount = 305,
//宝箱经验
FreeBoxExp = 306,
//首次进入first
IsFirstEnter = 307,
//主动刷新必出紫剩余次数
ActiveRefreshPurpleCount = 308,
/**未出现两个紫色技能的间隔次数 */
NoDoublePurpleSkillInterval = 309,
/**连续失败次数 */
FailContinuousCount = 310,
/**未出紫色的次数 */
NoPurpleSkillCount = 311,
homeGuideIndex = 312,
yonghuxieyiYS = 313,
buyPowerAdCount = 314,
buyPowerMoneyCount = 315,
/**工厂次数限制 */
saodangNormalCount = 316,
saodangAdCount = 317,
/**挂机收益 */
AfkRewards = 318,
//无尽模式挑战次数
InfiniteChallengeCount = 319,
NewFeatureLock = 320,
/**引导签到天数 */
guideSignDay = 321,
/**商店钻石分享次数 */
ShopDiamondShareCount = 322,
//成功闯关分享领取奖励
SuccessShareGetRewardCount = 323,
//道具挑战
PropChallengeCount = 324,
//周活跃度
WeekActiveCount = 325,
//每日活跃次数
DayActiveCount = 326,
//购买金币分享
BuyGoldShareCount = 327,
//无尽模式难度等级
InfiniteModelLevel = 328,
//道具模式难度等级
PropModelLevel = 329,
/**未出现橙色技能的间隔次数 */
NoOrangeSkillInterval = 330,
/**连续成功次数 */
SuccessContinuousCount = 331,
//武器副本挑战次数
WeaponChallengeCount = 332,
//武器模式难度等级
WeaponModelLevel = 333,
//宝箱副本挑战次数
BoxChallengeCount = 334,
//宝箱副本等级
BoxModelLevel = 335,
//副本解锁弹窗提醒
ChapterUnlockPop = 336,
/**失败次数每日重置数 */
FailContinuousCountReset = 337,
//抽卡挑战模式次数
gachaChallengeModeCount = 338,
//抽卡挑战模式挑战等级
GachaChallengeModeLevel = 339,
//抽卡引导步骤
GachaGuideStep = 340,
//抽卡铲子引导
GachaGuideShovel = 341,
//抽卡障碍物引导
GachaGuideObstacle = 342,
GachaGuideStep2 = 343,
//boss挑战模式次数
BossChallengeCount = 344,
/**小月卡到期时间 */
MonCardExpireTime1 = 345,
/**大月卡到期时间 */
MonCardExpireTime2 = 346,
/**终身卡到期时间 */
MonCardExpireTime3 = 347,
/**皮肤获取碎片次数 */
SkinGetPieceCount = 348,
/**免费获得宠物 */
FreePetCount = 349,
/**宠物抽奖累积次数 */
PetGachaCount = 350,
/**首次登录权重使用次数 */
FirstLoginWeight = 351,
/**农场次数限制 */
farmSaodangNormalCount = 352,
framSaodangAdCount = 353,
/**挂机收益 */
framAfkRewards = 354,
/**矿场次数限制 */
mineSaodangNormalCount = 356,
mineSaodangAdCount = 357,
/**挂机收益 */
mineAfkRewards = 358,
/**主动刷新次数(技能3选1) */
AdRefreshCount = 359,
/**工厂次数限制 */
factorySaodangNormalCount = 360,
factorySaodangAdCount = 361,
/**挂机收益 */
factoryAfkRewards = 362,
/**今日看广告次数 */
TodayAdCount = 363,
/**未出现橙色技能的次数 */
NotOrangeCount = 364,
/**未出现紫色技能的次数 */
NotPurpleCount = 365,
/**未出现橙色技能的次数-主动刷新 */
NotOrangeCountActiveRefresh = 366,
/**未出现紫色技能的次数-主动刷新 */
NotPurpleCountActiveRefresh = 367,
/**未出现两个紫色技能的次数 */
NoDoublePurpleSkillCount = 368,
/**未出现两个紫色技能的次数-主动刷新 */
NoDoublePurpleSkillCountActiveRefresh = 369,
/**超值礼包领取状态 */
GreatGiftStatus = 371,
/**超值礼包领取天数 */
GreatGiftGetDay = 372,
/** 免费抽宠物状态 */
FreeGetPetState = 373,
//战火防线奖励次数
GaoyaguoRewardCount = 374,
//绝境瞄准奖励次数
AtGameRewardCount = 375,
/**榴莲引导步骤 */
LiulianGuideIndex = 376,
/**第2章失败引导武器升级 */
secondChapterFailWeaponUpgrade = 377,
/**第二章失败引导角色升级 */
secondChapterFailRoleUpgrade = 378,
/**地狱引导步骤 */
HellGuideIndex = 379,
//猫头鹰银币免费获取
OwlFreeGetCoinCount = 380,
/**第2章引导步骤 */
firstChapterGuideIndex = 381,
/**前4关重复挑战次数(默认1) */
EarlyChapterChallengeCount = 382,
}
export enum OtherDataType {
/********战斗游戏 ********/
//失败打点数据累积
FailReportData = 31,
//商店数据
ShopBuyListData = 32,
//签到数据
SignData = 33,
//玩家升级数据 玩家等级,
//
//角色等级, 攻击力系数,暴击系数, 冷却系数, 玩家攻击力等级,玩家暴击率系数等级,玩家冷却系数等级
//1&10&0&0&1&1&1
UserLevelupData = 34,
//章节宝箱领取数据 进度(最大100)+三个宝箱领取情况
//100&0&0&0
ChapterBoxGetData = 35,
//章节内提示广告数据
ChapterAdData = 36,
/**白名单UIID */
BaiMingTianUUIid = 37,
cdkSaveData = 42, //保存本地
//周任务奖励领取情况
TaskRewardGetData = 43,
//每日任务奖励领取情况
DayTaskRewardGetData = 44,
//每日任务进度 任务进度
DayTaskProgressData = 45,
//每日活跃奖励领取情况
DayActiveGetRewardData = 46,
//玩家选择关卡章节和难度
playSelectLevelData = 47,//保存本地 章节和难易度保存
/**战斗数据 */
BattleGameData = 48,
/**副本最后选中的难度 */
LastDifficultySelect = 49,
/**副本扫荡次数 */
SweepNum = 50,
/**皮肤列表 */
HaveSkinList = 51,
/**当前公告版本 */
Notice = 53,
/**首充领取奖励状态 */
FirstRechargeGetRewardStatus = 54,
/**等级基金已经免费领取的等级 */
FreeFundRewardLv = 55,
/**等级基金已经领取的付费奖励等级 */
PayFundRewardLv = 56,
/**章节礼包已购买 */
ChapterGiftBuy = 57,
/**已购买钻石商店的商品 */
BuyDiamondShop = 58,
/**新年签到活动签到天数 */
NewYearSign = 59,
/**上阵的武器 */
EquipWeapon = 60,
/**已拥有的武器 */
HaveWeapon = 61,
/**武器等级 */
WeaponLevel = 62,
/**关卡进度 */
ChapterProgress = 63,
/**章节宝箱状态 */
ChapterBoxStatus = 64,
/**副本通关次数 */
ReplicaPassCount = 65,
/**今日副本通关次数 */
ReplicaPassCountToday = 66,
//目标任务 任务id&任务进度&任务完成状态
TargetTaskData = 67,
//统计数据
StatisticalData = 68,
/**皮肤等级 */
SkinLevel = 69,
/**上阵宠物 no use */
EquipPet = 70,
/**宠物等级 */
PetLevel = 71,
/**已完成的剧情 */
CompletedStory = 72,
/**丧尸工厂的丧尸等级 */
ZombieLevel = 73,
/**免费升级丧尸工厂 */
FreeUpgradeZombieFactory = 74,
/**连续失败次数 */
FailContinuousCount = 75,
/**今日副本可进入次数 */
ReplicaCanEnterCountToday = 76,
/**已完成新功能解锁提示 */
CompletedNewFunPop = 77,
/**地图id和格子索引是否被修复 */
GridIsRepair = 78,
}
// 1、观看广告
// 2、通关次数
// 3、宝箱开启
// 4、购买
// 5、角色升级
// 6、体力消耗
// 7、每日登录
// 8、武器升级
// 9、游戏分享
export enum TaskType {
videoAd = 1,
successPass = 2,
boxOpenGaoji = 3,
shopBuyGold = 4,
roleUpgrade = 5,
powerConsumption = 6,
dailyLogin = 7,
weaponUpgrade = 8,
gameShare = 9,
boxOpenCommon = 10,
shopBuyZuanshi = 11, //钻石
shopBuyWeaponS = 12, //武器碎片
}