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.
2015 lines
75 KiB
2015 lines
75 KiB
|
1 week ago
|
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&
|
||
|
|
|
||
|
|
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, //武器碎片
|
||
|
|
}
|
||
|
|
|