:root{--bg: #f7f7f7;--ink: #535353;--ink-soft: #757575;--mid: #b0b0b0;--faint: #e3e3e3;--red: #ff3b30;--gold: #f5a800;--green: #34c759;--blue: #0a84ff;--orange: #ff9500;--panel-bg: #f7f7f7f0;--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;--sans: "Noto Sans TC", "PingFang TC", "Microsoft JhengHei", sans-serif}*{margin:0;padding:0;box-sizing:border-box}html,body{height:100%;background:var(--bg);overflow:hidden;overscroll-behavior:none}body{font-family:var(--sans);color:var(--ink);-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}#app,#touchUI{-webkit-user-select:none;user-select:none}input,select{-webkit-user-select:auto;user-select:auto}#app{position:fixed;inset:0;display:flex;align-items:center;justify-content:center}#stage{position:relative;width:min(100vw,calc(100vh * 16 / 9));height:min(100vh,56.25vw)}canvas#game{width:100%;height:100%;display:block;image-rendering:pixelated;cursor:crosshair;background:var(--bg)}canvas#game3d{position:absolute;inset:0;width:100%;height:100%;display:block;cursor:crosshair;background:var(--bg)}#float3d{position:absolute;inset:0;z-index:15;pointer-events:none;overflow:hidden}.float3d{position:absolute;transform:translate(-50%,-50%);font-family:var(--sans);font-weight:800;white-space:nowrap;text-shadow:0 1px 3px rgba(0,0,0,.85),0 0 8px currentColor;animation:float3d-up .85s ease-out forwards;will-change:transform,opacity}.float3d.big{animation-duration:1.05s}@keyframes float3d-up{0%{opacity:0;transform:translate(-50%,-50%) scale(.6)}18%{opacity:1;transform:translate(-50%,-90%) scale(1.18)}to{opacity:0;transform:translate(-50%,-210%) scale(1)}}#reticle{position:absolute;left:50%;top:50%;width:0;height:0;z-index:16;pointer-events:none}#reticle .rt-dot{position:absolute;left:-2px;top:-2px;width:4px;height:4px;border-radius:50%;background:#ffffffeb;box-shadow:0 0 4px #000000b3}#reticle .rt-line{position:absolute;background:#ffffffd1;box-shadow:0 0 3px #0009}#reticle .rt-up,#reticle .rt-down{width:2px;height:8px;left:-1px}#reticle .rt-up{top:-16px}#reticle .rt-down{top:9px}#reticle .rt-left,#reticle .rt-right{height:2px;width:8px;top:-1px}#reticle .rt-left{left:-16px}#reticle .rt-right{left:9px}#hitmark{position:absolute;left:0;top:0;opacity:0}#hitmark i{position:absolute;width:11px;height:2.4px;background:#ff3b30;border-radius:1px;box-shadow:0 0 5px #ff3b30;transform-origin:0 50%}#hitmark i:nth-child(1){transform:rotate(45deg) translate(5px)}#hitmark i:nth-child(2){transform:rotate(135deg) translate(5px)}#hitmark i:nth-child(3){transform:rotate(225deg) translate(5px)}#hitmark i:nth-child(4){transform:rotate(315deg) translate(5px)}#hitmark.hit{animation:hitmk .26s ease-out}#hitmark.kill i{background:#f5a800;box-shadow:0 0 7px #f5a800}@keyframes hitmk{0%{opacity:1;transform:scale(1.5)}to{opacity:0;transform:scale(.8)}}.hidden{display:none!important}#hud{position:absolute;inset:0;pointer-events:none;font-family:var(--mono)}#hud-tl{position:absolute;top:18px;left:22px;display:flex;flex-direction:column;gap:8px}#hpWrap{width:clamp(130px,18%,230px);height:26px;border:3px solid var(--ink);background:var(--bg);position:relative}#hpBar{height:100%;width:100%;background:var(--ink);transition:width .12s steps(8)}#hpBar.low{background:var(--red)}#armorBar{position:absolute;left:0;top:-9px;height:6px;width:0%;background:#a855f7;border:2px solid var(--ink);border-bottom:0;transition:width .12s steps(8)}#hpNum{position:absolute;right:-46px;top:-2px;font-size:20px;font-weight:700}#buffRow{display:flex;gap:6px;margin-top:6px}.buff{position:relative;width:30px;height:30px;border:2.5px solid;background:var(--bg);display:flex;align-items:center;justify-content:center;font-size:15px;font-weight:800;font-family:var(--mono)}.buff .bt{position:absolute;bottom:-1px;right:1px;font-size:9px;line-height:1;background:var(--bg);padding:0 1px}.buff.fade{animation:buffFade .5s steps(3) infinite}@keyframes buffFade{50%{opacity:.35}}#cashWrap{font-size:20px;font-weight:700;color:var(--gold);text-shadow:0 1px 0 rgba(0,0,0,.08)}#hud-tc{position:absolute;top:14px;left:50%;transform:translate(-50%);text-align:center}#waveInfo{font-size:22px;font-weight:800;letter-spacing:2px}#waveInfo .shopwin{color:var(--gold)}#modeTimer{font-size:14px;color:var(--ink-soft);margin-top:2px}#killfeed{position:absolute;top:16px;right:22px;display:flex;flex-direction:column;gap:5px;align-items:flex-end}.kf{background:var(--ink);color:var(--bg);font-size:13px;padding:4px 10px;border-radius:2px;opacity:.92;animation:kfIn .18s steps(3) both}.kf .me{color:var(--gold)}.kf .hs{color:var(--red);font-weight:700}@keyframes kfIn{0%{transform:translate(30px);opacity:0}to{transform:none;opacity:.92}}#hud-bc{position:absolute;bottom:16px;left:50%;transform:translate(-50%);text-align:center}#gunName{font-size:15px;letter-spacing:4px;color:var(--ink-soft)}#ammoNum{font-size:44px;font-weight:800;line-height:1;letter-spacing:2px}#ammoNum.dry{color:var(--red);animation:blink .5s steps(2) infinite}@keyframes blink{50%{opacity:.25}}#gunSlots{display:flex;gap:6px;justify-content:center;margin-top:6px}.slot{width:34px;height:22px;border:2px solid var(--mid);display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--mid);background:var(--bg)}.slot.own{border-color:var(--ink);color:var(--ink)}.slot.cur{background:var(--ink);color:var(--bg);border-color:var(--ink)}#shopHint{margin-top:6px;font-size:11px;color:var(--mid);letter-spacing:1px}#reloadRing{position:absolute;left:50%;top:58%;transform:translate(-50%);width:40px;height:40px}#reloadRing svg{width:100%;height:100%;transform:rotate(-90deg)}#reloadRing circle{fill:none;stroke:var(--faint);stroke-width:4}#reloadRing #reloadArc{stroke:var(--ink);stroke-dasharray:100.5}#streakCard{position:absolute;left:50%;top:30%;transform:translate(-50%,-50%);font-family:var(--mono);font-weight:900;font-size:64px;letter-spacing:6px;pointer-events:none;white-space:nowrap;animation:cardPunch .55s cubic-bezier(.2,2.4,.4,1) both}#streakCard.t1{color:var(--ink)}#streakCard.t2{color:var(--gold)}#streakCard.t3{color:var(--orange)}#streakCard.t4{color:var(--red);animation:cardPunch .55s cubic-bezier(.2,2.4,.4,1) both,rage .09s steps(2) infinite .4s}@keyframes cardPunch{0%{transform:translate(-50%,-50%) scale(3.2);opacity:0}45%{transform:translate(-50%,-50%) scale(.92);opacity:1}to{transform:translate(-50%,-50%) scale(1);opacity:1}}@keyframes rage{0%{margin-left:-3px}to{margin-left:3px}}#announce{position:absolute;left:50%;top:42%;transform:translate(-50%,-50%);font-family:var(--mono);font-weight:800;font-size:38px;letter-spacing:10px;color:var(--ink);pointer-events:none;white-space:nowrap;animation:cardPunch .5s cubic-bezier(.2,2.4,.4,1) both}.panel{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:var(--panel-bg);z-index:10;transition:background .25s}body{transition:background .25s}.panel-inner{max-width:980px;width:calc(100% - 64px);max-height:92vh;overflow-y:auto;padding:12px}h1#logo{font-family:var(--mono);font-size:72px;letter-spacing:14px;text-align:center;font-weight:900}h1#logo span{font-size:40px;letter-spacing:18px;color:var(--ink-soft)}#tagline{text-align:center;color:var(--ink-soft);margin:6px 0 26px;letter-spacing:3px}.btn{font-family:var(--sans);font-size:15px;font-weight:700;letter-spacing:2px;border:3px solid var(--ink);background:var(--bg);color:var(--ink);padding:9px 18px;cursor:pointer;transition:transform .08s,box-shadow .08s}.btn:hover{transform:translate(-1px,-2px);box-shadow:3px 4px 0 var(--ink)}.btn:active{transform:translate(0);box-shadow:1px 1px 0 var(--ink)}.btn.primary{background:var(--ink);color:var(--bg)}.btn.primary:hover{box-shadow:3px 4px 0 var(--mid)}.menu-inner{padding:24px}#nameRow{display:flex;align-items:center;gap:12px;justify-content:center;margin-bottom:22px}#nameRow label{letter-spacing:4px;color:var(--ink-soft)}#charRow{display:flex;align-items:center;gap:12px;justify-content:center;margin-bottom:6px;flex-wrap:wrap}#charRow label{letter-spacing:4px;color:var(--ink-soft)}#charPick{display:flex;gap:7px;flex-wrap:wrap;justify-content:center}.char-btn{font-family:var(--sans);font-size:14px;font-weight:700;letter-spacing:1px;padding:7px 13px;border:2px solid var(--mid);background:var(--bg);color:var(--ink-soft);cursor:pointer;transition:transform .08s;display:flex;flex-direction:column;align-items:center;gap:1px;line-height:1.2}.char-btn small{font-size:9px;letter-spacing:1px;color:var(--mid)}.char-btn:hover{transform:translateY(-2px)}.char-btn.active{border-color:var(--ink);color:var(--ink);box-shadow:2px 3px 0 var(--faint)}.char-btn.active small{color:var(--ink-soft)}#charDesc{text-align:center;font-size:12px;color:var(--ink-soft);letter-spacing:1px;margin-bottom:16px;min-height:16px}#nameRow input,.joinrow input,.mc-opts select{font-family:var(--mono);font-size:17px;padding:7px 12px;border:3px solid var(--ink);background:var(--bg);color:var(--ink);width:180px;text-align:center}#perspTabs{display:flex;gap:12px;justify-content:center;margin-bottom:18px}.persp-tab{display:flex;flex-direction:column;align-items:center;gap:2px;font-family:var(--sans);padding:9px 30px;cursor:pointer;border:3px solid var(--mid);background:var(--bg);color:var(--ink-soft);transition:transform .08s,box-shadow .08s,border-color .12s,color .12s}.persp-tab b{font-size:17px;letter-spacing:4px}.persp-tab span{font-size:11px;letter-spacing:2px}.persp-tab:hover{transform:translateY(-2px)}.persp-tab.active{border-color:var(--ink);color:var(--ink);box-shadow:3px 4px 0 var(--faint)}#modeCards{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;padding:6px}.mc-desc{font-size:13px;color:var(--ink-soft);line-height:1.7;min-height:44px}#camRow,#styleRow{display:flex;align-items:center;gap:14px;justify-content:center;margin:14px 0 2px}#camRow label,#styleRow label{letter-spacing:4px;color:var(--ink-soft)}#camPick,#stylePick{display:flex;gap:8px}.cam-btn{font-family:var(--sans);font-size:13px;letter-spacing:2px;padding:7px 14px;border:2px solid var(--mid);background:var(--bg);color:var(--ink-soft);cursor:pointer;transition:transform .08s}.cam-btn:hover{transform:translateY(-2px)}.cam-btn.active{border-color:var(--ink);color:var(--ink);font-weight:700;box-shadow:2px 3px 0 var(--faint)}.mode-card{border:3px solid var(--ink);padding:18px 16px 20px;background:var(--bg);display:flex;flex-direction:column;gap:10px;align-items:center;text-align:center;transition:transform .1s,box-shadow .1s}.mode-card:hover{transform:translate(-2px,-3px);box-shadow:5px 6px 0 var(--faint),5px 6px 0 1px var(--mid)}.mode-card h3{letter-spacing:6px;font-size:20px}.mode-card p{font-size:13px;color:var(--ink-soft);line-height:1.7}.mc-icon{width:84px;height:64px}.mc-opts{display:flex;flex-direction:column;gap:8px;width:100%;align-items:center}.mc-opts select{width:160px;cursor:pointer}.joinrow{display:flex;gap:6px;justify-content:center}.joinrow input{width:86px;text-transform:uppercase;letter-spacing:4px}#mapRow,#killRow{display:flex;align-items:center;gap:14px;justify-content:center;margin-top:22px;flex-wrap:wrap}#killRow{margin-top:16px}#killRow label,#mapRow label{letter-spacing:4px;color:var(--ink-soft)}#killPick{display:flex;gap:8px}.kill-btn{font-family:var(--sans);font-size:13px;letter-spacing:2px;padding:7px 13px;border:2px solid var(--mid);background:var(--bg);color:var(--ink-soft);cursor:pointer;transition:transform .08s}.kill-btn:hover{transform:translateY(-2px)}.kill-btn.active{border-color:var(--ink);color:var(--ink);font-weight:700;box-shadow:2px 3px 0 var(--faint)}#killNote,#mapNote{width:100%;text-align:center;font-size:11px;color:var(--mid);letter-spacing:1px}#mapRow label{letter-spacing:4px;color:var(--ink-soft)}#mapPick{display:flex;gap:8px;padding:4px}.map-btn{font-family:var(--sans);font-size:13px;letter-spacing:2px;padding:7px 14px;border:2px solid var(--mid);background:var(--bg);color:var(--ink-soft);cursor:pointer;transition:transform .08s}.map-btn:hover{transform:translateY(-2px)}.map-btn.active{border-color:var(--ink);color:var(--ink);font-weight:700;box-shadow:2px 3px 0 var(--faint)}#ctrlHint{text-align:center;color:var(--mid);font-size:12px;margin-top:24px;letter-spacing:1px}#netStatus{text-align:center;color:var(--red);margin-top:14px;font-weight:700}#shop{background:#53535373}#shop .panel-inner{background:var(--bg);border:4px solid var(--ink);box-shadow:8px 10px #53535359;padding:22px 26px 26px}#shopHead{display:flex;align-items:baseline;gap:18px;margin-bottom:16px}#shopHead h2{letter-spacing:8px;font-size:26px}#shopCash{font-family:var(--mono);font-size:22px;font-weight:800;color:var(--gold)}#shopTimer{margin-left:auto;font-family:var(--mono);font-size:20px;color:var(--ink-soft)}#shopGrid{display:grid;grid-template-columns:repeat(5,1fr);gap:12px;padding:6px}.gun-card{border:3px solid var(--ink);padding:12px 10px;background:var(--bg);display:flex;flex-direction:column;align-items:center;gap:6px;cursor:pointer;position:relative;transition:transform .09s,box-shadow .09s}.gun-card:hover{transform:translate(-1px,-3px) scale(1.02);box-shadow:4px 5px 0 var(--faint),4px 5px 0 1px var(--mid);z-index:2}.gun-card canvas{width:96px;height:40px}.gun-card .gname{font-weight:800;letter-spacing:3px;font-size:15px}.gun-card .gdesc{font-size:11px;color:var(--ink-soft);text-align:center;line-height:1.5;min-height:33px}.gun-card .gprice{font-family:var(--mono);font-weight:800;color:var(--gold);font-size:16px}.gun-card .gstats{display:flex;gap:3px;align-items:flex-end;height:18px}.gun-card .gstats i{width:7px;background:var(--mid);display:block}.gun-card.owned{border-color:var(--mid)}.gun-card.owned .gprice{color:var(--green)}.gun-card.cur{outline:3px solid var(--gold);outline-offset:2px}.gun-card.poor{opacity:.45;cursor:not-allowed}.gun-card.poor:hover{transform:none;box-shadow:none}.gun-card .stamp{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:900;letter-spacing:6px;color:var(--red);border:4px solid var(--red);margin:14px;transform:rotate(-12deg) scale(2.2);opacity:0;pointer-events:none}.gun-card .stamp.show{animation:stampIn .28s cubic-bezier(.2,2,.4,1) both}@keyframes stampIn{to{transform:rotate(-12deg) scale(1);opacity:.92}}#shopFoot{display:flex;gap:12px;justify-content:center;margin-top:18px}#settingsBtn{position:absolute;top:18px;right:22px;z-index:11;width:46px;height:46px;font-size:22px;line-height:1;border:3px solid var(--ink);background:var(--bg);color:var(--ink);cursor:pointer;transition:transform .2s}#settingsBtn:hover{transform:rotate(40deg)}.settings-inner{max-width:460px}.settings-inner h2{letter-spacing:8px;text-align:center;margin-bottom:22px}.vol-row{display:flex;align-items:center;gap:14px;margin:14px 0}.vol-row label{width:72px;letter-spacing:3px;color:var(--ink-soft);flex-shrink:0}.vol-row b{width:48px;font-family:var(--mono);text-align:right}.vol-row input[type=range]{flex:1;appearance:none;height:8px;background:var(--faint);border:2px solid var(--ink);cursor:pointer}.vol-row input[type=range]::-webkit-slider-thumb{appearance:none;width:18px;height:26px;background:var(--ink);border:0;cursor:grab}.vol-row input[type=range]:active::-webkit-slider-thumb{cursor:grabbing}.settings-note{text-align:center;color:var(--mid);font-size:12px;letter-spacing:1px;margin-top:4px}#pveBest{font-family:var(--mono);font-size:13px;font-weight:800;color:var(--gold);letter-spacing:1px}#goRecord{text-align:center;font-family:var(--mono);font-size:22px;font-weight:900;color:var(--gold);letter-spacing:4px;margin-top:10px;animation:cardPunch .5s cubic-bezier(.2,2.4,.4,1) both}#scoreboard{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);background:var(--bg);border:4px solid var(--ink);padding:18px 26px;z-index:9;font-family:var(--mono);box-shadow:8px 10px #53535340;min-width:420px}#scoreboard table{width:100%;border-collapse:collapse}#scoreboard th{text-align:left;font-size:12px;color:var(--ink-soft);letter-spacing:2px;padding-bottom:8px}#scoreboard td{padding:5px 14px 5px 0;font-size:16px;font-weight:700}#scoreboard tr.me td{color:var(--blue)}#lobbyPlayers{display:flex;flex-direction:column;gap:8px;margin:18px 0}.lp{font-family:var(--mono);font-size:18px;font-weight:700;padding:10px 16px;border:3px solid var(--ink);display:flex;justify-content:space-between}.lp .tag{color:var(--ink-soft);font-size:13px}#roomCode{font-family:var(--mono);letter-spacing:10px;color:var(--blue)}.lobby-sub{color:var(--ink-soft);margin-top:4px}.lobby-foot{display:flex;gap:12px;margin-top:20px;justify-content:center}#lobby h2,#gameover h2{letter-spacing:6px;text-align:center}#goStats{font-family:var(--mono);margin:18px auto;max-width:460px}#goStats .row{display:flex;justify-content:space-between;font-size:17px;font-weight:700;padding:6px 0;border-bottom:2px solid var(--faint)}#goStats .row .v,#goTitle.win{color:var(--gold)}#goTitle.lose{color:var(--ink-soft)}#flash{position:absolute;inset:0;pointer-events:none;opacity:0;z-index:8}#flash.white{background:#fff;animation:flashOut .14s steps(2) both}#flash.red{background:var(--red);animation:flashOut .18s steps(3) both}@keyframes flashOut{0%{opacity:.55}to{opacity:0}}#vignette{position:absolute;inset:0;pointer-events:none;opacity:0;z-index:7;background:radial-gradient(ellipse at center,transparent 52%,rgba(255,59,48,.38) 100%);transition:opacity .3s}#vignette.on{opacity:1;animation:pulse 1.1s ease-in-out infinite}@keyframes pulse{50%{opacity:.55}}#touchUI{position:fixed;inset:0;pointer-events:none;z-index:6}#stage{touch-action:none}#stickBase,#aimBase{position:absolute;width:118px;height:118px;border:3px solid var(--ink);border-radius:50%;opacity:.32;transform:translate(-50%,-50%);display:none}#stickKnob,#aimKnob{position:absolute;left:50%;top:50%;width:48px;height:48px;border-radius:50%;background:var(--ink);transform:translate(-50%,-50%)}.tbtn{position:absolute;pointer-events:auto;width:76px;height:76px;border-radius:50%;border:3px solid var(--ink);background:var(--panel-bg);color:var(--ink);font-size:21px;font-weight:800;font-family:var(--sans);opacity:.82;-webkit-user-select:none;user-select:none;touch-action:manipulation}.tbtn:active{background:var(--ink);color:var(--bg)}#tJump{right:24px;bottom:28px}#tReload{right:116px;bottom:34px;width:56px;height:56px;font-size:16px}#tShop{right:32px;bottom:116px;width:56px;height:56px;font-size:16px}#tFire{right:24px;bottom:28px;width:88px;height:88px;font-size:24px;display:none;background:var(--accent, #ff3b30);border-color:var(--ink)}#touchUI.mode3d #tFire{display:block;pointer-events:auto}#touchUI.mode3d #tJump{right:132px;bottom:120px;width:60px;height:60px;font-size:17px}#rotateMask{position:fixed;inset:0;background:var(--bg);z-index:99;display:flex;align-items:center;justify-content:center;font-size:19px;letter-spacing:5px;font-weight:700;color:var(--ink)}@media(max-width:900px){#modeCards{grid-template-columns:1fr}#shopGrid{grid-template-columns:repeat(3,1fr)}h1#logo{font-size:44px;letter-spacing:8px}}@media(max-width:700px),(max-height:480px){#ammoNum{font-size:30px}#hpWrap{height:20px}#hpNum{font-size:15px;top:0}#waveInfo{font-size:16px}#modeTimer{font-size:11px}.kf{font-size:11px;padding:3px 7px}#streakCard{font-size:40px}#announce{font-size:24px;letter-spacing:6px}#shopHint,#gunName{font-size:11px}#shopGrid{grid-template-columns:repeat(2,1fr)}}
