:root{ --bg:#0a0a10; --bg2:#13131c; --line:#2c2c3c; --fg:#e8e8f0; --dim:#9a9ab0; --red:#e03050; --red2:#ff5c7a; --gold:#ffc63a; --green:#3ddc84; --blue:#4aa8ff; --purple:#a86bff; } *{box-sizing:border-box;margin:0;padding:0} html,body{height:100%;overscroll-behavior:none} body{ background: radial-gradient(circle at 50% 20%, #1a1a28 0%, #08080d 70%); color:var(--fg); font-family:"Courier New",Consolas,Monaco,monospace; display:flex;align-items:center;justify-content:center; overflow:hidden; } #app{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:8px} #stage{ position:relative; width:min(100%, calc((100vh - 16px) * 800 / 608)); aspect-ratio:800/608; background:#000; border:3px solid var(--line); box-shadow:0 0 0 3px #000, 0 12px 60px rgba(0,0,0,.8); overflow:hidden; } canvas#game{ width:100%;height:100%;display:block; image-rendering:pixelated;image-rendering:crisp-edges; background:#0d0d16; } /* ---------- HUD ---------- */ #hud{position:absolute;inset:0;pointer-events:none;font-size:clamp(9px,1.35vh,14px)} .hud-row{position:absolute;top:8px;left:8px;right:8px;display:flex;gap:6px;flex-wrap:wrap} .hud-box{ background:rgba(0,0,0,.55);border:1px solid rgba(255,255,255,.18); padding:3px 8px;letter-spacing:.5px;color:#fff;text-shadow:0 1px 0 #000; } .hud-box#hud-save.on{color:#d9b3ff;border-color:rgba(176,107,255,.7);box-shadow:0 0 8px rgba(176,107,255,.35)} #boss-bar{position:absolute;top:38px;left:50%;transform:translateX(-50%);width:60%;min-width:220px} .boss-name{text-align:center;font-size:clamp(10px,1.6vh,15px);letter-spacing:3px;color:var(--red2);text-shadow:0 2px 0 #000;margin-bottom:3px} .boss-track{height:12px;background:#22222e;border:2px solid #000;box-shadow:0 0 0 1px #555} .boss-fill{height:100%;width:100%;background:linear-gradient(#ff6b8a,#c01a3a);transition:width .12s linear} #toast{ position:absolute;left:50%;top:34%;transform:translateX(-50%); background:rgba(0,0,0,.72);border:1px solid #fff3;padding:8px 16px; font-size:clamp(11px,2vh,18px);color:#fff;opacity:0;transition:opacity .2s;max-width:80%;text-align:center;line-height:1.5; } #toast.show{opacity:1} /* ---------- Screens ---------- */ .screen{ position:absolute;inset:0;display:flex;flex-direction:column; align-items:center;justify-content:center;gap:2vh;padding:3vh 3vw; background:linear-gradient(#0a0a12ee,#0a0a12f6); backdrop-filter:blur(2px); font-size:clamp(10px,1.6vh,15px); } .screen.hidden{display:none} #hud.hidden,#boss-bar.hidden{display:none} .hidden{display:none !important} /* 通用:任何元素加 hidden 类即隐藏(如自制页「管理地图」按钮) */ .title-wrap{text-align:center;margin-bottom:1vh} .title-sub{color:var(--dim);letter-spacing:6px;font-size:.75em} .title-main{ font-size:clamp(22px,5.6vh,54px);line-height:1.05;letter-spacing:2px; text-shadow:3px 3px 0 #000, 0 0 24px rgba(224,48,80,.35); } .title-main .red{color:var(--red);text-shadow:3px 3px 0 #000,0 0 20px rgba(224,48,80,.6)} .title-tag{margin-top:1vh;color:var(--gold);letter-spacing:2px;font-size:.9em} .menu{display:flex;flex-direction:column;gap:8px;width:min(340px,80%)} .btn{ background:var(--bg2);color:var(--fg);border:2px solid var(--line); padding:9px 14px;font-family:inherit;font-size:1em;letter-spacing:2px; cursor:pointer;transition:.12s;text-align:center; } .btn:hover{background:var(--red);border-color:var(--red2);color:#fff;transform:translateY(-1px)} .btn:active{transform:translateY(1px)} .btn.big{font-size:1.25em;padding:12px;background:var(--red);border-color:var(--red2)} .btn.big:hover{background:#ff4466} .btn.small{font-size:.8em;padding:6px;color:var(--dim)} .btn.tiny{font-size:.8em;padding:5px 10px} .btn.go{background:var(--green);border-color:#7dffb0;color:#04180d} .foot{position:absolute;bottom:10px;color:#5a5a70;font-size:.72em;text-align:center;width:100%;padding:0 12px} /* ---------- Panels ---------- */ .panel{ background:var(--bg2);border:2px solid var(--line); width:min(760px,96%);max-height:94%;display:flex;flex-direction:column; padding:14px;gap:10px;overflow:hidden; } .panel.narrow{width:min(400px,92%)} .panel-head{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding-bottom:6px} .head-btns{display:flex;gap:6px;align-items:center} .head-btns .btn.on{background:var(--red);border-color:var(--red2);color:#fff} .panel h2{font-size:1.3em;letter-spacing:3px} .panel h3{font-size:1em;letter-spacing:2px;color:var(--gold);margin-bottom:5px} .tabs{display:flex;gap:6px;flex-wrap:wrap} .tab{ background:#1b1b26;border:1px solid var(--line);color:var(--dim); padding:4px 12px;cursor:pointer;font-size:.9em;letter-spacing:1px;font-family:inherit; } .tab.on{background:var(--red);border-color:var(--red2);color:#fff} .level-grid{ display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr)); gap:8px;overflow-y:auto;padding:4px 2px;flex:1;align-content:start; } .lv-card{ background:#1a1a25;border:1px solid var(--line);padding:8px;cursor:pointer; transition:.12s;position:relative;text-align:left; } .lv-card:hover{border-color:var(--red2);background:#24243a;transform:translateY(-2px)} .lv-card .idx{color:#55556a;font-size:.75em} .lv-card .nm{font-size:1.05em;margin:2px 0 5px;letter-spacing:1px} .lv-card .meta{display:flex;gap:5px;align-items:center;flex-wrap:wrap;font-size:.78em;color:var(--dim)} .lv-card .st{margin-top:5px;font-size:.78em;color:var(--dim)} .lv-card.cleared{border-color:#2f6b45} .lv-card .chk{position:absolute;right:7px;top:6px;color:var(--green)} /* 自制页管理态:删除按钮 */ .lv-card.manage{cursor:default;border-color:var(--red2)} .lv-card.manage:hover{transform:none;border-color:var(--red);background:#241a22} .lv-del{ position:absolute;right:6px;top:6px;width:22px;height:22px;padding:0; background:#3a1420;border:1px solid var(--red2);color:var(--red); font-family:inherit;font-size:.8em;line-height:1;cursor:pointer;border-radius:2px; } .lv-del:hover{background:var(--red);color:#fff;border-color:var(--red)} .tag{padding:1px 6px;border:1px solid;font-size:.85em} .t-jump{color:#ff8a5c;border-color:#ff8a5c} .t-endur{color:#4ad0ff;border-color:#4ad0ff} .t-boss{color:#ff5c7a;border-color:#ff5c7a} .t-troll{color:#c08aff;border-color:#c08aff} .t-custom{color:#ffc63a;border-color:#ffc63a} .legend{display:flex;gap:8px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:7px;color:var(--dim);font-size:.85em;align-items:center} .clear-title{text-align:center;font-size:2.4em;color:var(--gold);letter-spacing:6px;text-shadow:3px 3px 0 #000} .result-body{display:flex;flex-direction:column;gap:5px} .rline{display:flex;justify-content:space-between;border-bottom:1px dotted var(--line);padding:4px 2px} .rline span{color:var(--dim)} .rbest{color:var(--green);font-size:.85em;text-align:center;margin-top:4px} /* ---------- Editor ---------- */ .editor-wrap{display:flex;gap:10px;flex:1;overflow:hidden} .palette{width:112px;display:flex;flex-direction:column;gap:3px;overflow-y:auto;border-right:1px solid var(--line);padding-right:6px} .pal{ display:flex;align-items:center;gap:5px;background:#1b1b26;border:1px solid var(--line); padding:2px 5px;cursor:pointer;font-size:.75em;color:var(--dim); } .pal:hover{border-color:#888} .pal.on{border-color:var(--gold);color:#fff;background:#2b2b3c} .pal-cv{width:26px;height:26px;flex:none;border:1px solid #000;background:#101018;image-rendering:pixelated} .pal .ch{font-weight:bold;color:var(--fg);width:12px;text-align:center} .editor-main{flex:1;display:flex;flex-direction:column;gap:6px;min-width:0;overflow:auto} .editor-bar{display:flex;gap:5px;align-items:center;flex-wrap:wrap} .editor-bar input,.editor-bar select{ background:#111119;border:1px solid var(--line);color:var(--fg); font-family:inherit;font-size:.85em;padding:4px 6px; } #ed-name{width:110px}#ed-w{width:52px}#ed-h{width:52px} .ed-wh{display:inline-flex;align-items:center;gap:3px;font-size:.78em;color:var(--dim)} .ed-wh input{width:48px} canvas#ed-canvas{ width:800px;height:auto;background:#0d0d16;border:1px solid var(--line); image-rendering:pixelated;cursor:crosshair;display:block; } .editor-tip{color:var(--dim);font-size:.78em} .editor-side{width:170px;display:flex;flex-direction:column;gap:5px;border-left:1px solid var(--line);padding-left:8px;overflow-y:auto} #my-levels{display:flex;flex-direction:column;gap:4px} .my-lv{background:#1b1b26;border:1px solid var(--line);padding:4px 6px;font-size:.78em;cursor:pointer;display:flex;justify-content:space-between;gap:4px} .my-lv:hover{border-color:var(--gold)} .my-lv.on{border-color:var(--gold);background:#2b2b3c} .my-lv .x{color:var(--red)} .face-btns{display:flex;gap:4px;flex-wrap:wrap} #ed-faces{display:flex;flex-direction:column;gap:4px;max-height:160px;overflow-y:auto} .face-row{background:#1b1b26;border:1px solid var(--line);padding:3px 5px;font-size:.78em;cursor:pointer;display:flex;flex-direction:column;gap:2px} .face-row:hover{border-color:var(--gold)} .face-row.on{border-color:var(--gold);background:#2b2b3c} .face-row .face-name{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:2px 4px;width:100%} .face-row .face-wh{color:var(--dim);font-size:.9em} /* 属性面板(选中方块) */ #ed-props{display:flex;flex-direction:column;gap:5px;max-height:36vh;overflow-y:auto;border:1px solid var(--line);background:#111119;padding:6px} .prop-empty{color:var(--dim);font-size:.76em;line-height:1.5} .prop-head{color:var(--gold);font-weight:bold;font-size:.92em;letter-spacing:1px;margin-bottom:2px} .prop-row{display:flex;flex-direction:column;gap:3px;background:#1b1b26;border:1px solid var(--line);padding:4px 5px;font-size:.78em} .prop-lab{color:var(--fg)} .prop-note{color:var(--dim);font-size:.92em} .prop-ctl{display:flex;gap:4px} .prop-in{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:3px 4px;width:100%} .prop-ctl .prop-in{width:auto;flex:1} /* 「保存」去向提示 */ .save-state{color:var(--dim);font-size:.78em;white-space:nowrap;align-self:center} .save-state.on{color:var(--gold)} /* 导入地图弹窗 */ .modal{position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;background:rgba(4,4,10,.72);padding:4vh 4vw} .modal.hidden{display:none} .modal-panel{background:var(--bg2);border:2px solid var(--line);width:min(380px,94%);max-height:86vh;display:flex;flex-direction:column;gap:8px;padding:14px} .modal-panel h3{font-size:1.05em;letter-spacing:2px;color:var(--gold)} .modal-tip{color:var(--dim);font-size:.78em;line-height:1.5} #ed-import-list{display:flex;flex-direction:column;gap:4px;overflow-y:auto} .imp-row{background:#1b1b26;border:1px solid var(--line);padding:6px 8px;font-size:.84em;cursor:pointer;display:flex;justify-content:space-between;align-items:center;gap:6px} .imp-row:hover{border-color:var(--gold)} .imp-row.on{border-color:var(--gold);background:#2b2b3c} .imp-nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} .imp-meta{color:var(--dim);font-size:.9em;white-space:nowrap} .imp-empty{color:var(--dim);font-size:.8em;padding:10px 2px} .modal-btns{display:flex;justify-content:flex-end;gap:6px} /* ---------- 设置界面 ---------- */ .title-user{color:var(--dim);font-size:.85em;letter-spacing:2px;margin-top:1vh} .set-body{display:flex;flex-direction:column;gap:14px;overflow-y:auto;padding:2px} .set-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap} .set-row.col{flex-direction:column;align-items:stretch;gap:6px;justify-content:flex-start} .set-lab{color:var(--gold);letter-spacing:1px;font-size:.95em;min-width:64px} .set-in{background:#111119;border:1px solid var(--line);color:var(--fg);font-family:inherit;font-size:1em;padding:6px 8px;min-width:200px} .set-in:focus{outline:none;border-color:var(--gold)} .set-hint{color:var(--dim);font-size:.78em} .set-btns{margin-top:2px} /* 键盘按键映射面板(电脑端) */ .set-keys{display:flex;flex-direction:column;gap:8px} .krow{display:flex;align-items:center;gap:12px;flex-wrap:wrap} .kact{color:var(--fg);min-width:104px;font-size:.92em} .kkeys{display:flex;align-items:center;gap:6px;flex-wrap:wrap} .kchip{ position:relative;background:#1a1a26;border:1px solid var(--line);color:var(--fg); font-family:inherit;font-size:.88em;padding:5px 22px 5px 10px;border-radius:7px;cursor:pointer; transition:border-color .1s,background .1s; } .kchip:hover{border-color:var(--gold)} .kchip.listen{border-color:var(--gold);background:rgba(255,198,58,.16);box-shadow:0 0 0 2px rgba(255,198,58,.25)} .kchip .krm{ position:absolute;top:-7px;right:-7px;width:16px;height:16px;border-radius:50%; background:#c01a3a;color:#fff;font-size:.62em;line-height:16px;text-align:center; border:1px solid #000;cursor:pointer; } .kadd{ background:transparent;border:1px dashed var(--line);color:var(--dim); font-family:inherit;font-size:.82em;padding:5px 9px;border-radius:7px;cursor:pointer; } .kadd:hover{color:var(--gold);border-color:var(--gold)} .klisten{color:var(--gold);font-size:.8em;animation:blink 1s infinite} .klisten.bad{color:#ff6b6b;animation:none;font-weight:bold} .kwarb{ width:100%;box-sizing:border-box;margin:0 0 10px;padding:8px 12px;border-radius:8px; background:rgba(192,26,58,.16);border:1px solid #c01a3a;color:#ff8a8a;font-size:.86em; } @keyframes blink{50%{opacity:.4}} /* 手机手柄预览区(与舞台同比例),按钮绝对定位可拖拽 */ .touch-preview{ position:relative;width:100%;aspect-ratio:800/608; background:#0d0d16;border:1px solid var(--line);overflow:hidden;max-height:46vh; } .tp-tip{ position:absolute;top:6px;left:50%;transform:translateX(-50%); color:var(--dim);font-size:.72em;background:rgba(0,0,0,.45); padding:2px 8px;border-radius:6px;pointer-events:none;z-index:3;white-space:nowrap; } ::-webkit-scrollbar{width:8px;height:8px} ::-webkit-scrollbar-track{background:#111} ::-webkit-scrollbar-thumb{background:#333;} @media (max-width:720px){ .editor-wrap{flex-direction:column;overflow-y:auto} .palette{width:100%;flex-direction:row;flex-wrap:wrap;border-right:none;border-bottom:1px solid var(--line);padding-bottom:6px} .editor-side{width:100%;border-left:none;border-top:1px solid var(--line);padding-top:8px} } /* ---------- 移动端虚拟手柄(参考 IWBT Creator 触屏布局) ---------- */ /* 桌面端兜底:只要 没有 .touch 类(即未检测到移动端/触屏),无论如何都不显示按钮 */ html:not(.touch) #touch{display:none !important} #touch{ position:absolute;inset:0;z-index:25; display:flex;justify-content:space-between;align-items:flex-end; padding:12px 12px max(14px, env(safe-area-inset-bottom)); pointer-events:none; /* 仅按钮可点,中间区域穿透到画布 */ touch-action:none; } #touch.hidden{display:none} .tc-left,.tc-right{display:flex;gap:14px;align-items:flex-end;pointer-events:none} .tc-right{flex-direction:column;align-items:flex-end} .tc-top{display:flex;gap:10px;margin-bottom:10px} .tc-mid{display:flex;gap:12px;align-items:flex-end;margin-bottom:10px} .tc-btn{ pointer-events:auto;-webkit-user-select:none;user-select:none;touch-action:none; position:absolute;transform:translate(-50%,-50%); background:rgba(18,18,28,.52);border:2px solid rgba(255,255,255,.28); color:#fff;font-family:inherit;display:flex;align-items:center;justify-content:center; flex-direction:column;line-height:1;backdrop-filter:blur(2px); box-shadow:0 2px 8px rgba(0,0,0,.35); transition:transform .05s, background .1s, filter .1s; } .tc-btn span{font-size:1.5em} .tc-btn .lbl{font-size:.6em;letter-spacing:1px;opacity:.85;margin-top:2px} .tc-btn.on,.tc-btn:active{transform:translate(-50%,-50%) scale(.93);background:rgba(224,48,80,.6);border-color:#ff5c7a} /* 设置界面预览里的缩放手柄(真实手柄不挂此元素) */ .tc-rsz{ position:absolute;right:-7px;bottom:-7px;width:16px;height:16px;border-radius:50%; background:var(--gold);border:2px solid #000;cursor:nwse-resize;opacity:.92;touch-action:none; box-shadow:0 1px 4px rgba(0,0,0,.5); } .tc-move{width:62px;height:62px;border-radius:14px} .tc-item{width:54px;height:54px;border-radius:50%} .tc-sm{width:42px;height:42px;border-radius:11px;font-size:1em} .tc-jump{ width:94px;height:94px;border-radius:50%;margin-top:4px; background:radial-gradient(circle at 35% 30%, #ff7088, #c01a3a); border:3px solid #ffd0da;box-shadow:0 6px 18px rgba(192,26,58,.5); font-size:1.9em;font-weight:bold;color:#fff; } .tc-jump.on,.tc-jump:active{transform:translate(-50%,-50%) scale(.92);filter:brightness(1.12)} /* 未持枪时射击键置灰 */ #tc-gun.off{opacity:.4;filter:grayscale(1);background:rgba(18,18,28,.4)}