starraid/star-raid/js/home.js
JOJO 559e70fac5 feat(mobile): 全屏自适应布局,适配手机/折叠屏/平板
- #wrap 去除外框限制,竖屏/方形屏占满全屏(逻辑分辨率动态:宽240、高按屏比 clamp[280,640])
- 横屏 letterbox:中间 3:4 竖屏显示区域居中,UI 收紧压缩
- viewport-fit=cover + safe-area-inset 适配刘海屏/底部横条
- 星星背景按视口面积重建,保持星空密度
- resize/orientationchange 自动重新适配,对局中旋转位置自动修正
2026-08-06 16:05:03 +08:00

85 lines
3.5 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
/* ================= 飞行员大厅(主页):排行榜 + 图鉴展柜背景 ================= */
let LB_SORT = "endless";
/* 图鉴已收集数(只统计合法 key */
function codexCount() {
let n = 0;
for (const k in SAVE.codex)
if (SAVE.codex[k] && (WEAPONS[k] || SUBS[k] || DRONES[k] || PASSIVES[k])) n++;
return n;
}
async function enterHome() {
G = null; // 触发主循环看门狗重建实战模拟背景
UI = "home";
show("o-home");
/* 刷新账号数据stats/codex再渲染面板与排行榜 */
const r = await NET.api("/api/me", "GET");
if (r.ok && r.data.user) NET._apply(r.data);
else if (r.ok) { NET.user = null; UI = "auth"; show("o-auth"); return; } // 会话失效
/* status===0 网络抖动:沿用现有数据,不踢出 */
buildHomeStats();
buildLeaderboard(LB_SORT);
}
function buildHomeStats() {
const s = NET.stats || { bossKills: 0, endlessHigh: 0 };
const nm = NET.user ? NET.user.username : "--";
$("home-stats").textContent =
`${nm} · 击坠Boss ${s.bossKills} · 图鉴 ${codexCount()}/${NET.codexTotal} · 无尽最高 ${s.endlessHigh}`;
}
/* ---------- 排行榜 ---------- */
document.querySelectorAll(".lb-tabs button").forEach((b) => {
b.onclick = () => {
LB_SORT = b.dataset.s;
document.querySelectorAll(".lb-tabs button").forEach((x) => x.classList.toggle("on", x === b));
SFX.pick();
buildLeaderboard(LB_SORT);
};
});
async function buildLeaderboard(sort) {
const list = $("lb-list");
list.innerHTML = '<div class="lb-empty">载入中...</div>';
const r = await NET.api("/api/leaderboard?sort=" + sort, "GET");
if (!r.ok) { list.innerHTML = '<div class="lb-empty">载入失败</div>'; return; }
const rows = r.data.rows || [];
list.innerHTML = "";
if (!rows.length) { list.innerHTML = '<div class="lb-empty">虚位以待</div>'; return; }
const meName = NET.user && NET.user.username;
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)];
for (const c of cells) {
const s = document.createElement("span");
s.textContent = c; // textContent 防注入
d.appendChild(s);
}
list.appendChild(d);
});
}
/* ---------- 大厅/基地背景:实战模拟 ----------
复用真实战斗引擎:随机 3主武Lv3 + 3副武Lv3 + 2僚机Lv2自动驾驶随机刷怪。
与图鉴演示同源G.demoSim 真值→自动走位/无HUD/demoSpawnG.homeSim 标记用于静音与渲染门控 */
function startHomeSim() {
newRun("stage", "falcon", 0);
const build = rollRushBuild(); // 与BOSS挑战同款随机武装
G.weapons = {}; build.m.forEach((k) => (G.weapons[k] = 3)); G.loadout = build.m.slice();
G.subs = {}; build.s.forEach((k) => (G.subs[k] = 3)); G.subLoadout = build.s.slice();
G.drones = {}; build.d.forEach((k) => (G.drones[k] = 2)); G.droneLoadout = build.d.slice();
G.xpNeed = 1e9; // 不升级打断
G.p.inv = 999999; // 背景模拟:玩家无伤
G.demoSim = { home: true };
G.homeSim = true;
}
/* ================= 视口自适应(手机/折叠屏/平板) =================
首次加载即适配当前屏幕;旋转/缩放时重新计算逻辑分辨率并铺满全屏 */
addEventListener("resize",fitViewport);
addEventListener("orientationchange",()=>setTimeout(fitViewport,250));
fitViewport();