starraid/star-raid/index.html
JOJO 9d048a2aa9 无尽模式断点续玩:进度云端存档,中途退出可续玩,新开需确认结算旧档
- 服务端:run_saves 表(每账号1栏位)+ GET/POST/DELETE /api/run_save,vRunSave 白名单校验
- 波次检查点:startWave 拍快照上传;中途放弃任务不结算(星币/分数留快照);死亡删档
- 出击页卡片显示未完成对局并一键续玩(该波从头重打,bossN 不偏移)
- 新开无尽(不分难度)弹窗确认→旧档按当前进度结算(星币入账+上报排行榜)再开新局
- NET._rsQ 串行队列防删建竞态;顺带修复 SHIP_KEYS 漏 asura 致修罗云同步丢失
2026-08-06 12:50:37 +08:00

205 lines
9.5 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
<link rel="icon" href="data:,">
<title>星尘突击队 STAR RAID</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="wrap">
<canvas id="game" width="240" height="320"></canvas>
<div id="scan"></div><div id="vig"></div>
<!-- 登陆/注册 -->
<div class="ovl" id="o-auth">
<div class="tag">PIXEL ROGUELIKE SHMUP</div>
<h1 class="logo">STAR<br>RAID</h1>
<div class="logo-cn">星尘突击队</div>
<div class="panel" style="width:min(92%,340px)">
<div class="row" style="gap:6px">
<button class="btn primary" id="tab-login" style="min-width:0;flex:1">登 陆</button>
<button class="btn" id="tab-reg" style="min-width:0;flex:1">注 册</button>
</div>
<form class="auth-f" id="f-login">
<input id="li-id" placeholder="用户名 / 邮箱" maxlength="64" autocomplete="username" required>
<input id="li-pw" type="password" placeholder="密码" maxlength="72" autocomplete="current-password" required>
<button class="btn primary" type="submit">进入星域 ▶</button>
</form>
<form class="auth-f hide" id="f-reg">
<input id="rg-name" placeholder="用户名2-16位" maxlength="16" autocomplete="off" required>
<input id="rg-email" type="email" placeholder="邮箱" maxlength="64" autocomplete="off" required>
<input id="rg-pw" type="password" placeholder="密码至少8位" maxlength="72" autocomplete="new-password" required>
<input id="rg-pw2" type="password" placeholder="确认密码" maxlength="72" autocomplete="new-password" required>
<button class="btn primary" type="submit">创建飞行员档案</button>
</form>
<div class="h3" id="auth-err" style="color:var(--red)"> </div>
</div>
<div class="small">账号数据保存在服务器 · 排行榜与全服飞行员同台竞技</div>
</div>
<!-- 飞行员大厅(排行榜主页) -->
<div class="ovl hide" id="o-home">
<div class="h2" style="margin-top:2%">— 飞行员大厅 —</div>
<div class="h3" id="home-stats"> </div>
<div class="lb">
<div class="h3" style="color:var(--cyan);letter-spacing:3px">— 全服排行榜 TOP 100 —</div>
<div class="lb-tabs">
<button data-s="endless" class="on">无尽最高分</button>
<button data-s="boss">击坠Boss</button>
<button data-s="codex">图鉴收集</button>
</div>
<div class="lb-row lb-head"><span>#</span><span>飞行员</span><span>击坠</span><span>图鉴</span><span>无尽最高</span></div>
<div class="lb-list" id="lb-list"></div>
</div>
<div class="row" style="margin-bottom:2%">
<button class="btn primary" id="b-base" style="min-width:min(56vw,200px)">▶ 进入基地</button>
<button class="btn" id="b-logout" style="min-width:0">登出</button>
</div>
</div>
<!-- 标题 -->
<div class="ovl hide" id="o-title">
<div class="tag">PIXEL ROGUELIKE SHMUP</div>
<h1 class="logo">STAR<br>RAID</h1>
<div class="logo-cn">星尘突击队</div>
<div class="h3" id="best-line">BEST -- </div>
<div class="h3" id="pilot-line" style="color:var(--cyan)"> </div>
<div class="col" style="margin-top:6px">
<button class="btn primary" id="b-go">▶ 出击</button>
<button class="btn gold" id="b-hangar">✦ 机库强化</button>
<button class="btn" id="b-codex">❖ 军械图鉴</button>
<button class="btn danger" id="b-rush">☠ BOSS 挑战</button>
<button class="btn" id="b-lobby" style="min-width:min(48vw,180px)">⌂ 飞行员大厅</button>
</div>
<div class="small" style="margin-top:8px">键盘 WASD/方向键 移动 · 自动射击 · 超频充满自动暴走<br>SHIFT 精密移动 · P 暂停 · M 音乐</div>
</div>
<!-- 出击准备 -->
<div class="ovl hide" id="o-setup">
<div class="h2">— 出击准备 —</div>
<div id="resume-slot"></div>
<div class="h3">选择模式</div>
<div class="pick" id="mode-pick">
<div class="pcard" data-m="stage"><div class="nm" style="margin-top:2px">闯关模式</div><div class="ds">6 大关卡<br>击破母巢核心<br>即获胜利</div></div>
<div class="pcard sel" data-m="endless"><div class="nm" style="margin-top:2px">无尽模式</div><div class="ds">无限波次<br>突变词缀<br>冲击最高分</div></div>
</div>
<div class="h3">难度</div>
<div class="row" id="diff-pick">
<button class="btn sel-diff primary" data-d="0" style="min-width:110px;padding:8px 14px">普通</button>
<button class="btn sel-diff danger" data-d="1" style="min-width:110px;padding:8px 14px">困难</button>
</div>
<div class="row" style="margin-top:6px">
<button class="btn primary" id="b-start">开始出击 ▶</button>
<button class="btn" id="b-back1">返回</button>
</div>
</div>
<!-- Boss 挑战 -->
<div class="ovl hide" id="o-rush">
<div class="h2">— BOSS 挑战 —</div>
<div class="h3">随机武装3主武Lv3 · 3副武Lv3 · 2僚机Lv2 · 击破计时</div>
<div class="togrow"><label><input type="checkbox" id="rush-anim"> 老虎机抽奖动画</label></div>
<div class="pick" id="rush-pick"></div>
<button class="btn" id="b-back6" style="margin-top:6px">返回</button>
</div>
<!-- 武装抽取(老虎机) -->
<div class="ovl hide" id="o-slot">
<div class="h2">— 武装抽取 —</div>
<div class="slotrow" id="slot-row"></div>
<div class="h3" id="slot-hint"> </div>
</div>
<!-- 机库 -->
<div class="ovl hide" id="o-hangar">
<div class="h2">— 机库 · 强化 —</div>
<div class="wallet">星币 ✦ <span id="wallet">0</span></div>
<div class="h3">机体(选择 / 解锁)</div>
<div class="pick" id="ship-pick"></div>
<div class="h3">永久强化</div>
<div class="shop" id="shop" style="overflow-y:auto;max-height:42%"></div>
<button class="btn" id="b-back2" style="margin-top:6px">返回</button>
</div>
<!-- 升级三选一 -->
<div class="ovl hide" id="o-cards">
<div class="h2 blink">▲ LEVEL UP ▲</div>
<div class="h3">选择一项强化(按 1 / 2 / 3</div>
<div id="cards"></div>
</div>
<!-- 暂停 -->
<div class="ovl hide" id="o-pause">
<div class="h2">‖ 暂停 · 军械配置</div>
<div id="loadout" style="width:100%;max-height:52%;overflow-y:auto"></div>
<div class="col">
<button class="btn primary" id="b-resume">继续战斗</button>
<button class="btn" id="b-restart">重新开始</button>
<button class="btn danger" id="b-quit">放弃任务</button>
</div>
</div>
<!-- 图鉴 -->
<div class="ovl hide" id="o-codex">
<div class="h2"><span id="cx-secret" style="user-select:none"></span>械图鉴 —</div>
<div class="h3">已收集 <span id="codex-n">0</span>/<span id="codex-t">0</span> · 点击可实时演示<span id="codex-test" title="临时解锁全部军械查看/演示,不写入后端,刷新页面即失效" style="display:none;color:var(--gold)"> · ⚠ 测试模式</span></div>
<div id="codex" style="overflow-y:auto;max-height:72%;width:100%;display:flex;flex-direction:column;align-items:center"></div>
<button class="btn" id="b-back4">返回</button>
</div>
<!-- 武器演示(全屏实战模拟,透明覆盖层不挡画布) -->
<div class="ovl hide" id="o-demo" style="background:transparent;pointer-events:none;justify-content:space-between;overflow:hidden">
<div style="margin-top:3%">
<div class="h2" id="demo-name">演示</div>
<div class="h3" id="demo-ds" style="margin:0 auto;white-space:nowrap"></div>
</div>
<button class="btn" id="b-back5" style="pointer-events:auto;margin-bottom:4%">返回图鉴</button>
</div>
<!-- 结算 -->
<div class="ovl hide" id="o-over">
<div class="h2" id="over-title">任务失败</div>
<div class="panel"><div class="stat-grid" id="over-stats"></div></div>
<div class="wallet">获得星币 ✦ <span id="over-coins">0</span></div>
<div class="col">
<button class="btn primary" id="b-again">再来一局</button>
<button class="btn" id="b-home">返回基地</button>
</div>
</div>
<!-- 结算未完成对局确认 -->
<div class="ovl hide" id="o-unsaved">
<div class="h2" style="color:var(--gold)">⚠ 存在未完成的对局</div>
<div class="panel" style="width:min(92%,320px)"><div class="stat-grid" id="unsaved-info"></div></div>
<div class="h3" style="color:var(--red)">开始新的无尽对局将直接结算该对局</div>
<div class="col">
<button class="btn danger" id="b-settle-go">结算旧局 · 开始新对局</button>
<button class="btn primary" id="b-unsaved-resume">▶ 继续旧对局</button>
<button class="btn" id="b-unsaved-cancel">取消</button>
</div>
</div>
<button id="tb-pause" style="display:none">| |</button>
</div>
<script src="js/config.js"></script>
<script src="js/audio.js"></script>
<script src="js/sprites.js"></script>
<script src="js/data.js"></script>
<script src="js/core.js"></script>
<script src="js/enemies.js"></script>
<script src="js/combat.js"></script>
<script src="js/render.js"></script>
<script src="js/boss_art.js"></script>
<script src="js/net.js"></script>
<script src="js/ui.js"></script>
<script src="js/auth.js"></script>
<script src="js/home.js"></script>
</body>
</html>