82 lines
3.2 KiB
TypeScript
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 });
|
|
}
|
|
}
|