/** * 每日胜场:战斗胜利 +1,跨天清零并归档至 yesterdayWins。 */ export class DailyWinStats { /** 今日胜场(跨天自动清零) */ static getTodayWins(): number { this.ensureToday(); return Math.max(0, Math.floor(Number(gg.data.doc?.dailyWins) || 0)); } /** 昨日胜场 */ static getYesterdayWins(): number { this.ensureToday(); return Math.max(0, Math.floor(Number(gg.data.doc?.yesterdayWins) || 0)); } /** 今日日期键 YYYYMMDD(与存档 dailyWinsDate 一致) */ static todayKey(): string { return this._todayKey(); } /** 日榜 expiredate:YYYY-MM-DD,当日 23:59:59 退出,避免跨天沿用旧分 */ static expireDateToday(): string { const k = this._todayKey(); if (k.length < 8) { console.log('[DailyWinStats] 日期键非法', k); return ''; } return `${k.slice(0, 4)}-${k.slice(4, 6)}-${k.slice(6, 8)}`; } /** 读档 / 打开界面前确保日期一致 */ static ensureToday(): void { const today = this._todayKey(); const saved = String(gg.data.doc?.dailyWinsDate ?? '').trim(); if (saved === today) return; const prevWins = Math.max(0, Math.floor(Number(gg.data.doc?.dailyWins) || 0)); if (saved) { gg.data.doc.yesterdayWins = prevWins; } gg.data.doc.dailyWins = 0; gg.data.doc.dailyWinsDate = today; gg.data.doc.rankLastSyncDailyWins = -1; gg.data.doc.rankLastSyncDailyWinsDate = ''; gg.data.saveLocal(); } /** 跨天回调(GameData.onFirstLoginToday) */ static onCrossDay(): void { this.ensureToday(); } /** * 战斗胜利 +1 * @param opts.save 是否立即写本地档 */ static recordWin(opts?: { save?: boolean }): void { this.ensureToday(); gg.data.doc.dailyWins = this.getTodayWins() + 1; if (opts?.save !== false) gg.data.saveLocal(); } private static _todayKey(): string { const d = new Date(gg.data.getCurentTime2()); const y = d.getFullYear(); const m = `${d.getMonth() + 1}`.padStart(2, '0'); const day = `${d.getDate()}`.padStart(2, '0'); return `${y}${m}${day}`; } }