From 0d753043354648362d31191467f1a4ad2ba912da Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 6 Aug 2026 10:45:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=90=8C=E6=9C=BA=E5=A4=9A?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E6=95=B0=E6=8D=AE=E4=B8=B2=E5=8F=B7=EF=BC=88?= =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E7=AC=AC=E4=BA=8C=E5=90=8D=E5=A4=8D?= =?UTF-8?q?=E5=88=B6=E7=AC=AC=E4=B8=80=E5=90=8D=E6=95=B0=E6=8D=AE=EF=BC=89?= =?UTF-8?q?=EF=BC=9A=E2=91=A0=E5=9B=BE=E9=89=B4=E5=90=8C=E6=AD=A5=E7=94=B1?= =?UTF-8?q?=E5=B9=B6=E9=9B=86=E5=90=88=E5=B9=B6=E6=94=B9=E4=B8=BA=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E7=AB=AF=E6=9D=83=E5=A8=81=E6=9B=BF=E6=8D=A2=EF=BC=88?= =?UTF-8?q?localStorage=E6=B5=8F=E8=A7=88=E5=99=A8=E7=BA=A7=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=EF=BC=8C=E5=B9=B6=E9=9B=86=E4=BC=9A=E6=8A=8A=E4=B8=8A?= =?UTF-8?q?=E4=BB=BB=E8=B4=A6=E5=8F=B7=E5=9B=BE=E9=89=B4=E6=8E=A8=E7=BB=99?= =?UTF-8?q?=E4=B8=8B=E4=BB=BB=EF=BC=89=EF=BC=9B=E2=91=A1=E7=BB=93=E7=AE=97?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=B8=8A=E6=8A=A5localStorage=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=9C=80=E9=AB=98=E5=88=86=EF=BC=88endless=5Fhigh?= =?UTF-8?q?=E5=8F=AA=E8=AE=A4=E6=9C=AC=E8=B4=A6=E5=8F=B7=E5=AE=9E=E9=99=85?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E7=9A=84=E6=97=A0=E5=B0=BD=E5=AF=B9=E5=B1=80?= =?UTF-8?q?=EF=BC=89=EF=BC=9B=E2=91=A2=E7=99=BB=E5=87=BA=E6=B8=85=E7=A9=BA?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=9B=BE=E9=89=B4=E3=80=82=E5=B7=B2=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E5=B9=B6=E6=B8=85=E6=B4=97'=E4=BD=A0=E5=A5=BD'?= =?UTF-8?q?=E7=9A=84=E6=B1=A1=E6=9F=93=E6=95=B0=E6=8D=AE=EF=BC=8817?= =?UTF-8?q?=E6=9D=A1=E7=BB=A7=E6=89=BF=E5=9B=BE=E9=89=B4+195081=E5=81=87?= =?UTF-8?q?=E6=9C=80=E9=AB=98=E5=88=86=EF=BC=8C=E5=85=B6=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E6=88=90=E7=BB=A9=3D=E5=87=BB=E5=9D=A02=EF=BC=89=E3=80=82playw?= =?UTF-8?q?right=E5=8F=8C=E8=B4=A6=E5=8F=B7=E5=90=8C=E6=9C=BA=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=EF=BC=9AB=E8=B4=A6=E5=8F=B70=E7=BB=A7=E6=89=BF?= =?UTF-8?q?=E3=80=81=E6=A6=9C=E5=8D=95=E5=9B=9B=E8=A1=8C=E5=90=84=E5=BC=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- star-raid/js/net.js | 12 ++++++------ star-raid/js/ui.js | 3 +-- star-raid/server/api.js | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/star-raid/js/net.js b/star-raid/js/net.js index 09008b4..a917d42 100644 --- a/star-raid/js/net.js +++ b/star-raid/js/net.js @@ -45,19 +45,19 @@ const NET = { async logout() { await this.api("/api/logout", "POST"); this.user = null; this.stats = null; this.online = false; + SAVE.codex = {}; persist(); // 防同机下一账号继承图鉴 }, - /* 应用服务端返回的用户数据:同步图鉴解锁到本地存档(并集) */ + /* 应用服务端返回的用户数据:图鉴以服务端为准【替换】本地 + (不能并集合并——localStorage 是浏览器级共享,同机多账号会互相污染,已踩坑) */ _apply(d) { this.user = d.user; this.stats = d.stats; this.codexTotal = d.codexTotal || 62; this.online = true; - if (Array.isArray(d.codex)) { - SAVE.codex = SAVE.codex || {}; - for (const k of d.codex) SAVE.codex[k] = true; - persist(); - } + SAVE.codex = {}; + if (Array.isArray(d.codex)) for (const k of d.codex) SAVE.codex[k] = true; + persist(); }, /* 结算上报(fire-and-forget):成功后回写最新统计 */ diff --git a/star-raid/js/ui.js b/star-raid/js/ui.js index f5cec3e..d56360e 100644 --- a/star-raid/js/ui.js +++ b/star-raid/js/ui.js @@ -242,8 +242,7 @@ function submitRun(win){ if(typeof NET==="undefined"||!NET.user)return; NET.submitRun({mode:G.mode,diff:G.diff,score:G.score,wave:G.wave,stage:G.stage, timeSec:Math.round(G.time/60),bossKills:G.bossKills||0,win:!!win, - bestEndless:Math.max(SAVE.best.e0||0,SAVE.best.e1||0), - codex:Object.keys(SAVE.codex)}); + codex:Object.keys(SAVE.codex)}); // 注意:不上报 localStorage 历史最高分(SAVE.best 是浏览器级共享,会串号) } function endRun(win){ if(UI==="over")return; diff --git a/star-raid/server/api.js b/star-raid/server/api.js index deed187..1b91c24 100644 --- a/star-raid/server/api.js +++ b/star-raid/server/api.js @@ -113,11 +113,11 @@ function run(req, res, ctx, body) { if (!vInt(b.wave, 0, 9999) || !vInt(b.stage, 0, 99)) return ctx.fail(400, "非法进度"); if (!vInt(b.timeSec, 0, 86400)) return ctx.fail(400, "非法时长"); if (!vInt(b.bossKills, 0, 60)) return ctx.fail(400, "非法击坠数"); - if (!vInt(b.bestEndless === undefined ? 0 : b.bestEndless, 0, 1e8)) return ctx.fail(400, "非法纪录"); const keys = Array.isArray(b.codex) ? b.codex.slice(0, 100).filter((k) => CODEX_KEYS.has(k)) : []; const uid = ctx.user.id, now = Date.now(); - const endlessCand = Math.max(b.mode === "endless" ? b.score : 0, b.bestEndless || 0); + /* endless_high 只认本账号实际上报的无尽对局分数(不收 localStorage 历史值——浏览器级共享会串号,已踩坑) */ + const endlessCand = b.mode === "endless" ? b.score : 0; db.exec("BEGIN"); try { qInsRun.run(uid, b.mode, b.diff, b.score, b.wave, b.stage, b.timeSec, b.bossKills, b.win ? 1 : 0, now);