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(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(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(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(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(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(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(TableNames.Box).filter(x => x.type == 1); let boxLevelData = boxTabList.find(x => x.level == level); return boxLevelData; } else { //稀有 let boxTabList = this.table.getTableList(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(TableNames.Box).filter(x => x.type == 1); //稀有宝箱 //let rareBoxTabList = this.table.getTableList(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(TableNames.Box).filter(x => x.type == 1); //稀有宝箱 //let rareBoxTabList = this.table.getTableList(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(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(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(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(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, //武器碎片 }