修复抽卡

This commit is contained in:
COMPUTER\EDY 2026-07-03 17:47:40 +08:00
parent 62fe4d309f
commit 576eb6abf7
6 changed files with 93 additions and 67 deletions

View File

@ -48,7 +48,8 @@ export default class Avatar extends cc.Component {
if (data) { if (data) {
this.avatarData = cc.fx.GameTool.getAvatarData(data.headArr); this.avatarData = cc.fx.GameTool.getAvatarData(data.headArr);
} }
this.film = data.film; this.film = Number(data.film) || 0;
cc.fx.GameConfig.GM_INFO.film = this.film;
// console.log("头像信息", this.avatarData); // console.log("头像信息", this.avatarData);
this.avatar = cc.fx.GameConfig.GM_INFO.useravatarIcon; this.avatar = cc.fx.GameConfig.GM_INFO.useravatarIcon;
this.avatarKuang = cc.fx.GameConfig.GM_INFO.useravaterkuang; this.avatarKuang = cc.fx.GameConfig.GM_INFO.useravaterkuang;
@ -314,7 +315,6 @@ export default class Avatar extends cc.Component {
if (this.avatar.length > 10) { if (this.avatar.length > 10) {
this.content.children[0].getChildByName("select").active = true; this.content.children[0].getChildByName("select").active = true;
} }
break; break;
} }
this.changeBtnState("avatar"); this.changeBtnState("avatar");

View File

@ -90,6 +90,7 @@ export class GameConfig {
guide: boolean; //是否有引导 guide: boolean; //是否有引导
url: string; //访问域名 url: string; //访问域名
coin: number; //用户金币 coin: number; //用户金币
film: number; //头像抽卡代币
success: boolean; //用户游戏成功与否 success: boolean; //用户游戏成功与否
matchId: any; //用于埋点上传的ID matchId: any; //用于埋点上传的ID
gameState: boolean; custom: number; //用于测试跳关卡 gameState: boolean; custom: number; //用于测试跳关卡
@ -281,6 +282,7 @@ export class GameConfig {
guide: true, //是否有引导 guide: true, //是否有引导
url: "https://api.sparkus.cn",//访问域名 url: "https://api.sparkus.cn",//访问域名
coin: 0, //用户金币 coin: 0, //用户金币
film: 0, //头像抽卡代币(以服务端返回值为准)
success: false, //用户游戏成功与否 success: false, //用户游戏成功与否
matchId: null, //用于埋点上传的ID matchId: null, //用于埋点上传的ID
gameState: false, gameState: false,

View File

@ -515,6 +515,9 @@ export default class Utils {
Utils.POST("userLevel", setData, res => { Utils.POST("userLevel", setData, res => {
//console.log("获得userLevel数据:", res); //console.log("获得userLevel数据:", res);
if (res.code === 1) { if (res.code === 1) {
if (res.data && res.data.film !== undefined) {
cc.fx.GameConfig.GM_INFO.film = Number(res.data.film);
}
//console.log("服务器:获得等级成功", res); //console.log("服务器:获得等级成功", res);
if (callBack) callBack(res); if (callBack) callBack(res);
} else { } else {
@ -552,6 +555,9 @@ export default class Utils {
Utils.POST("userLevel", setData, res => { Utils.POST("userLevel", setData, res => {
//console.log("获得userLevel数据:", res); //console.log("获得userLevel数据:", res);
if (res.code === 1) { if (res.code === 1) {
if (res.data && res.data.film !== undefined) {
cc.fx.GameConfig.GM_INFO.film = Number(res.data.film);
}
//console.log("服务器:上传等级成功", res); //console.log("服务器:上传等级成功", res);
if (callBack) callBack(res); if (callBack) callBack(res);
} else { } else {
@ -1665,10 +1671,11 @@ export default class Utils {
Utils.POST("drawHead", setData, res => { Utils.POST("drawHead", setData, res => {
if (res.code === 1) { if (res.code === 1) {
console.log("正常获取到抽卡结果", res); console.log("正常获取到抽卡结果", res);
if (callBack) callBack(res);
} else { } else {
console.log("获取抽卡失败,失败原因", res); console.log("获取抽卡失败,失败原因", res);
} }
// 失败也必须回调,否则抽卡页的 Loading 和防重复点击状态无法恢复。
if (callBack) callBack(res);
}) })
} }
} }
@ -1754,6 +1761,9 @@ export default class Utils {
Utils.POST("getFilm", setData, res => { Utils.POST("getFilm", setData, res => {
if (res.code === 1) { if (res.code === 1) {
console.log("正常获取用户代币", res); console.log("正常获取用户代币", res);
if (res.data && res.data.film !== undefined) {
cc.fx.GameConfig.GM_INFO.film = Number(res.data.film);
}
if (callBack) callBack(res); if (callBack) callBack(res);
} else { } else {
console.log("获取代币失败,失败原因", res); console.log("获取代币失败,失败原因", res);

View File

@ -19,17 +19,25 @@ export default class GachaManager extends cc.Component {
avatarData: any = null; avatarData: any = null;
own = 0; own = 0;
reward = 0; reward = 0;
film = 0;
isDrawing = false;
onLoad() { onLoad() {
this.avatarData = []; this.avatarData = [];
this.own = 0; this.own = 0;
this.reward = 0; this.reward = 0;
this.film = 0;
this.isDrawing = false;
// this.init(); // this.init();
} }
//初始化数据 //初始化数据
init(data, film) { init(data, film) {
this.avatarData = []; this.avatarData = [];
this.own = 0; this.own = 0;
const parsedFilm = Number(film);
this.film = isNaN(parsedFilm) ? 0 : parsedFilm;
// 界面显示和抽卡判断必须使用同一份代币数据。
cc.fx.GameConfig.GM_INFO.film = this.film;
console.log("222222初始化数据", data); console.log("222222初始化数据", data);
if (data) { if (data) {
this.avatarData = data; this.avatarData = data;
@ -54,17 +62,17 @@ export default class GachaManager extends cc.Component {
let cost = this.getCostFilm(); let cost = this.getCostFilm();
botoom.getChildByName("total").getComponent(cc.Label).string = cost.toString(); botoom.getChildByName("total").getComponent(cc.Label).string = cost.toString();
console.log("抽卡所需film", cost); console.log("抽卡所需film", cost);
if (film >= cost) { if (this.film >= cost) {
botoom.getChildByName("yes").active = true; botoom.getChildByName("yes").active = true;
console.log("有足够film"); console.log("有足够film");
botoom.getChildByName("yes").getComponent(cc.Label).string = film.toString(); botoom.getChildByName("yes").getComponent(cc.Label).string = this.film.toString();
} }
else { else {
console.log("没有足够film"); console.log("没有足够film");
botoom.getChildByName("no").active = true; botoom.getChildByName("no").active = true;
botoom.getChildByName("no").getComponent(cc.Label).string = film.toString(); botoom.getChildByName("no").getComponent(cc.Label).string = this.film.toString();
} }
console.log("拥有film", film); console.log("拥有film", this.film);
} }
} }
@ -73,6 +81,7 @@ export default class GachaManager extends cc.Component {
if (this.own > film.length) if (this.own > film.length)
this.own = film.length - 1; this.own = film.length - 1;
let count = film[this.own]; let count = film[this.own];
console.log("抽卡所需film", count);
return count; return count;
} }
@ -88,21 +97,25 @@ export default class GachaManager extends cc.Component {
} }
playGacha() { playGacha() {
if (this.isDrawing) {
return;
}
if (this.own >= 8) { if (this.own >= 8) {
MiniGameSdk.API.showToast("已拥有当期所有头像"); MiniGameSdk.API.showToast("已拥有当期所有头像");
return; return;
} }
else { else {
let cost = this.getCostFilm(); let cost = this.getCostFilm();
if (cc.fx.GameConfig.GM_INFO.film < cost) { console.log("抽卡所需film", cost, "当前页面film", this.film);
MiniGameSdk.API.showToast("代币不足,闯关获取更多代币!");
return;
}
} }
// 余额和拥有头像最终以服务端为准,避免本地缓存过期误拦截。
this.isDrawing = true;
this.openLoad(); this.openLoad();
Utils.getGacha(res => { Utils.getGacha(res => {
console.log("抽卡结果", res); console.log("抽卡结果", res);
this.isDrawing = false;
this.closeLoad();
if (res.code == 1) { if (res.code == 1) {
console.log("抽卡成功"); console.log("抽卡成功");
@ -121,7 +134,10 @@ export default class GachaManager extends cc.Component {
}); });
} }
else if (res.code == 0) { else if (res.code == 0) {
MiniGameSdk.API.showToast(res.msg); if (res.data && res.data.film !== undefined) {
this.init(this.avatarData, res.data.film);
}
MiniGameSdk.API.showToast(res.msg || "代币不足,闯关获取更多代币!");
cc.fx.GameTool.shushu_Track("avatar_gacha", { cc.fx.GameTool.shushu_Track("avatar_gacha", {
pool_id: "spring", pool_id: "spring",
pull_count: (this.own + 1), pull_count: (this.own + 1),
@ -142,7 +158,6 @@ export default class GachaManager extends cc.Component {
result: "", result: "",
}); });
} }
this.closeLoad();
}); });
// let cost = this.getCostFilm(); // let cost = this.getCostFilm();
// if (cc.fx.GameConfig.GM_INFO.film >= cost) { // if (cc.fx.GameConfig.GM_INFO.film >= cost) {

View File

@ -68,12 +68,12 @@ export default async function (ctx: FunctionContext) {
// 根据数量获取对应的消耗数量超过7时取最后一个120 // 根据数量获取对应的消耗数量超过7时取最后一个120
let filmCost = filmConsumeTable[Math.min(count, 7)]; let filmCost = filmConsumeTable[Math.min(count, 7)];
// 执行消耗 film = Number(film) || 0;
film -= filmCost; if (film < filmCost) {
return { code: 0, data: { film: film, cost: filmCost }, msg: "代币不足,闯关获取更多代币!" }
if (film < 0) {
return { code: 0, data: null, msg: "代币不足" }
} }
// 检查通过后再扣除,余额始终以服务端数据为准。
film -= filmCost;
let num = Math.floor(Math.random() * total); let num = Math.floor(Math.random() * total);
let list = []; let list = [];
@ -109,4 +109,3 @@ export default async function (ctx: FunctionContext) {
await db.collection(dbname).where({ _id: uid }).update({ headArr: headArr, film: film }); await db.collection(dbname).where({ _id: uid }).update({ headArr: headArr, film: film });
return { code: 1, data: { headArr: headArr, reward: list[num2], film: film }, msg: "成功" }; return { code: 1, data: { headArr: headArr, reward: list[num2], film: film }, msg: "成功" };
} }

View File

@ -8,11 +8,11 @@ export default async function (ctx: FunctionContext) {
const uid = ctx.body.uid; const uid = ctx.body.uid;
let dbname = "users"; let dbname = "users";
const gameName = ctx.body.gameName; const gameName = ctx.body.gameName;
const isWuXian=ctx.body.isWuXian; const isWuXian = ctx.body.isWuXian;
let db1 = "691093093cf0c4532ba4fd9c"; let db1 = "691093093cf0c4532ba4fd9c";
if (gameName == "iaa") { if (gameName == "iaa") {
dbname = "usersAd"; dbname = "usersAd";
db1 ="691097ac3cf0c4532ba4fd9e"; db1 = "691097ac3cf0c4532ba4fd9e";
} }
if (!action) { if (!action) {
return { code: 0, data: null, msg: "未获取到action" }; return { code: 0, data: null, msg: "未获取到action" };
@ -23,17 +23,17 @@ export default async function (ctx: FunctionContext) {
} }
let res1 = await db.collection(dbname).where({ _id: uid }).getOne(); let res1 = await db.collection(dbname).where({ _id: uid }).getOne();
const token = ctx.body.token; const token = ctx.body.token;
if (res1.data&&res1.data.token) { if (res1.data && res1.data.token) {
let istoken=Utils.checkToken(token,res1.data.token); let istoken = Utils.checkToken(token, res1.data.token);
if (!istoken) { if (!istoken) {
return { code: 0, data: null, msg: "token校验失败" };; return { code: 0, data: null, msg: "token校验失败" };;
} }
} }
let address=res1.data?.address; let address = res1.data?.address;
const ip = ctx.headers['x-forwarded-for'] || ctx.headers['x-real-ip'] || ''; const ip = ctx.headers['x-forwarded-for'] || ctx.headers['x-real-ip'] || '';
let address1 = getProvinceByIP(ip); let address1 = getProvinceByIP(ip);
if(!address||address=="其他"){ if (!address || address == "其他") {
address=address1; address = address1;
} }
if (["香港", "澳门", "台湾省"].includes(address)) { if (["香港", "澳门", "台湾省"].includes(address)) {
address = "港澳台"; address = "港澳台";
@ -44,24 +44,24 @@ export default async function (ctx: FunctionContext) {
if (!levelAmount) { if (!levelAmount) {
return { code: 0, data: null, msg: "未获取到levelAmount" }; return { code: 0, data: null, msg: "未获取到levelAmount" };
} }
let oldlevelAmount = res1.data?.levelAmount ||0; let oldlevelAmount = res1.data?.levelAmount || 0;
let oldAdd=res1.data?.addLevel||0; let oldAdd = res1.data?.addLevel || 0;
let levelTJ=res1.data?.levelTJ||0; let levelTJ = res1.data?.levelTJ || 0;
let count=levelAmount-oldlevelAmount; let count = levelAmount - oldlevelAmount;
if(count>10||count<-10){ if (count > 10 || count < -10) {
count=1; count = 1;
return; return;
} }
let add=oldAdd+count; let add = oldAdd + count;
let isWhite=res1.data?.isWhite; let isWhite = res1.data?.isWhite;
let careerAmount = res1.data?.careerAmount||0; let careerAmount = res1.data?.careerAmount || 0;
if(isWuXian=="true"){ if (isWuXian == "true") {
add +=1; add += 1;
//console.log("无线增加值:"+(add-oldAdd)); //console.log("无线增加值:"+(add-oldAdd));
}else{ } else {
//console.log("非无线增加值:"+(add-oldAdd)); //console.log("非无线增加值:"+(add-oldAdd));
} }
add=Math.floor(add); add = Math.floor(add);
// if (uid =="686513c8a173b1b78d21f881"){ // if (uid =="686513c8a173b1b78d21f881"){
// console.error(add); // console.error(add);
// console.log(isWhite); // console.log(isWhite);
@ -69,30 +69,30 @@ export default async function (ctx: FunctionContext) {
// console.log(isWhite==false); // console.log(isWhite==false);
// console.error(levelAmount); // console.error(levelAmount);
// } // }
let rankNum=-1; let rankNum = -1;
if(add>=5&&isWhite==false){ if (add >= 5 && isWhite == false) {
rankNum=await rank(db1, uid, add, levelAmount, res1, address,levelTJ); rankNum = await rank(db1, uid, add, levelAmount, res1, address, levelTJ);
levelTJ=1; levelTJ = 1;
careerAmount+=1; careerAmount += 1;
} }
let film = res1.data.film; let film = res1.data.film;
if (!film && film != 0) { if (!film && film != 0) {
film = res1.data.levelAmount; film = res1.data.levelAmount;
} }
film += count; film += count;
if (uid =="6866ac24a173b1b78d21f8c2"){ if (uid == "6866ac24a173b1b78d21f8c2") {
console.log("通关:"+levelAmount); console.log("通关:" + levelAmount);
} }
// console.error(add); // console.error(add);
// console.log(oldAdd); // console.log(oldAdd);
// console.log(levelAmount); // console.log(levelAmount);
// console.log(oldlevelAmount); // console.log(oldlevelAmount);
// console.error("----------------------------------"); // console.error("----------------------------------");
let ret = await db.collection(dbname).where({ _id: uid }).update({address:address,film:film, careerAmount:careerAmount,levelTJ:levelTJ, levelAmount: levelAmount,addLevel:add,timestamp:Date.now()}); let ret = await db.collection(dbname).where({ _id: uid }).update({ address: address, film: film, careerAmount: careerAmount, levelTJ: levelTJ, levelAmount: levelAmount, addLevel: add, timestamp: Date.now() });
return { code: 1, data: {IP:ip,address:address,rank:rankNum,levelAmount: levelAmount,timestamp: Date.now() }, msg: "用户数据更新成功" } return { code: 1, data: { IP: ip, address: address, rank: rankNum, levelAmount: levelAmount, film: film, timestamp: Date.now() }, msg: "用户数据更新成功" }
case 'read': case 'read':
return { return {
code: 1, data: { levelAmount: res1.data?.levelAmount||0, timestamp: res1.data?.timestamp||0 }, msg: "成功" code: 1, data: { levelAmount: res1.data?.levelAmount || 0, film: res1.data?.film ?? res1.data?.levelAmount ?? 0, timestamp: res1.data?.timestamp || 0 }, msg: "成功"
} }
default: default:
return { return {
@ -109,7 +109,7 @@ function isSameDayUTC(timestamp1, timestamp2) {
date1.getUTCMonth() === date2.getUTCMonth() && date1.getUTCMonth() === date2.getUTCMonth() &&
date1.getUTCDate() === date2.getUTCDate(); date1.getUTCDate() === date2.getUTCDate();
} }
async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){ async function rank(db1, uid, add, levelAmount, res1, address, levelTJ) {
let rankInfo = await db.collection("sRank").where({ _id: db1 }).getOne(); let rankInfo = await db.collection("sRank").where({ _id: db1 }).getOne();
let total = rankInfo.data.total; let total = rankInfo.data.total;
@ -124,8 +124,8 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){
if (total["all"][i].id == uid) { if (total["all"][i].id == uid) {
isHave = true; isHave = true;
total["all"][i].useravatar = res1.data?.useravatar, total["all"][i].useravatar = res1.data?.useravatar,
total["all"][i].username=res1.data?.username, total["all"][i].username = res1.data?.username,
total["all"][i].useravatarIcon=res1.data?.useravatarIcon, total["all"][i].useravatarIcon = res1.data?.useravatarIcon,
total["all"][i].addLevel = add; total["all"][i].addLevel = add;
total["all"][i].time = Date.now(); total["all"][i].time = Date.now();
break; break;
@ -212,19 +212,19 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){
if (total[address].length >= 10) { if (total[address].length >= 10) {
total[address] = total[address].slice(0, 10); total[address] = total[address].slice(0, 10);
} }
if(!total["role"]){ if (!total["role"]) {
total["role"]={}; total["role"] = {};
} }
if(levelTJ==0){ if (levelTJ == 0) {
if (!total["role"][address]) { if (!total["role"][address]) {
total["role"][address] = 1; total["role"][address] = 1;
} else { } else {
total["role"][address] += 1; total["role"][address] += 1;
//console.log(address+"真实:"+total[address].length+"----"+total["role"][address]); //console.log(address+"真实:"+total[address].length+"----"+total["role"][address]);
let length=total[address].length; let length = total[address].length;
if(length<10){ if (length < 10) {
total["role"][address]=length; total["role"][address] = length;
} }
//console.error(address + "真实:" + total[address].length + "----" + total["role"][address]) //console.error(address + "真实:" + total[address].length + "----" + total["role"][address])
// const res3 = await db.collection("sRank").where({ name: address }).getOne(); // const res3 = await db.collection("sRank").where({ name: address }).getOne();
@ -237,10 +237,10 @@ async function rank(db1,uid,add,levelAmount,res1,address,levelTJ){
} }
//console.log(address); //console.log(address);
let ret1 = await db.collection("sRank").where({ _id: db1 }).update({ total: JSON.stringify(total) }); let ret1 = await db.collection("sRank").where({ _id: db1 }).update({ total: JSON.stringify(total) });
let rank=-1; let rank = -1;
for (let i = 0; i < total[address].length; i++) { for (let i = 0; i < total[address].length; i++) {
if (total[address][i].id == uid) { if (total[address][i].id == uid) {
rank=i+1; rank = i + 1;
break; break;
} }
} }