From 4e41ee2befcffc0650ef2db9ed7eb9b2da17f5b8 Mon Sep 17 00:00:00 2001
From: JOJO <1498581755@qq.com>
Date: Thu, 6 Aug 2026 16:24:13 +0800
Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E8=A1=8C=E6=A6=9C=E6=94=B9=E9=80=A0+B?=
=?UTF-8?q?oss=E6=8C=91=E6=88=98=E4=B8=80=E5=91=BD=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 排行榜30秒自动刷新(进入页面已刷新,定时器仅home界面生效,刷新不闪屏)
- boss榜不再统计累计击坠:改为Boss挑战(rush)击败过的不同Boss数/总数(11),按mode=rush+win=1去重stage;rush局stage记录Boss索引
- Boss挑战一命制:startRushGo强制lives=1/maxLives=1,掉落与拾取加命均以maxLives为上限,中途无法再加命
- 排行榜文案:Boss挑战tab/Boss列头
---
star-raid/index.html | 4 ++--
star-raid/js/home.js | 14 ++++++++++++--
star-raid/js/ui.js | 2 ++
star-raid/server/api.js | 20 +++++++++++++++-----
4 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/star-raid/index.html b/star-raid/index.html
index 2074489..d409855 100644
--- a/star-raid/index.html
+++ b/star-raid/index.html
@@ -49,10 +49,10 @@
diff --git a/star-raid/js/home.js b/star-raid/js/home.js
index 0b762bd..7882348 100644
--- a/star-raid/js/home.js
+++ b/star-raid/js/home.js
@@ -1,6 +1,13 @@
"use strict";
/* ================= 飞行员大厅(主页):排行榜 + 图鉴展柜背景 ================= */
let LB_SORT = "endless";
+let LB_T = 0; // 排行榜自动刷新定时器
+
+/* 排行榜 30 秒自动刷新(进入页面时 enterHome 已刷新一次) */
+function lbAutoRefresh() {
+ if (LB_T) return;
+ LB_T = setInterval(() => { if (UI === "home") buildLeaderboard(LB_SORT); }, 30000);
+}
/* 图鉴已收集数(只统计合法 key) */
function codexCount() {
@@ -21,6 +28,7 @@ async function enterHome() {
/* status===0 网络抖动:沿用现有数据,不踢出 */
buildHomeStats();
buildLeaderboard(LB_SORT);
+ lbAutoRefresh();
}
function buildHomeStats() {
@@ -42,17 +50,19 @@ document.querySelectorAll(".lb-tabs button").forEach((b) => {
async function buildLeaderboard(sort) {
const list = $("lb-list");
- list.innerHTML = '
载入中...
';
+ if (!list.children.length) list.innerHTML = '
载入中...
'; // 首次/空态才显示载入,自动刷新不闪屏
const r = await NET.api("/api/leaderboard?sort=" + sort, "GET");
if (!r.ok) { list.innerHTML = '
载入失败
'; return; }
const rows = r.data.rows || [];
list.innerHTML = "";
if (!rows.length) { list.innerHTML = '
虚位以待
'; return; }
const meName = NET.user && NET.user.username;
+ const bossTotal = r.data.bossTotal || 11;
rows.forEach((row, i) => {
const d = document.createElement("div");
d.className = "lb-row" + (meName && row.username === meName ? " me" : "");
- const cells = [String(i + 1), row.username, String(row.bossKills), row.codexN + "/" + r.data.codexTotal, String(row.endlessHigh)];
+ const bossCell = sort === "boss" ? row.bossKills + "/" + bossTotal : String(row.bossKills); // boss 榜显示“击败几个/总共几个”
+ const cells = [String(i + 1), row.username, bossCell, row.codexN + "/" + r.data.codexTotal, String(row.endlessHigh)];
for (const c of cells) {
const s = document.createElement("span");
s.textContent = c; // textContent 防注入
diff --git a/star-raid/js/ui.js b/star-raid/js/ui.js
index dbf1c69..a33da7f 100644
--- a/star-raid/js/ui.js
+++ b/star-raid/js/ui.js
@@ -376,6 +376,8 @@ function startRushGo(i,build){
G.drones={};build.d.forEach(k=>G.drones[k]=2);G.droneLoadout=build.d.slice();
G.xpNeed=1e9; // 挑战模式无升级打断
G.rushIdx=i;G.rushT0=0;
+ G.stage=i; // 排行榜统计:rush 局 stage 记录 Boss 索引(0~10)
+ G.lives=1;G.stat.maxLives=1; // BOSS 挑战一命制:掉落/拾取心均以 maxLives 为上限,中途无法再加命
UI="play";show("");acc=0;
MUS.start(true);
banner("BOSS 挑战 — "+BOSSES[i].name,"#ff5566",130);
diff --git a/star-raid/server/api.js b/star-raid/server/api.js
index c618123..9c60ddf 100644
--- a/star-raid/server/api.js
+++ b/star-raid/server/api.js
@@ -194,15 +194,25 @@ function me(req, res, ctx) {
/* ---------- GET /api/leaderboard?sort=endless|boss|codex ---------- */
const LB_COLS = { endless: "endless_high", boss: "boss_kills", codex: "codexN" };
+const BOSS_TOTAL = 11; // 与 js/enemies.js BOSSES 数量同步
function leaderboard(req, res, ctx, _body, query) {
- const col = LB_COLS[(query && query.get("sort")) || ""] || "endless_high";
- /* col 来自上方白名单映射,非用户输入直接拼接 */
- const rows = db.prepare(`
+ const sort = (query && query.get("sort")) || "";
+ const bossSort = sort === "boss";
+ /* boss 榜:不统计累计击坠,改为 BOSS 挑战(rush)模式下击败过几个不同 Boss(去重)/ 总共 Boss 数 */
+ const rows = bossSort ? db.prepare(`
+ SELECT u.username AS username,
+ (SELECT COUNT(DISTINCT r.stage) FROM runs r
+ WHERE r.user_id=u.id AND r.mode='rush' AND r.win=1 AND r.stage BETWEEN 0 AND 10) AS bossKills,
+ s.endless_high AS endlessHigh,
+ (SELECT COUNT(*) FROM codex_unlocks c WHERE c.user_id=u.id) AS codexN
+ FROM users u JOIN user_stats s ON s.user_id=u.id
+ ORDER BY bossKills DESC, u.id ASC LIMIT 100`).all()
+ : db.prepare(`
SELECT u.username AS username, s.boss_kills AS bossKills, s.endless_high AS endlessHigh,
(SELECT COUNT(*) FROM codex_unlocks c WHERE c.user_id=u.id) AS codexN
FROM users u JOIN user_stats s ON s.user_id=u.id
- ORDER BY ${col} DESC, u.id ASC LIMIT 100`).all();
- return ctx.ok({ rows, codexTotal: CODEX_TOTAL, sort: col });
+ ORDER BY ${LB_COLS[sort] || "endless_high"} DESC, u.id ASC LIMIT 100`).all();
+ return ctx.ok({ rows, codexTotal: CODEX_TOTAL, bossTotal: BOSS_TOTAL, sort });
}
/* ---------- POST /api/run ----------