243 lines
12 KiB
CSS
243 lines
12 KiB
CSS
: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}
|
|
|
|
.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}
|
|
.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)}
|
|
.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}
|
|
|
|
.help-body{display:flex;gap:18px;flex-wrap:wrap;overflow-y:auto}
|
|
.help-col{flex:1;min-width:240px}
|
|
.help-col ul{list-style:none;line-height:1.75}
|
|
.help-col li{color:var(--dim);font-size:.92em}
|
|
.help-col li b{color:var(--fg)}
|
|
.help-tip{border-top:1px solid var(--line);padding-top:8px;color:var(--gold);font-size:.85em}
|
|
|
|
.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 .sw{width:14px;height:14px;border:1px solid #000;flex:none}
|
|
.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}
|
|
|
|
::-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 触屏布局) ---------- */
|
|
/* 桌面端兜底:只要 <html> 没有 .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;
|
|
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:scale(.93);background:rgba(224,48,80,.6);border-color:#ff5c7a}
|
|
|
|
.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:scale(.92);filter:brightness(1.12)}
|
|
|
|
/* 未持枪时射击键置灰 */
|
|
#tc-gun.off{opacity:.4;filter:grayscale(1);background:rgba(18,18,28,.4)}
|