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 }); } }