cb/assets/Script/module/Tool/GameTool.ts
computer\尼卡 1961bc6ecd 111
2025-08-08 18:24:15 +08:00

1511 lines
54 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import MapConroler from "../../Map";
import Freeze from "../../prop/Freeze";
import SceneManager from "../../SceneManager";
import { MiniGameSdk } from "../../Sdk/MiniGameSdk";
import Utils from "../Pay/Utils";
//@ts-ignore
//最大工具类 各种公共方法,以及处理上传,获取后端接口数据
var GameTool = {
_startTime: 0,
_endTime: 0,
_totalTime: 0,
//获取userId
Authentication() {
let name = "user_" + cc.fx.GameConfig.GM_INFO.gameId;
var data = JSON.parse(localStorage.getItem(name));
if (data == "undifend" || data == null || data == "") {
var urlNow = window.location.href;
if (!this.containsTrain(urlNow)) {
let url = "https://api.sparkus.cn/api/user/auth/login?domain=hui32579WdYPsgYq&callback=" + location.href;
window.location.href = url;
}
}
else {
cc.fx.StorageMessage.setStorage(name, data);
cc.fx.GameConfig.GM_INFO.userId = parseInt(data.userId);
}
},
containsTrain(str) {
return /from=train/i.test(str);
},
//埋点上传
setGameData() {
//GAME_DATA 初始化 每次清零
cc.fx.GameConfig.GAME_DATA = [];
cc.fx.GameConfig.GAME_DATA.push(cc.fx.GameConfig.CLICK_DATA);
cc.fx.GameConfig.CLICK_init();
let data = cc.fx.GameConfig.GAME_DATA;
let matchId = this.getMatchId();
let postData = {
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
"userId": cc.fx.GameConfig.GM_INFO.userId,
"scode": cc.fx.GameConfig.GM_INFO.scode,
"matchId": matchId,
"data": data
};
// //console.log("上传数据:",postData);
// cc.fx.HttpUtil.uploadUserLogData(postData,function(){})
},
//上传排行榜 type为1
setRank(data) {
//GAME_DATA 初始化 每次清零
let postData = {
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
"userId": cc.fx.GameConfig.GM_INFO.userId,
"type": 1,
"score": data.score,
"accuracy": data.date,
"success": cc.fx.GameConfig.GM_INFO.success
};
// cc.fx.HttpUtil.rankData(1,function(){},postData);
},
//获取排行榜 type为2
getRank(data, callback) {
let rankLength = data.length;
let postData = {
"gameId": cc.fx.GameConfig.GM_INFO.gameId,
"userId": cc.fx.GameConfig.GM_INFO.userId,
"page": 1,
"pageSize": rankLength
};
//回调进getRankData
// cc.fx.HttpUtil.rankData(2,data =>{callback(data)},postData);
},
//获取matchId 用于上传每次点击数据里面记录id方便查询
getMatchId() {
let matchId = cc.sys.localStorage.getItem("matchId");
let tempId = matchId;
if (matchId == "undifend" || matchId == null) {
matchId = this.setMatchId();
}
else {
if (this.containsNanana(matchId) == true) {
matchId = this.setMatchId();
}
else {
let char = parseInt(tempId.substring(10, tempId.length));
if (cc.fx.GameConfig.GM_INFO.level == 1) {
char += 1;
matchId = tempId.slice(0, 10) + char + "";
if (this.containsNanana(matchId)) matchId = this.setMatchId();
cc.fx.GameConfig.GM_INFO.matchId = matchId;
cc.sys.localStorage.setItem("matchId", matchId);
}
}
}
if (this.containsNanana(matchId) == true) {
matchId = this.setMatchId();
}
return matchId;
},
//检测matchId 如果有缓存以前的nanana数据清除
containsNanana(str) {
return /na/i.test(str);
},
//重新设置MatchId
setMatchId() {
// 定义包含可用字符的字符集
const characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
// 创建一个数组以保存随机字符
const uuidArray = [];
// 循环10次 生成10位的UUID
for (let i = 0; i < 10; i++) {
// 生成随机索引,范围是字符集的长度
const randomIndex = Math.floor(Math.random() * characters.length);
// 从字符集中获取随机字符
const randomChar = characters.charAt(randomIndex);
// 将字符添加到数组中
uuidArray.push(randomChar);
}
let data = uuidArray.join('') + 1 + "";
cc.sys.localStorage.setItem("matchNumber", 1);
cc.sys.localStorage.setItem("matchId", data);
cc.fx.GameConfig.GM_INFO.matchId = data;
return data;
},
//截取名字
subName(name, length) {
if (name.length > length) {
name = name.substring(0, length) + "..."
}
return name;
},
//设置头像
setPic(node, pic) {
node.active = false;
let url = pic;
setTimeout(() => {
fetch(url)
.then(response => {
return response.headers.get('Content-Length');
})
.then(errNo => {
if (errNo == "5093") {
node.active = true;
}
})
.catch(error => {
// console.error('Error fetching X-Info:', error);
});
}, 100);
cc.assetManager.loadRemote(url, { ext: '.png' }, (err, texture: cc.Texture2D) => {
if (texture) {
node.active = true;
node.getComponent(cc.Sprite).spriteFrame = new cc.SpriteFrame(texture);
}
else {
// //console.log(err,texture)
}
})
},
//第一个参数把目标带进来处理,第二个参数为名字长度,不同场景不同需求
//名字4短小排行名字6长大排行
getRankData(data, target, nameLength) {
target.listData = data.data.list;
target.selfData = data.data.info;
let rankData = [];
let self = false;
cc.fx.GameTool.setPic(target.selfNode.getChildByName("pic").getChildByName("icon"), target.selfData.pic);
for (let i = 0; i <= target.listData.length - 1; i++) {
rankData.push({ rank: (i + 1), name: target.listData[i].nickName, total: target.listData[i].score, time: null, pic: target.listData[i].pic });
if (cc.fx.GameConfig.GM_INFO.userId == target.listData[i].userId) {
self = true;
target.rankNumber = i;
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = (i + 1) + "";
}
if (i == (target.listData.length - 1) && self == false) {
target.rankNumber = i;
target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string = "99+";
}
}
target.selfData.nickName = cc.fx.GameTool.subName(target.selfData.nickName, nameLength);
target.selfNode.getChildByName("nameLab").getComponent(cc.Label).string = target.selfData.nickName;
target.selfNode.getChildByName("totalLab").getComponent(cc.Label).string = target.selfData.score;
let timeTemp = cc.fx.GameTool.getTimeShenNong(target.selfData.totleTimes);
// target.selfNode.getChildByName("timeLab").getComponent(cc.Label).string = timeTemp + "";
switch (target.selfNode.getChildByName("rankLab").getComponent(cc.Label).string) {
case "1":
target.selfNode.getChildByName("rank").getChildByName("one").active = true;
break;
case "2":
target.selfNode.getChildByName("rank").getChildByName("two").active = true;
break;
case "3":
target.selfNode.getChildByName("rank").getChildByName("three").active = true;
break;
}
// 大排行
if (nameLength == 6) {
target.rankList.setData(rankData);
target.selfNode.opacity = 255;
if (target.selfData.totalSunCount == 0) target.selfNode.opacity = 0;
}
},
getSeedRandom: function (min, max) {//包含min 不包含max
// //console.log("随机数:",cc.fx.GameConfig.GM_INFO.currSeed);
max = max || 1;
min = min || 0;
cc.fx.GameConfig.GM_INFO.currSeed = (cc.fx.GameConfig.GM_INFO.currSeed * 9301 + 49297) % 233280;
let rnd = cc.fx.GameConfig.GM_INFO.currSeed / 233280.0;
let tmp = min + rnd * (max - min);
return parseInt(tmp);
},
//获取关卡配置的那个关卡数
getCustom(type) {
let custom = cc.fx.StorageMessage.getStorage(cc.fx.storageType.storageTypeCustom);
if (custom == "undifend" || custom == null || custom == "") {
this.setCustom();
}
else {
cc.fx.GameConfig.GM_INFO_SET("custom", custom[0]);
if (custom[0] != 0 || type == true) {
custom.shift();
if (custom.length == 0) {
this.setCustom();
}
else cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, custom);
}
}
},
//本地没有存储到配置,或者配置用完,重新创建配置
setCustom() {
let arrayLength = cc.fx.GameConfig.LEVEL_INFO.length;
let arrayList = [];
for (let i = 1; i < arrayLength; i++) {
arrayList.push(i);
}
arrayList.sort(() => Math.random() - 0.5);
arrayList.unshift(0)
cc.fx.GameConfig.GM_INFO_SET("custom", arrayList[0]);
cc.fx.StorageMessage.setStorage(cc.fx.storageType.storageTypeCustom, arrayList);
},
getSetScreenResolutionFlag: function () {
let size = cc.winSize;
let width = size.width;
let height = size.height;
if ((height / width) > (16.2 / 9)) return false;
return true;
},
//判断全面屏适配
setFit: function (canvas) {
let flag = cc.fx.GameTool.getSetScreenResolutionFlag();
if (flag) {
// //console.log("不是全面屏");
} else {
// //console.log("是全面屏");
}
return flag;
},
//获取游戏信息
getGameInfo: function (node) {
var jg = false;
return jg;
},
//设置游戏信息
setGameInfo: function (pd) {
},
//打字机效果
typingAni(label, text, cb, target) {
var self = target;
var html = '';
var arr = text.split('');
var len = arr.length;
var step = 0;
self.func = () => {
html += arr[step];
label.string = html;
if (++step == len) {
self.unschedule(self.func);
cb && cb();
}
}
self.schedule(self.func, 0.1, cc.macro.REPEAT_FOREVER, 0)
},
//输入秒,返回需要展示时间格式
getTimeMargin: (second) => {
let total = 0;
total = second;
let hour = 0;
hour = parseInt((total / 3600) + "");//计算整数小时数
let afterHour = total - hour * 60 * 60;//取得算出小时数后剩余的秒数
let min = parseInt((afterHour / 60) + "");//计算整数分
let m = "" + min;
if (min < 10) m = "0" + min;
let afterMin = total - hour * 60 * 60 - min * 60;//取得算出分后剩余的秒数
let miao = afterMin + "";
if (afterMin < 10) miao = "0" + afterMin;
return m + ':' + miao
},
//输入秒,返回需要展示时间格式
getTimeMargin2: (second) => {
// 计算总秒数
let total = Math.floor(second);
// 计算小时数
const hours = Math.floor(total / 3600);
total %= 3600;
// 计算分钟数
const minutes = Math.floor(total / 60);
// 计算剩余秒数
const seconds = total % 60;
// 将小时、分钟和秒转换为两位数的字符串
const hh = String(hours).padStart(2, '0');
const mm = String(minutes).padStart(2, '0');
const ss = String(seconds).padStart(2, '0');
// 若小时数大于 0返回包含小时的完整格式否则只返回分和秒
return hours > 0 ? `${hh}:${mm}:${ss}` : `${mm}:${ss}`;
},
//输入秒,返回需要展示时间格式
getTimeShenNong: (second) => {
second = parseInt(second / 1000 + "");
let total = 0;
total = second;
let min = 0;
if (total > 60) {
min = parseInt((total / 60) + "");//计算整数分
}
let m = min + "'";
let afterMin = total - min * 60;//取得算出分后剩余的秒数
let miao = afterMin + "''";
return m + miao
},
//打乱数组
shuffleArray: function (array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
},
//增加关卡数
addLevel(time1, time2) {
cc.fx.GameConfig.GM_INFO.level += 1;
if (cc.fx.GameConfig.GM_INFO.level > 323) {
cc.fx.GameConfig.GM_INFO.level = 323;
}
const timestamp = Date.now();
let levelInfo = {
level: cc.fx.GameConfig.GM_INFO.level,
timestamp: timestamp,
}
//console.log("55555存储关卡数据:", time1, time2);
cc.fx.StorageMessage.setStorage("level", levelInfo);
if (time1 != null && time2 != null) {
let data = {
time: time1,
add_Time: time2,
result: "success"
}
cc.fx.GameTool.shushu_Track("finish_stage", data);
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
}
cc.fx.GameTool.setUserLevel((data) => {
// //console.log("存储结果:",data);
// //console.log("上传",data);
})
},
//改变金币信息
changeCoin(coin) {
//console.log("changeCoin", coin);
if (coin == undefined) return;
if (coin < 0 && cc.fx.GameConfig.GM_INFO.coin < -coin) {
// //console.log("金币不足",cc.fx.GameConfig.GM_INFO.coin,-coin);
return;
}
cc.fx.GameConfig.GM_INFO.coin += coin;
if (coin > 0) {
// let data = "获得" + (coin) + "金币";
// MiniGameSdk.API.showToast(data);
}
else {
let data = "消耗" + (-coin) + "金币";
MiniGameSdk.API.showToast(data);
}
if (cc.fx.GameConfig.GM_INFO.coin < 0) {
cc.fx.GameConfig.GM_INFO.coin = 0;
}
// //console.log("改变的金币:",coin);
// //console.log("自身金币信息:",cc.fx.GameConfig.GM_INFO.coin);
const timestamp = Date.now();
let coinInfo = {
coin: cc.fx.GameConfig.GM_INFO.coin,
timestamp: timestamp,
}
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
cc.fx.StorageMessage.setStorage("coin", coinInfo);
// //console.log("存储金币数据:",cc.fx.GameConfig.GM_INFO.coin,coinInfo);
cc.fx.GameTool.setUserCoin((data) => {
// //console.log("上传",data);
})
},
//@ts-ignore
//获取用户金币数量
getUserCoin(callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
wx.cloud.callFunction({
name: 'userCoin',
data: {
action: 'read'
},
success: res => {
// //console.log('读取用户金币数据成功', res.result)
if (callback)
callback(res);
},
fail: err => {
callback(err);
}
})
//laf云函数
Utils.getUserCoin((data) => {
})
}
},
//改变用户金币
setUserCoin(callback) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
if (cc.fx.GameConfig.GM_INFO.coin <= 0 || cc.fx.GameConfig.GM_INFO.coin == undefined) {
//console.log("金币上传失败", cc.fx.GameConfig.GM_INFO.coin);
// MiniGameSdk.API.showToast(cc.fx.GameConfig.GM_INFO.coin);
cc.fx.GameConfig.GM_INFO.coin = 0;
}
//console.log("即将上传的金币数量:", cc.fx.GameConfig.GM_INFO.coin);
//@ts-ignore
wx.cloud.callFunction({
name: 'userCoin',
data: {
action: 'save',
coinAmount: cc.fx.GameConfig.GM_INFO.coin
},
success: res => {
// //console.log('云函数返回结果:', res);
if (res.result.code == 200) {
// //console.log('存储金币数据成功',cc.fx.GameConfig.GM_INFO.coin);
}
if (callback) {
callback(res);
}
},
fail: err => {
// //console.log('存储金币数据失败')
if (callback) {
callback(err);
}
console.error('存储用户数据失败', err)
}
})
//laf云函数
Utils.setUserCoin((data) => {
})
}
},
//获取用户关卡数
getUserLevel(callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
wx.cloud.callFunction({
name: 'userLevel',
data: {
action: 'read'
},
success: res => {
if (callback)
callback(res);
},
fail: err => {
callback(err);
}
})
//laf云函数
Utils.getUserLevel((data) => {
})
}
},
//进游戏处理 体力值情况
getHealth(callback: Function) {
let health = cc.fx.StorageMessage.getStorage("health");
const timestamp = Date.now();
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
//没有存储过体力值
if (health == null || health == undefined || health == "") {
//console.log("没存储过体力值,初进");
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
cc.fx.GameTool.getUserHealth((data) => {
//console.log("体力接口返回结果", data);
if (data.result.code == 200) {
cc.fx.GameConfig.GM_INFO.hp = data.result.data;
cc.fx.GameConfig.GM_INFO.min_Time = data.result.timestamp;
let healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": data.result.timestamp
}
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
cc.fx.StorageMessage.setStorage("health", healthInfo);
}
else if (data.result.code == 404 && data.result.message == "未找到体力数据") {
cc.fx.GameTool.setUserHealth(0, () => {
});
}
if (callback) callback();
})
//laf云函数
Utils.getUserHealth((data) => {
})
}
else {
//console.log("有存储过体力值:", health);
cc.fx.GameConfig.GM_INFO.hp = health.health;
//console.log("体力值读取完毕", cc.fx.GameConfig.GM_INFO.hp);
if (health.health < 0) {
//console.log("体力值异常,归零");
cc.fx.GameConfig.GM_INFO.hp = 0;
cc.fx.GameConfig.GM_INFO.min_Time = 0;
cc.fx.GameTool.setUserHealth(0, () => {
if (callback) callback();
});
}
else if (health.health < cc.fx.GameConfig.GM_INFO.hp_Max) {
// 30分钟的毫秒数
const thirtyMinutes = 30 * 60 * 1000;
const elapsedTime = timestamp - health.timestamp;
// 计算恢复的体力值
const recoveredHealth = Math.min(cc.fx.GameConfig.GM_INFO.hp_Max - health.health, Math.floor(elapsedTime / thirtyMinutes));
if (recoveredHealth > 0) {
health.health += recoveredHealth;
// 更新 health.timestamp
health.timestamp += recoveredHealth * thirtyMinutes;
cc.fx.GameTool.setUserHealth(recoveredHealth, () => {
if (callback) callback();
}, true);
// MiniGameSdk.API.showToast("恢复1点体力值");
//console.log(`体力值恢复 ${recoveredHealth} 点,当前体力值: ${cc.fx.GameConfig.GM_INFO.hp}`);
// 如果体力增加后仍未满,更新计时
if (cc.fx.GameConfig.GM_INFO.hp < cc.fx.GameConfig.GM_INFO.hp_Max) {
const remainingTime = Math.ceil((thirtyMinutes - ((timestamp - health.timestamp) % thirtyMinutes)) / 1000);
cc.fx.GameConfig.GM_INFO.min_Time = remainingTime;
// 更新本地存储的体力信息
let healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": health.timestamp
}
cc.fx.StorageMessage.setStorage("health", healthInfo);
}
} else {
// 计算距离下一次恢复的剩余时间
const remainingTime = Math.ceil((thirtyMinutes - (elapsedTime % thirtyMinutes)) / 1000);
//console.log(`体力值未满,待恢复,距离下一次恢复还剩 ${remainingTime} 秒`);
cc.fx.GameConfig.GM_INFO.min_Time = remainingTime;
if (callback) callback();
}
}
else {
//console.log("体力值已满");
if (callback) callback();
}
}
},
//获取用户体力值
getUserHealth(callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//console.log("即将进入体力获取接口");
//@ts-ignore
wx.cloud.callFunction({
name: 'userHealth',
data: {
action: 'read'
},
success: res => {
// //console.log("体力获取成功",res);
if (callback)
callback(res);
},
fail: err => {
// //console.log("体力获取失败",err);
callback(err);
}
})
//laf云函数
Utils.getUserHealth((data) => {
})
}
},
//设置用户体力值 有可能加,有可能定时器减
setUserHealth(health, callback, update) {
if (health > 0) {
if (cc.fx.GameConfig.GM_INFO.hp < cc.fx.GameConfig.GM_INFO.hp_Max) {
cc.fx.GameConfig.GM_INFO.hp += health;
if (cc.fx.GameConfig.GM_INFO.hp > cc.fx.GameConfig.GM_INFO.hp_Max) {
cc.fx.GameConfig.GM_INFO.hp = cc.fx.GameConfig.GM_INFO.hp_Max;
}
}
}
else {
cc.fx.GameConfig.GM_INFO.hp += health;
if (cc.fx.GameConfig.GM_INFO.hp < 0)
cc.fx.GameConfig.GM_INFO.hp = 0;
}
// else MiniGameSdk.API.showToast("体力值恢复");
const timestamp = Date.now();
let healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": timestamp
}
//如果消耗之前不是满体力,说明已经在恢复期,并不用修改时间
if (health < 0 && cc.fx.GameConfig.GM_INFO.hp != cc.fx.GameConfig.GM_INFO.hp_Max - 1) {
let oldTime = cc.fx.StorageMessage.getStorage("health").timestamp;
healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": oldTime
}
}
// 体力为满的health没变化则刷新体力时间为0
else if (cc.fx.GameConfig.GM_INFO.hp == cc.fx.GameConfig.GM_INFO.hp_Max && health == 0) {
healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": 0
}
}
// 增加体力,且增加后体力未满
else if (health > 0 && cc.fx.GameConfig.GM_INFO.hp != cc.fx.GameConfig.GM_INFO.hp_Max) {
let oldTime = cc.fx.StorageMessage.getStorage("health").timestamp;
if (update) {
oldTime = timestamp;
}
healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": oldTime
}
}
else {
healthInfo = {
"health": cc.fx.GameConfig.GM_INFO.hp,
"timestamp": timestamp
}
}
cc.fx.StorageMessage.setStorage("health", healthInfo);
MiniGameSdk.API.shushu_SetSuperProperties(null, null);
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
wx.cloud.callFunction({
name: 'userHealth',
data: {
action: 'save',
healthAmount: cc.fx.GameConfig.GM_INFO.hp,
timestamp: healthInfo.timestamp
},
success: res => {
if (callback) {
callback(res);
}
},
fail: err => {
if (callback) {
callback(err);
}
// console.error('存储关卡数据失败', err)
}
})
//laf云函数
Utils.setUserHealth(healthInfo.timestamp, (data) => {
})
}
},
//购买行为
buyReview(coin, callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
// //console.log("实际即将消耗金币:",coin);
// this.changeCoin(coin);
callback();
}
},
//更改用户道具数
buyProp(propid, callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
let num = 3;
let cost = 600;
if (propid == 2003) {
cost = 900;
num = 3;
}
else if (propid == 2002) {
num = 1;
}
//console.log("_____________新版本", num);
cc.fx.GameTool.changeCoin(-cost);
const dataTemp = {
change_reason: "商城购买道具消耗",
id: (1001 + ""),
num: -cost
}
cc.fx.GameTool.shushu_Track("resource_cost", dataTemp);
let _id = "";
let propNumber = 0;
if (propid == 2001) {
_id = "freeze_in_game";
cc.fx.GameConfig.GM_INFO.freezeAmount += num;
propNumber = cc.fx.GameConfig.GM_INFO.freezeAmount;
}
else if (propid == 2002) {
_id = "hammer_in_game";
cc.fx.GameConfig.GM_INFO.hammerAmount += num;
propNumber = cc.fx.GameConfig.GM_INFO.hammerAmount;
}
else if (propid == 2003) {
_id = "wand_in_game";
cc.fx.GameConfig.GM_INFO.magicAmount += num;
propNumber = cc.fx.GameConfig.GM_INFO.magicAmount;
}
//console.log("购买道具:", num);
cc.fx.GameTool.setUserProp(propid, propNumber, (data) => {
})
const data = {
change_reason: "game",
id: propid,
num: num,
compensate: false
}
cc.fx.GameTool.shushu_Track("resource_get", data);
const buyData = {
item_id: _id,
item_num: num,
item_price: cost,
cost_type: "gold"
}
//console.log("____________即将上传Shop_buy", buyData);
cc.fx.GameTool.shushu_Track("shop_buy", buyData);
callback();
}
},
//改变用户关卡
setUserLevel(callback) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
// if(cc.fx.GameConfig.GM_INFO.level <= 0 || cc.fx.GameConfig.GM_INFO.level == undefined){
// //console.log("等级重置为0");
// cc.fx.GameConfig.GM_INFO.level = 0;
// }
// //console.log("即将上传的关卡数:",cc.fx.GameConfig.GM_INFO.level);
//@ts-ignore
wx.cloud.callFunction({
name: 'userLevel',
data: {
action: 'save',
levelAmount: cc.fx.GameConfig.GM_INFO.level
},
success: res => {
// //console.log('云函数返回结果:', res);
// //console.log('存储关卡数据成功',cc.fx.GameConfig.GM_INFO.level);
if (callback) {
callback(res);
}
},
fail: err => {
// //console.log('存储关卡数据失败')
return;
if (callback) {
callback(err);
}
console.error('存储关卡数据失败', err)
}
})
//laf云函数
Utils.setUserLevel((data) => {
})
}
},
//获取用户关卡数
getUserProp(callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
wx.cloud.callFunction({
name: 'userProp',
data: {
action: 'read'
},
success: res => {
// //console.log('读取用户道具数据成功', res.result)
if (res.result.data) {
// cc.fx.GameConfig.GM_INFO.freezeAmount = res.result.data.freeze;
// cc.fx.GameConfig.GM_INFO.hammerAmount = res.result.data.hammer;
// cc.fx.GameConfig.GM_INFO.magicAmount = res.result.data.magic_wand;
}
if (callback)
callback(res);
},
fail: err => {
callback(err);
}
})
//laf云函数
Utils.getUserProp((data) => {
})
}
},
//改变用户道具
setUserProp(propid, amount, callback) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
let newPropData = null;
if (propid == 0) {
newPropData = {
freeze: cc.fx.GameConfig.GM_INFO.freezeAmount,
hammer: cc.fx.GameConfig.GM_INFO.hammerAmount,
magic_wand: cc.fx.GameConfig.GM_INFO.magicAmount,
}
}
else if (propid == 2001) {
newPropData = amount;
}
else if (propid == 2002) {
newPropData = amount;
}
else if (propid == 2003) {
newPropData = amount;
}
//@ts-ignore
wx.cloud.callFunction({
name: 'userProp',
data: {
action: 'save',
propType: propid,
propData: newPropData
},
success: res => {
// //console.log('云函数返回结果:', res);
if (callback) {
callback(res);
}
// //console.log('存储道具数据成功')
},
fail: err => {
// //console.log('存储道具数据失败')
if (callback) {
callback(err);
}
console.error('存储道具数据失败', err)
}
})
Utils.setUserProp(propid, newPropData, (data) => {
})
}
},
// 检查是否有足够的硬币
consumeCoins(requiredCoins: number, propName: string, amount: number, callback) {
},
// 设置用户信息
setUserInfo(callback: Function) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
const time = cc.fx.GameTool.formatDate(new Date());
let userInfo = {
// 这里填写要存储的用户数据
username: cc.fx.GameConfig.GM_INFO.username, //用户名称
useravatar: cc.fx.GameConfig.GM_INFO.useravatar, //用户头像
register_time: time
}
//@ts-ignore
wx.cloud.callFunction({
name: 'userData',
data: {
action: 'save',
userData: userInfo
},
success: res => {
// //console.log('存储用户数据成功')
if (callback) {
callback(res);
}
},
fail: err => {
if (callback) {
callback("fail");
}
}
})
Utils.setUserData(userInfo, (data) => {
})
}
},
//商城购买
shopBuy(productId, compensate) {
let coin = 0;
let price = 0;
let getCoin = 0;
var rewardData = null;
//console.log(productId);
//console.log("发放奖励", productId);
switch (productId) {
case "gold_1":
cc.fx.GameTool.changeCoin(1200);
coin = 1200;
price = 600;
// MiniGameSdk.API.showToast("充值成功获得1200金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "gold_2":
cc.fx.GameTool.changeCoin(8000);
coin = 8000;
price = 3600;
// MiniGameSdk.API.showToast("充值成功获得8000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "gold_3":
cc.fx.GameTool.changeCoin(16000);
coin = 16000;
price = 6800;
// MiniGameSdk.API.showToast("充值成功获得16000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "gold_4":
cc.fx.GameTool.changeCoin(32000);
coin = 32000;
price = 12800;
// MiniGameSdk.API.showToast("充值成功获得32000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "gold_5":
cc.fx.GameTool.changeCoin(100000);
coin = 100000;
price = 32800;
// MiniGameSdk.API.showToast("充值成功获得100000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "gold_6":
cc.fx.GameTool.changeCoin(240000);
coin = 240000;
price = 64800;
// MiniGameSdk.API.showToast("充值成功获得240000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "unlimited_health_bundle_10":
cc.fx.GameTool.changeCoin(2500);
coin = 2500;
price = 1000;
this.setUserPowerTime(3600);
// MiniGameSdk.API.showToast("获得无限体力小组合包");
rewardData = [
{ type: "coin", count: coin },
{ type: "infinite_health", count: 3600 },
]
break;
case "unlimited_health_bundle_20":
cc.fx.GameTool.changeCoin(5000);
coin = 5000;
price = 2000;
let propData = {
"freeze": 2,
"hammer": 2,
"magic_wand": 2,
"price": price
}
this.getShopProp(propData, compensate);
this.setUserPowerTime(7200);
// MiniGameSdk.API.showToast("获得无限体力大组合包");
rewardData = [
{ type: "coin", count: coin },
{ type: "freeze", count: 2 },
{ type: "hammer", count: 2 },
{ type: "magic", count: 2 },
{ type: "infinite_health", count: 7200 },
]
break;
case "unlimited_health_bundle_30":
cc.fx.GameTool.changeCoin(7500);
coin = 7500;
price = 3000;
let propData2 = {
"freeze": 5,
"hammer": 5,
"magic_wand": 5,
"price": price
}
this.getShopProp(propData2, compensate);
this.setUserPowerTime(14400);
// MiniGameSdk.API.showToast("获得无限体力超组合包");
rewardData = [
{ type: "coin", count: coin },
{ type: "freeze", count: 5 },
{ type: "hammer", count: 5 },
{ type: "magic", count: 5 },
{ type: "infinite_health", count: 14400 },
]
break;
case "month_Card":
cc.fx.GameTool.changeCoin(6000);
coin = 6000;
price = 3000;
// MiniGameSdk.API.showToast("充值成功获得240000金币");
rewardData = [
{ type: "coin", count: coin },
]
break;
case "reborn_Gift":
cc.fx.GameTool.changeCoin(1000);
coin = 1000;
price = 600;
rewardData = [
{ type: "coin", count: coin },
{ type: "freeze", count: 1 },
{ type: "hammer", count: 1 },
{ type: "magic", count: 1 },
]
let propData3 = {
"freeze": 1,
"hammer": 1,
"magic_wand": 1,
"price": price
}
this.getShopProp(propData3, compensate);
break;
}
if (MapConroler._instance != null) {
//console.log("應該下發獎勵:", rewardData);
MapConroler._instance.SceneManager.openRewardWindow(rewardData);
}
else {
const canvasTemp = cc.find("Canvas"); // 假设 Canvas 节点
if (canvasTemp) {
const JiaZai = canvasTemp.getComponent("JiaZai");
if (JiaZai) {
JiaZai.openRewardWindow(rewardData);
}
}
}
const dataTemp = {
change_reason: "shop",
id: "1001",
num: coin,
compensate: compensate
}
cc.fx.GameTool.shushu_Track("resource_get", dataTemp);
const buyData = {
item_id: productId,
item_num: coin,
item_price: price,
cost_type: "cash",
compensate: compensate
}
cc.fx.GameTool.shushu_Track("shop_buy", buyData);
MiniGameSdk.API.shushu_SetSuperProperties(null, true);
},
formatDate(date: Date): string {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
const milliseconds = String(date.getMilliseconds()).padStart(3, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}.${milliseconds}`;
},
//获取时间戳
getTime() {
const timestamp = (new Date().getTime())
return timestamp;
},
pushLister: function () {
},
removeAllLister: function () {
},
//上报数据
shushu_Track: function (name, data) {
let eventData = {}
switch (name) {
case "login":
eventData = {
register_time: data.register_time,
}
break;
case "register":
eventData = {
register_time: data.register_time,
}
break;
case "enter_stage":
eventData = {
stage_id: (cc.fx.GameConfig.GM_INFO.level + 1)
}
if (cc.fx.GameConfig.GM_INFO.otherLevel > 0) {
eventData = {
stage_id: cc.fx.GameConfig.GM_INFO.otherLevel,
}
}
break;
case "finish_stage":
eventData = {
stage_id: (cc.fx.GameConfig.GM_INFO.level + 1),
stage_duration: data.time,
added_time: data.add_Time,
result: data.result
}
if (cc.fx.GameConfig.GM_INFO.otherLevel > 0) {
eventData = {
stage_id: cc.fx.GameConfig.GM_INFO.otherLevel,
stage_duration: data.time,
added_time: data.add_Time,
result: data.result
}
}
break;
case "resource_get":
eventData = {
change_reason: data.change_reason, //获得来源
change_num: data.num, //获得数量
resource_id: data.id, //道具id
compensate: data.compensate || false, //是否是补发
}
break;
case "resource_cost":
eventData = {
change_reason: data.change_reason, //获得来源
change_num: data.num, //获得数量
resource_id: data.id //道具id
}
break;
case "shop_buy":
eventData = {
item_id: data.item_id,
item_num: data.item_num,
item_price: data.item_price,
cost_type: data.cost_type,
}
break;
case "init_order": //发起充值时
eventData = {
order_id: data.outTradeNo,
pay_amount: data.price,
payment_name: data.payment_name,
payment_num: data.payment_num,
payment_type: data.type,
}
break;
case "payment": //发起充值时
eventData = {
order_id: data.outTradeNo,
pay_amount: data.pay_amount,
payment_name: data.payment_name,
payment_num: data.payment_num,
payment_type: data.type,
}
break;
case "payment_fail": //发起充值时
eventData = {
order_id: data.outTradeNo,
pay_amount: data.pay_amount,
payment_name: data.payment_name,
payment_num: data.payment_num,
payment_type: data.type,
fail_reason: data.fail_reason,
}
break;
case "stage_help": //帮助通关时
eventData = {
identity: data.identity, //发起者为helped 帮助者为helper
level: data.level, //被帮助关卡等级
success: data.success || null, //被帮助关卡是否成功
}
break;
}
if (name == "stage_help") {
console.log("准备上报完成", data);
console.log(eventData);
// MiniGameSdk.API.showToast("准备上报完成游戏");
}
// MiniGameSdk.API.shushu_Track(name,eventData);
MiniGameSdk.API.shushu_Track(name, eventData);
},
//获取微信小游戏版本号
getWechatGameVersion: function () {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
const accountInfo = wx.getAccountInfoSync();
const miniProgram = accountInfo.miniProgram;
switch (miniProgram.envVersion) {
case 'develop':
return '开发版';
case 'trial':
return '体验版';
case 'release':
return '正式版';
default:
return '未知版本';
}
}
},
//微信小游戏根据openId将用户分组有可能会两分三分六分
setWechatGameGroup: function (type: 2 | 3 | 6) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
//@ts-ignore
if (cc.fx.GameConfig.GM_INFO.openid) {
const openid = cc.fx.GameConfig.GM_INFO.openid;
const lastChar = openid[openid.length - 1];
const charCode = lastChar.charCodeAt(0);
let groupNumber: number;
//console.log("openid尾数____________________:", charCode);
// 根据 type 参数计算分组编号
switch (type) {
case 2:
groupNumber = charCode % 2;
break;
case 3:
groupNumber = charCode % 3;
break;
case 6:
groupNumber = charCode % 6;
break;
default:
//console.log('type 参数值无效,必须为 2、3 或 6');
return;
}
//console.log("type____________________:", type);
//console.log("分组编号____________________:", groupNumber);
return groupNumber;
}
}
else return 1;
},
//购买行为,获得道具
getShopProp(propData, compensate) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
const num = propData.freeze;
//console.log("_________道具增加的数量为:", num);
cc.fx.GameConfig.GM_INFO.freezeAmount += propData.freeze;
cc.fx.GameConfig.GM_INFO.hammerAmount += propData.hammer;
cc.fx.GameConfig.GM_INFO.magicAmount += propData.magic_wand;
cc.fx.GameTool.setUserProp(0, num, (data) => {
})
const data1 = {
change_reason: "shop",
id: 2001,
num: propData.freeze,
compensate: compensate
}
cc.fx.GameTool.shushu_Track("resource_get", data1);
const data2 = {
change_reason: "shop",
id: 2002,
num: propData.hammer,
compensate: compensate
}
cc.fx.GameTool.shushu_Track("resource_get", data2);
const data3 = {
change_reason: "shop",
id: 2003,
num: propData.magic_wand,
compensate: compensate
}
cc.fx.GameTool.shushu_Track("resource_get", data3);
const buyData1 = {
item_id: "freeze_in_game",
item_num: propData.freeze,
item_price: propData.price,
cost_type: "cash"
}
cc.fx.GameTool.shushu_Track("shop_buy", buyData1);
const buyData2 = {
item_id: "hammer_in_game",
item_num: propData.hammer,
item_price: propData.price,
cost_type: "cash"
}
cc.fx.GameTool.shushu_Track("shop_buy", buyData2);
const buyData3 = {
item_id: "wand_in_game",
item_num: propData.magic_wand,
item_price: propData.price,
cost_type: "cash"
}
cc.fx.GameTool.shushu_Track("shop_buy", buyData3);
}
},
//购买无限体力
setUserPowerTime(time) {
//@ts-ignore
if (typeof wx !== 'undefined' && wx !== null) {
let nowTime = Math.floor(Date.now() / 1000);
let powerTime = cc.fx.StorageMessage.getStorage("userPowerTime");
if (powerTime == "undifend" || powerTime == null || powerTime == "" || powerTime == 0) {
powerTime = Math.floor(Date.now() / 1000) + time;
} else {
if (nowTime >= powerTime) {
powerTime = nowTime + time;
}
else {
powerTime = powerTime + time;
}
}
cc.fx.GameConfig.GM_INFO.userPowerTime = powerTime;
cc.fx.StorageMessage.setStorage("userPowerTime", powerTime);
Utils.setUserPowerTime(powerTime, (data) => {
//console.log("购买无限体力同步:", data);
})
}
},
//判断是否有无限体力//返回true有false没有
getUserPowerTime() {
if (cc.fx.GameConfig.GM_INFO.userPowerTime > 0) {
let nowTime = Math.floor(Date.now() / 1000);
if (nowTime >= cc.fx.GameConfig.GM_INFO.userPowerTime) {
cc.fx.GameConfig.GM_INFO.userPowerTime = 0;
cc.fx.StorageMessage.setStorage("userPowerTime", 0);
Utils.setUserPowerTime(0, (data) => {
//console.log("购买无限体力同步:", data);
})
return false;
} else {
return true;
}
}
else {
return false;
}
},
//判断过期
checkExpiration() {
let dateStr = cc.fx.StorageMessage.getStorage("mCardDate");
//如果过期返回 true ,没过期返回 false
if (dateStr) {
//将字符串转换为时间戳
let dateTime = new Date(dateStr).getTime();
//当前时间转换为时间戳
let currentTime = new Date().getTime();
// console.log("月卡过期时间", dateTime, "当前时间", currentTime,);
if (dateTime > currentTime) {
cc.fx.GameConfig.GM_INFO.hp_Max = 7;
cc.fx.GameConfig.GM_INFO.doubleCoin = 2;
return true;
} else {
cc.fx.GameConfig.GM_INFO.hp_Max = 5;
cc.fx.GameConfig.GM_INFO.doubleCoin = 1;
return false;
}
}
},
//获取月卡有效期距离今天的天数
getMonthlyCardValidityDays(): Promise<{ days: number, time: number }> {
console.log("________________2");
return new Promise((resolve, reject) => {
Utils.getMonthlyCard((data) => {
console.log("月卡返回时间:", data);
if (data) {
if (data.code === 1) {
const validityTime = data.data.monthCardTime; // 后端返回的到期时间戳(毫秒)
const today = new Date();
today.setHours(0, 0, 0, 0);
const todayMidnight = today.getTime();
const expiryDate = new Date(validityTime);
expiryDate.setHours(0, 0, 0, 0);
const expiryMidnight = expiryDate.getTime();
const diffMs = expiryMidnight - todayMidnight;
const days = Math.floor(diffMs / 86400000);
const remainingDays = Math.max(0, days);
cc.fx.GameConfig.GM_INFO.monthTime = remainingDays;
let obj = {
days: remainingDays,
time: validityTime,
}
resolve(obj);
} else {
// resolve(0); // 或 reject(data) 根据需要
}
}
else {
// resolve(0); // 或 reject(data) 根据需要
}
});
});
}
//判断本地缓存关卡等级是否大于服务器存储
//返回true本地缓存大于服务器存储false本地缓存小于等于服务器存储
// compareLevel() {
// if (cc.fx.GameConfig.GM_INFO.level < cc.fx.StorageMessage.getStorage("level")) {
// }
// }
};
export { GameTool };