Files
MatchMaster/assets/Script/ThreeWinStreak.ts
T
2026-10-16 16:24:28 +08:00

82 lines
3.2 KiB
TypeScript

import Utils from "./module/Pay/Utils";
/** 独立于十连胜;一局的资格在创建时固定,失败在确定放弃时结算。 */
export default class ThreeWinStreak {
private started = false;
private settled = false;
constructor(private enabled: boolean) {}
private static count(value: any): number {
const number = Number(value);
return Number.isFinite(number) ? Math.min(3, Math.max(0, Math.floor(number))) : 0;
}
/** 无参数先恢复本地;登录后传服务器数据,旧账号缺失字段从零开始。 */
static restore(serverData?: { threeWinStreak?: number }, forced = false) {
if (cc.fx.GameConfig.forceThreeWinStreak) {
cc.fx.GameConfig.GM_INFO.threeWinStreak = 3;
return;
}
const storage = cc.fx.StorageMessage;
if (serverData && forced) {
storage.setStorage("threeWinStreakPending", false);
storage.setStorage("threeWinStreakUnsynced", null);
} else if (storage.getStorage("threeWinStreakPending") === true) {
// 上局开始后未正常结算就杀端,保留待同步的清零结果。
storage.setStorage("threeWinStreak", 0);
storage.setStorage("threeWinStreakPending", false);
storage.setStorage("threeWinStreakUnsynced", 0);
}
const unsynced = storage.getStorage("threeWinStreakUnsynced");
const hasUnsynced = typeof unsynced === "number" && Number.isFinite(unsynced);
const value = hasUnsynced ? unsynced : serverData
? serverData.threeWinStreak : storage.getStorage("threeWinStreak");
const count = this.count(value);
cc.fx.GameConfig.GM_INFO.threeWinStreak = count;
storage.setStorage("threeWinStreak", count);
if (serverData && hasUnsynced) this.sync(count);
}
begin() {
if (!this.enabled || this.started || this.settled) return;
this.started = true;
if (cc.fx.GameConfig.forceThreeWinStreak) return;
cc.fx.StorageMessage.setStorage("threeWinStreakPending", true);
}
win() {
if (!this.enabled || this.settled) return;
this.finish(ThreeWinStreak.count(cc.fx.GameConfig.GM_INFO.threeWinStreak) + 1);
}
fail() {
if (!this.enabled || !this.started || this.settled) return;
this.finish(0);
}
private finish(value: number) {
this.settled = true;
if (cc.fx.GameConfig.forceThreeWinStreak) {
cc.fx.GameConfig.GM_INFO.threeWinStreak = 3;
return;
}
const count = ThreeWinStreak.count(value);
const storage = cc.fx.StorageMessage;
cc.fx.GameConfig.GM_INFO.threeWinStreak = count;
storage.setStorage("threeWinStreak", count);
storage.setStorage("threeWinStreakPending", false);
storage.setStorage("threeWinStreakUnsynced", count);
ThreeWinStreak.sync(count);
}
private static sync(count: number) {
Utils.setWinStreak((data) => {
const storage = cc.fx.StorageMessage;
if (data && data.code === 1 && storage.getStorage("threeWinStreakUnsynced") === count) {
storage.setStorage("threeWinStreakUnsynced", null);
}
}, { threeWinStreak: count });
}
}