演示地址:https://lua.hk

截图

image.png

源码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>一如既往 - PLAYER STATUS</title>
    <link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=VT323&display=swap" rel="stylesheet">
    <style>
        :root {
            --bg-deep: #0a0a12;
            --bg-panel: #111827;
            --border-light: #5c7a9a;
            --border-highlight: #a0c4e8;
            --border-shadow: #1a2a3a;
            --text-primary: #e8e8f0;
            --text-secondary: #b0c4d8;
            --text-dim: #6a7a8a;
            --neon-pink: #ff6b9d;
            --neon-cyan: #00e5ff;
            --neon-green: #39ff14;
            --neon-gold: #ffd740;
            --neon-purple: #b388ff;
            --hp-green: #4cff4c;
            --hp-yellow: #ffe040;
            --hp-red: #ff4444;
            --mp-blue: #4488ff;
            --mp-purple: #aa66ff;
            --exp-gold: #ffaa00;
            --window-bg: #1a1e2e;
            --crt-flicker: rgba(255, 255, 255, 0.015);
        }
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            background: var(--bg-deep);
            background-image:
                radial-gradient(ellipse at center, rgba(40, 20, 60, 0.6) 0%, transparent 70%),
                radial-gradient(circle at 20% 30%, rgba(80, 30, 100, 0.25) 0%, transparent 50%),
                radial-gradient(circle at 75% 60%, rgba(20, 50, 90, 0.3) 0%, transparent 50%),
                radial-gradient(circle at 50% 80%, rgba(60, 10, 80, 0.2) 0%, transparent 40%);
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'VT323', 'Courier New', monospace;
            padding: 20px;
            cursor: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16'><rect x='2' y='2' width='4' height='4' fill='white'/><rect x='6' y='6' width='4' height='4' fill='white'/><rect x='10' y='10' width='4' height='4' fill='white'/></svg>") 8 8, auto;
            position: relative;
            overflow-x: hidden;
            transition: filter 0.3s ease;
        }
        body.modal-open {
            overflow: hidden;
        }
        body.modal-open .main-container {
            filter: blur(2px) brightness(0.7);
            pointer-events: none;
            transition: filter 0.35s ease, brightness 0.35s ease;
        }
        body::before {
            content: '';
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 9999;
            background: repeating-linear-gradient(0deg, transparent, transparent 2px, rgba(0, 0, 0, 0.06) 2px, rgba(0, 0, 0, 0.06) 4px);
            animation: scanlineMove 0.1s linear infinite;
        }
        @keyframes scanlineMove {
            0% { background-position: 0 0; }
            100% { background-position: 0 4px; }
        }
        body::after {
            content: '';
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 9998;
            background: radial-gradient(ellipse at center, transparent 55%, rgba(0, 0, 0, 0.55) 100%);
            box-shadow: inset 0 0 150px rgba(0, 0, 0, 0.5);
        }
        .particles-container {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            pointer-events: none;
            z-index: 1;
        }
        .particle {
            position: absolute;
            width: 4px;
            height: 4px;
            background: var(--neon-cyan);
            animation: floatUp 6s ease-in infinite;
            opacity: 0;
            box-shadow: 0 0 6px var(--neon-cyan), 0 0 12px var(--neon-cyan);
        }
        .particle:nth-child(odd) {
            background: var(--neon-pink);
            box-shadow: 0 0 6px var(--neon-pink), 0 0 12px var(--neon-pink);
        }
        .particle:nth-child(3n) {
            background: var(--neon-gold);
            box-shadow: 0 0 6px var(--neon-gold), 0 0 12px var(--neon-gold);
            width: 3px;
            height: 3px;
        }
        .particle:nth-child(5n+2) {
            background: var(--neon-purple);
            box-shadow: 0 0 6px var(--neon-purple), 0 0 12px var(--neon-purple);
            width: 5px;
            height: 5px;
        }
        @keyframes floatUp {
            0% { transform: translateY(0) translateX(0) scale(0); opacity: 0; }
            10% { opacity: 1; transform: translateY(-20px) translateX(5px) scale(1); }
            30% { transform: translateY(-80px) translateX(-15px) scale(1.5); opacity: 0.9; }
            60% { transform: translateY(-180px) translateX(20px) scale(0.8); opacity: 0.5; }
            100% { transform: translateY(-350px) translateX(-30px) scale(0); opacity: 0; }
        }
        .particle:nth-child(1) { left: 10%; animation-delay: 0s; animation-duration: 7s; }
        .particle:nth-child(2) { left: 25%; animation-delay: 1.5s; animation-duration: 5.5s; }
        .particle:nth-child(3) { left: 40%; animation-delay: 3s; animation-duration: 6.5s; }
        .particle:nth-child(4) { left: 55%; animation-delay: 0.8s; animation-duration: 8s; }
        .particle:nth-child(5) { left: 70%; animation-delay: 2.2s; animation-duration: 5s; }
        .particle:nth-child(6) { left: 85%; animation-delay: 4s; animation-duration: 7.5s; }
        .particle:nth-child(7) { left: 15%; animation-delay: 3.5s; animation-duration: 6s; }
        .particle:nth-child(8) { left: 60%; animation-delay: 1s; animation-duration: 5.8s; }
        .particle:nth-child(9) { left: 78%; animation-delay: 2.8s; animation-duration: 6.8s; }
        .particle:nth-child(10) { left: 32%; animation-delay: 4.5s; animation-duration: 7.2s; }
        .main-container {
            position: relative;
            z-index: 10;
            width: 100%;
            max-width: 820px;
            display: flex;
            flex-direction: column;
            gap: 16px;
            transition: filter 0.35s ease, opacity 0.35s ease;
        }
        .pixel-panel {
            background: var(--window-bg);
            border: 3px solid var(--border-light);
            outline: 2px solid var(--border-shadow);
            outline-offset: -6px;
            box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.05), 0 0 0 4px var(--border-shadow), 0 0 0 6px rgba(0, 0, 0, 0.5), 0 8px 32px rgba(0, 0, 0, 0.6), 0 0 60px rgba(100, 60, 180, 0.15);
            position: relative;
            padding: 20px 24px;
            image-rendering: pixelated;
        }
        .pixel-panel::before {
            content: '◆';
            position: absolute;
            top: -10px;
            left: -10px;
            font-size: 16px;
            color: var(--neon-gold);
            text-shadow: 0 0 8px var(--neon-gold), 0 0 16px var(--neon-gold);
            animation: cornerGlow 2s ease-in-out infinite;
            z-index: 5;
        }
        .pixel-panel::after {
            content: '◆';
            position: absolute;
            bottom: -10px;
            right: -10px;
            font-size: 16px;
            color: var(--neon-cyan);
            text-shadow: 0 0 8px var(--neon-cyan), 0 0 16px var(--neon-cyan);
            animation: cornerGlow 2s ease-in-out 1s infinite;
            z-index: 5;
        }
        @keyframes cornerGlow {
            0%, 100% { opacity: 0.6; transform: scale(1); }
            50% { opacity: 1; transform: scale(1.3); }
        }
        .title-bar {
            display: flex;
            align-items: center;
            justify-content: space-between;
            background: #0d0f1a;
            border: 3px solid var(--border-light);
            outline: 2px solid var(--border-shadow);
            outline-offset: -6px;
            box-shadow: 0 0 0 4px var(--border-shadow), 0 0 0 6px rgba(0, 0, 0, 0.5), 0 4px 20px rgba(0, 0, 0, 0.5);
            padding: 14px 20px;
            position: relative;
        }
        .title-bar::before {
            content: '📁';
            position: absolute;
            left: -8px;
            top: -14px;
            font-size: 18px;
            animation: bounceIcon 3s ease-in-out infinite;
        }
        @keyframes bounceIcon {
            0%, 100% { transform: translateY(0); }
            30% { transform: translateY(-6px); }
            50% { transform: translateY(0); }
            70% { transform: translateY(-3px); }
        }
        .title-text {
            font-family: 'Press Start 2P', 'Courier New', monospace;
            font-size: 13px;
            color: var(--text-primary);
            letter-spacing: 2px;
            text-shadow: 0 0 10px rgba(255, 255, 255, 0.4), 0 0 25px rgba(180, 140, 255, 0.5);
            animation: titleFlicker 5s ease-in-out infinite;
            display: flex;
            align-items: center;
            gap: 8px;
        }
        @keyframes titleFlicker {
            0%, 100% { opacity: 1; }
            92% { opacity: 1; }
            93% { opacity: 0.7; }
            94% { opacity: 1; }
            96% { opacity: 0.8; }
            97% { opacity: 1; }
        }
        .title-blip {
            display: inline-block;
            width: 10px;
            height: 10px;
            background: var(--neon-green);
            animation: blipBlink 1s step-end infinite;
            box-shadow: 0 0 8px var(--neon-green);
        }
        @keyframes blipBlink {
            0%, 100% { opacity: 1; }
            50% { opacity: 0.15; }
        }
        .title-lv {
            font-family: 'Press Start 2P', monospace;
            font-size: 10px;
            color: var(--neon-gold);
            background: rgba(0, 0, 0, 0.5);
            padding: 6px 10px;
            border: 2px solid var(--neon-gold);
            text-shadow: 0 0 8px var(--neon-gold);
            letter-spacing: 1px;
        }
        .content-grid {
            display: grid;
            grid-template-columns: 280px 1fr;
            gap: 16px;
        }
        .character-panel {
            display: flex;
            flex-direction: column;
            align-items: center;
            gap: 16px;
        }
        .avatar-frame {
            width: 140px;
            height: 140px;
            border: 4px solid var(--border-highlight);
            outline: 3px solid var(--border-shadow);
            outline-offset: -8px;
            box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.3), 0 0 0 5px var(--border-shadow), 0 0 0 7px rgba(0, 0, 0, 0.4), 0 0 30px rgba(180, 130, 255, 0.35);
            background: #1a1a2e;
            display: flex;
            align-items: center;
            justify-content: center;
            position: relative;
            overflow: hidden;
            image-rendering: pixelated;
        }
        .pixel-avatar {
            display: grid;
            grid-template-columns: repeat(8, 14px);
            grid-template-rows: repeat(8, 14px);
            gap: 1px;
            image-rendering: pixelated;
            transform: scale(1.05);
        }
        .pixel-avatar .px { width: 14px; height: 14px; border-radius: 1px; }
        .px-skin { background: #f4c7a8; }
        .px-skin-dark { background: #e8b898; }
        .px-hair { background: #3a2a5c; }
        .px-hair-light { background: #5a4a7c; }
        .px-eye { background: #1a1a1a; }
        .px-eye-highlight { background: #ffffff; }
        .px-mouth { background: #d4887a; }
        .px-clothes { background: #c0392b; }
        .px-clothes-dark { background: #8b1a1a; }
        .px-accent { background: #f0c040; }
        .px-bg { background: transparent; }
        .avatar-label {
            font-family: 'Press Start 2P', monospace;
            font-size: 14px;
            color: var(--neon-cyan);
            text-shadow: 0 0 8px var(--neon-cyan);
            letter-spacing: 1px;
            text-align: center;
            animation: labelPulse 3s ease-in-out infinite;
        }
        @keyframes labelPulse {
            0%, 100% { opacity: 0.7; }
            50% { opacity: 1; text-shadow: 0 0 16px var(--neon-cyan), 0 0 30px var(--neon-cyan); }
        }
        .status-bars {
            width: 100%;
            display: flex;
            flex-direction: column;
            gap: 8px;
        }
        .status-row {
            display: flex;
            align-items: center;
            gap: 8px;
            font-family: 'Press Start 2P', monospace;
            font-size: 8px;
            color: var(--text-primary);
        }
        .status-label { width: 28px; text-align: right; letter-spacing: 0px; flex-shrink: 0; }
        .status-bar-outer {
            flex: 1;
            height: 14px;
            border: 2px solid #333;
            background: #0a0a0a;
            position: relative;
            overflow: hidden;
            box-shadow: inset 0 0 4px rgba(0, 0, 0, 0.8);
        }
        .status-bar-inner {
            height: 100%;
            width: 0%;
            transition: width 0.8s ease-out;
            position: relative;
        }
        .status-bar-inner.hp {
            background: linear-gradient(180deg, #5cff5c 0%, #2a8a2a 100%);
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 10px rgba(76, 255, 76, 0.4);
        }
        .status-bar-inner.mp {
            background: linear-gradient(180deg, #66aaff 0%, #2244aa 100%);
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 10px rgba(68, 136, 255, 0.4);
        }
        .status-bar-inner.exp {
            background: linear-gradient(180deg, #ffcc44 0%, #aa7700 100%);
            box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 0 10px rgba(255, 170, 0, 0.4);
        }
        .status-value {
            font-size: 7px;
            min-width: 42px;
            text-align: left;
            flex-shrink: 0;
            color: var(--text-secondary);
        }
        .status-bar-inner::after {
            content: '';
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 50%;
            background: rgba(255, 255, 255, 0.15);
            pointer-events: none;
        }
        .stats-table {
            width: 100%;
            font-family: 'Press Start 2P', monospace;
            font-size: 14px;
            color: var(--text-secondary);
            border-collapse: collapse;
        }
        .stats-table tr { border-bottom: 1px dotted rgba(255, 255, 255, 0.1); }
        .stats-table td { padding: 5px 4px; letter-spacing: 0.5px; }
        .stats-table .stat-name { color: var(--neon-gold); text-shadow: 0 0 4px rgba(255, 215, 64, 0.4); white-space: nowrap; }
        .stats-table .stat-val { text-align: right; color: var(--text-primary); font-size: 9px; }
        .main-panel { display: flex; flex-direction: column; gap: 16px; }
        .dialog-box {
            position: relative;
            padding: 16px 20px;
            background: #151929;
            border: 2px solid #4a5568;
            box-shadow: inset 0 0 0 3px rgba(0, 0, 0, 0.25), 0 0 0 1px #2d3748;
        }
        .dialog-box .dialog-arrow {
            position: absolute;
            bottom: -12px;
            left: 50%;
            transform: translateX(-50%);
            width: 0;
            height: 0;
            border-left: 10px solid transparent;
            border-right: 10px solid transparent;
            border-top: 12px solid #4a5568;
            animation: arrowBounce 1.5s ease-in-out infinite;
        }
        @keyframes arrowBounce {
            0%, 100% { bottom: -12px; opacity: 0.7; }
            50% { bottom: -18px; opacity: 1; }
        }
        .dialog-text {
            font-family: 'VT323', 'Courier New', monospace;
            font-size: 18px;
            color: #d0d8e8;
            line-height: 1.5;
            letter-spacing: 0.5px;
        }
        .dialog-text .highlight { color: var(--neon-gold); text-shadow: 0 0 6px rgba(255, 215, 64, 0.5); font-weight: bold; }
        .dialog-text .highlight2 { color: var(--neon-pink); text-shadow: 0 0 6px rgba(255, 107, 157, 0.5); }
        .skills-section { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
        .skill-card {
            background: #131725;
            border: 2px solid #3a4055;
            padding: 12px 14px;
            transition: all 0.2s ease;
            cursor: pointer;
            position: relative;
            overflow: hidden;
        }
        .skill-card:hover {
            border-color: var(--neon-cyan);
            box-shadow: 0 0 20px rgba(0, 229, 255, 0.2), inset 0 0 20px rgba(0, 229, 255, 0.05);
            transform: translateY(-2px);
        }
        .skill-card:active { transform: scale(0.96); transition: transform 0.05s ease; }
        .skill-card .skill-icon { font-size: 22px; margin-bottom: 4px; display: block; }
        .skill-card .skill-name { font-family: 'Press Start 2P', monospace;  color: var(--neon-cyan); letter-spacing: 1px; text-shadow: 0 0 6px rgba(0, 229, 255, 0.4); }
        .skill-card .skill-desc { font-family: 'VT323', monospace; font-size: 14px; color: #8899aa; margin-top: 4px; letter-spacing: 0.3px; }
        .skill-card .skill-lv { position: absolute; top: 8px; right: 10px; font-family: 'Press Start 2P', monospace; font-size: 7px; color: var(--neon-gold); background: rgba(0, 0, 0, 0.5); padding: 2px 6px; border: 1px solid rgba(255, 215, 64, 0.4); }
        .menu-bar { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
        .menu-item {
            font-family: 'Press Start 2P', monospace;
            font-size: 9px;
            padding: 10px 16px;
            background: #111520;
            border: 2px solid #3a4055;
            color: #b0c0d0;
            cursor: pointer;
            letter-spacing: 1px;
            transition: all 0.15s ease;
            text-decoration: none;
            display: flex;
            align-items: center;
            gap: 6px;
            position: relative;
            user-select: none;
        }
        .menu-item:hover {
            border-color: var(--neon-pink);
            color: #ffffff;
            box-shadow: 0 0 16px rgba(255, 107, 157, 0.35), inset 0 0 12px rgba(255, 107, 157, 0.08);
            text-shadow: 0 0 8px rgba(255, 255, 255, 0.6);
        }
        .menu-item:active { background: #1a1025; transform: scale(0.94); transition: transform 0.04s ease; }
        .menu-item .menu-cursor { display: inline-block; animation: cursorBlink 0.9s step-end infinite; color: var(--neon-pink); font-size: 12px; }
        @keyframes cursorBlink {
            0%, 100% { opacity: 1; }
            50% { opacity: 0; }
        }
        .menu-item .menu-dot { width: 6px; height: 6px; background: var(--neon-green); box-shadow: 0 0 6px var(--neon-green); animation: dotPulse 1.5s ease-in-out infinite; }
        @keyframes dotPulse {
            0%, 100% { opacity: 0.5; transform: scale(1); }
            50% { opacity: 1; transform: scale(1.6); }
        }
        .status-footer {
            display: flex;
            align-items: center;
            justify-content: space-between;
            font-family: 'Press Start 2P', monospace;
            font-size: 8px;
            color: #667788;
            padding: 8px 4px;
            letter-spacing: 0.5px;
        }
        .status-footer .footer-dot { display: inline-block; width: 6px; height: 6px; background: var(--neon-green); margin-right: 4px; box-shadow: 0 0 5px var(--neon-green); animation: dotPulse 2s ease-in-out infinite; }
        .modal-overlay {
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            z-index: 100000;
            background: rgba(0, 0, 0, 0.75);
            display: flex;
            align-items: center;
            justify-content: center;
            opacity: 0;
            visibility: hidden;
            pointer-events: none;
            transition: opacity 0.35s ease, visibility 0.35s ease;
            background-image: radial-gradient(circle, transparent 60%, rgba(0, 0, 0, 0.85) 100%), repeating-linear-gradient(0deg, transparent, transparent 3px, rgba(255,255,255,0.008) 3px, rgba(255,255,255,0.008) 6px);
        }
        .modal-overlay.active { opacity: 1; visibility: visible; pointer-events: auto; }
        .modal-window {
            position: relative;
            background: var(--window-bg);
            border: 4px solid var(--border-light);
            outline: 3px solid var(--border-shadow);
            outline-offset: -8px;
            box-shadow: inset 0 0 0 3px rgba(255,255,255,0.04), 0 0 0 6px var(--border-shadow), 0 0 0 9px rgba(0,0,0,0.5), 0 0 60px rgba(100,60,180,0.35), 0 0 120px rgba(255,107,157,0.2), 0 20px 60px rgba(0,0,0,0.7);
            width: 90%;
            max-width: 560px;
            max-height: 85vh;
            overflow-y: auto;
            padding: 0;
            transform: scale(0.85);
            transition: transform 0.35s cubic-bezier(0.175, 0.885, 0.32, 1.275);
            image-rendering: pixelated;
            clip-path: polygon(0px 12px, 4px 12px, 4px 4px, 12px 4px, 12px 0px, calc(100% - 12px) 0px, calc(100% - 12px) 4px, calc(100% - 4px) 4px, calc(100% - 4px) 12px, 100% 12px, 100% calc(100% - 12px), calc(100% - 4px) calc(100% - 12px), calc(100% - 4px) calc(100% - 4px), calc(100% - 12px) calc(100% - 4px), calc(100% - 12px) 100%, 12px 100%, 12px calc(100% - 4px), 4px calc(100% - 4px), 4px calc(100% - 12px), 0px calc(100% - 12px));
        }
        .modal-overlay.active .modal-window { transform: scale(1); }
        .modal-title-bar { display: flex; align-items: center; justify-content: space-between; background: #0d0f1a; border-bottom: 3px solid var(--border-light); padding: 14px 18px; position: sticky; top: 0; z-index: 2; }
        .modal-title-bar .modal-title-text { font-family: 'Press Start 2P', monospace; font-size: 11px; color: var(--text-primary); letter-spacing: 2px; text-shadow: 0 0 10px rgba(255,255,255,0.4), 0 0 20px rgba(180,140,255,0.5); display: flex; align-items: center; gap: 8px; }
        .modal-title-bar .modal-title-icon { display: inline-block; width: 12px; height: 12px; background: var(--neon-pink); box-shadow: 0 0 10px var(--neon-pink), 0 0 20px var(--neon-pink); animation: blipBlink 1.2s step-end infinite; }
        .modal-close-btn { font-family: 'Press Start 2P', monospace; font-size: 14px; color: #ff6666; background: rgba(0,0,0,0.5); border: 2px solid #ff4444; padding: 6px 10px; cursor: pointer; letter-spacing: 0; line-height: 1; transition: all 0.15s ease; text-shadow: 0 0 8px #ff4444; box-shadow: 0 0 10px rgba(255,68,68,0.3); user-select: none; }
        .modal-close-btn:hover { background: #ff4444; color: #000; border-color: #fff; box-shadow: 0 0 25px rgba(255,68,68,0.7), 0 0 50px rgba(255,68,68,0.4); text-shadow: none; transform: scale(1.08); }
        .modal-content { padding: 20px 22px; display: flex; flex-direction: column; gap: 18px; }
        .modal-avatar-section { display: flex; align-items: center; gap: 18px; flex-wrap: wrap; }
        .modal-avatar-mini { width: 72px; height: 72px; border: 3px solid var(--border-highlight); outline: 2px solid var(--border-shadow); outline-offset: -6px; box-shadow: inset 0 0 0 2px rgba(0,0,0,0.3), 0 0 0 4px var(--border-shadow), 0 0 20px rgba(180,130,255,0.3); background: #1a1a2e; display: flex; align-items: center; justify-content: center; flex-shrink: 0; }
        .modal-avatar-mini .pixel-avatar { grid-template-columns: repeat(8,8px); grid-template-rows: repeat(8,8px); gap:0.5px; transform:scale(1);}
        .modal-avatar-mini .pixel-avatar .px { width:8px; height:8px;}
        .modal-player-name { font-family:'Press Start 2P'; font-size:12px; color:var(--text-primary); letter-spacing:1px; margin-bottom:4px;}
        .modal-player-title { font-family:'Press Start 2P'; font-size:13px; color:var(--neon-gold); margin-bottom:6px;}
        .modal-player-id { font-family:'VT323'; font-size:15px; color:#8899aa; }
        .modal-divider { width:100%; height:2px; background: repeating-linear-gradient(90deg, var(--border-light) 0px, var(--border-light) 8px, transparent 8px, transparent 14px); opacity:0.6; margin:2px 0;}
        .modal-bio { font-family:'VT323'; font-size:17px; color:#c8d0dc; line-height:1.6; background:rgba(0,0,0,0.25); padding:14px 16px; border-left:4px solid var(--neon-cyan); }
        .modal-bio .highlight { color:var(--neon-gold); text-shadow:0 0 6px rgba(255,215,64,0.4);}
        .modal-bio .highlight2 { color:var(--neon-pink); text-shadow:0 0 6px rgba(255,107,157,0.4);}
        .modal-bio .highlight3 { color:var(--neon-cyan); text-shadow:0 0 6px rgba(0,229,255,0.4);}
        .modal-tags { display:flex; flex-wrap:wrap; gap:8px;}
        .modal-tag { font-family:'Press Start 2P'; font-size:10px; padding:6px 10px; border:2px solid; letter-spacing:1px; transition:0.2s; cursor:default;}
        .modal-tag.tag-frontend { border-color:#00e5ff; color:#00e5ff; }
        .modal-tag.tag-design { border-color:#ff6b9d; color:#ff6b9d; }
        .modal-tag.tag-creative { border-color:#ffd740; color:#ffd740; }
        .modal-tag.tag-code { border-color:#39ff14; color:#39ff14; }
        .modal-tag.tag-pixel { border-color:#b388ff; color:#b388ff; }
        .modal-tag:hover { transform:translateY(-3px); box-shadow:0 0 20px currentColor;}
        .modal-contact-list { list-style:none; display:flex; flex-direction:column; gap:8px;}
        .modal-contact-list li { font-family:'VT323'; font-size:16px; color:#b0c0d0; display:flex; align-items:center; gap:10px; padding:8px 12px; background:rgba(0,0,0,0.2); border:1px solid rgba(255,255,255,0.08);}
        .modal-contact-list li:hover { border-color:var(--neon-cyan); background:rgba(0,229,255,0.04);}
        .modal-contact-list .contact-icon { font-size:18px; width:28px; text-align:center;}
        .modal-contact-list .contact-value { color:var(--text-primary); word-break:break-all;}
        .modal-contact-list a { color:var(--neon-cyan); text-decoration:none; }
        .modal-contact-list a:hover { color:#fff; text-shadow:0 0 12px var(--neon-cyan);}
        .modal-footer-hint { text-align:center; font-family:'Press Start 2P'; font-size:10px; color:#556677; }
        @media (max-width: 700px) {
            .content-grid { grid-template-columns: 1fr; }
            .character-panel { flex-direction: row; flex-wrap: wrap; justify-content: center; }
            .avatar-frame { width: 90px; height: 90px; }
            .pixel-avatar { grid-template-columns: repeat(8, 10px); grid-template-rows: repeat(8, 10px); }
            .pixel-avatar .px { width: 10px; height: 10px; }
            .skills-section { grid-template-columns: 1fr; }
            .modal-window { max-width: 94%; }
        }
    </style>
</head>
<body>
    <div class="particles-container">
        <div class="particle"></div><div class="particle"></div><div class="particle"></div><div class="particle"></div><div class="particle"></div>
        <div class="particle"></div><div class="particle"></div><div class="particle"></div><div class="particle"></div><div class="particle"></div>
    </div>
    <div class="modal-overlay" id="contactModal" aria-hidden="true">
        <div class="modal-window" role="dialog" aria-modal="true">
            <div class="modal-title-bar">
                <span class="modal-title-text"><span class="modal-title-icon"></span> PLAYER INFO</span>
                <button class="modal-close-btn" id="modalCloseBtn">✕</button>
            </div>
            <div class="modal-content">
                <div class="modal-avatar-section">
                    <div class="modal-avatar-mini">
                        <div class="pixel-avatar">
                            <span class="px px-bg"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-bg"></span>
                            <span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair-light"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair-light"></span><span class="px px-hair"></span><span class="px px-hair"></span>
                            <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin"></span><span class="px px-eye"></span><span class="px px-eye-highlight"></span><span class="px px-eye"></span><span class="px px-skin"></span><span class="px px-hair"></span>
                            <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-skin"></span><span class="px px-hair"></span>
                            <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-mouth"></span><span class="px px-skin"></span><span class="px px-mouth"></span><span class="px px-skin-dark"></span><span class="px px-hair"></span>
                            <span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-accent"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes"></span>
                            <span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span>
                            <span class="px px-bg"></span><span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-bg"></span>
                        </div>
                    </div>
                    <div class="modal-player-info">
                        <div class="modal-player-name">蝴蝶</div>
                        <div class="modal-player-title">⚔ 孤独的冒险者 / 大魔法师 ⚔</div>
                        <div class="modal-player-id" id="modalPlayerId">ID: Zardsay // Lv.<span id="modalLv">--</span></div>
                    </div>
                </div>
                <div class="modal-divider"></div>
                <div class="modal-bio">
                        「 我是<span class="highlight">蝴蝶</span>!<br>
                        一个<span class="highlight2">默默无闻</span>的人<br>
                        热爱探索一切的未知<br>
                        虽然现在的我很伤心<br>
                        但是我永远相信<span class="highlight">美好</span>的事情一直在发生。」
                </div>
                <div class="modal-tags">
                    <span class="modal-tag tag-frontend">😤 傲慢</span>
                    <span class="modal-tag tag-design">🍋 嫉妒</span>
                    <span class="modal-tag tag-creative">😡 暴怒</span>
                    <span class="modal-tag tag-code">😫 懒惰</span>
                    <span class="modal-tag tag-pixel">🤑 贪婪</span>
                    <span class="modal-tag tag-design">🍟 暴食</span>
                    <span class="modal-tag tag-creative">😍 色欲</span>
                </div>
                <div class="modal-divider"></div>
                <ul class="modal-contact-list">
                    <li><span class="contact-icon">📧</span><span>邮箱:</span><span class="contact-value"><a href="mailto:yourname@example.com">zero@yiru.net</a></span></li>
                    <li><span class="contact-icon">🌐</span><span>网站:</span><span class="contact-value"><a href="https://yiru.net">yiru.net</a></span></li>
                </ul>
                <div class="modal-footer-hint"><span class="key-icon">ESC</span> 关闭窗口 | 点击外部区域也可关闭</div>
            </div>
        </div>
    </div>
    <div class="main-container">
        <div class="title-bar">
            <span class="title-text"><span class="title-blip"></span> PLAYER STATUS</span>
            <span class="title-lv" id="lvDisplay">Lv.--</span>
        </div>
        <div class="content-grid">
            <div class="character-panel">
                <div class="avatar-frame">
                    <div class="pixel-avatar">
                        <span class="px px-bg"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-bg"></span>
                        <span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair-light"></span><span class="px px-hair"></span><span class="px px-hair"></span><span class="px px-hair-light"></span><span class="px px-hair"></span><span class="px px-hair"></span>
                        <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin"></span><span class="px px-eye"></span><span class="px px-eye-highlight"></span><span class="px px-eye"></span><span class="px px-skin"></span><span class="px px-hair"></span>
                        <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-skin"></span><span class="px px-hair"></span>
                        <span class="px px-hair"></span><span class="px px-skin"></span><span class="px px-skin-dark"></span><span class="px px-mouth"></span><span class="px px-skin"></span><span class="px px-mouth"></span><span class="px px-skin-dark"></span><span class="px px-hair"></span>
                        <span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-accent"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes"></span>
                        <span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span><span class="px px-clothes-dark"></span><span class="px px-clothes"></span>
                        <span class="px px-bg"></span><span class="px px-bg"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-clothes"></span><span class="px px-bg"></span>
                    </div>
                </div>
                <span class="avatar-label">▼ 蝴蝶 ▼</span>
                <div class="status-bars">
                    <div class="status-row">
                        <span class="status-label" style="color:#4cff4c;">HP</span>
                        <div class="status-bar-outer"><div class="status-bar-inner hp" id="hpBar"></div></div>
                        <span class="status-value" id="hpValue">--/--</span>
                    </div>
                    <div class="status-row">
                        <span class="status-label" style="color:#66aaff;">MP</span>
                        <div class="status-bar-outer"><div class="status-bar-inner mp" id="mpBar"></div></div>
                        <span class="status-value" id="mpValue">--/--</span>
                    </div>
                    <div class="status-row">
                        <span class="status-label" style="color:#ffcc44;">EXP</span>
                        <div class="status-bar-outer"><div class="status-bar-inner exp" id="expBar"></div></div>
                        <span class="status-value" id="expValue">--%</span>
                    </div>
                </div>
                <table class="stats-table">
                    <tr><td class="stat-name">⚔️ 攻撃力</td><td class="stat-val">178</td></tr>
                    <tr><td class="stat-name">🛡️ 防御力</td><td class="stat-val">0</td></tr>
                    <tr><td class="stat-name">⚡ 敏捷</td><td class="stat-val">134</td></tr>
                    <tr><td class="stat-name">✨ 運</td><td class="stat-val">50%</td></tr>
                    <tr><td class="stat-name">🎯 命中</td><td class="stat-val">91%</td></tr>
                </table>
            </div>
            <div class="main-panel">
                <div class="pixel-panel dialog-box">
                    <p class="dialog-text">
                    <span class="highlight">多少事,</span><br>
                    <span class="highlight2">从来急;</span><br>
                    <span class="highlight3">天地转,</span><br>
                    <span class="highlight">光阴迫。</span><br>        
                    <span class="highlight2">一万年太久,只争朝夕。</span>
                    </p>
                    <div class="dialog-arrow"></div>
                </div>
                <div class="skills-section">
                    <div class="skill-card"><span class="skill-icon">🫕</span><span class="skill-name">大胃袋</span><span class="skill-lv">Lv.1</span><p class="skill-desc">唯有美食不可辜负</p></div>
                    <div class="skill-card"><span class="skill-icon">🍬</span><span class="skill-name">血糖</span><span class="skill-lv">Lv.5</span><p class="skill-desc">我应该能戒糖吧</p></div>
                    <div class="skill-card"><span class="skill-icon">🎮</span><span class="skill-name">游戏</span><span class="skill-lv">Lv.9</span><p class="skill-desc">其实我是打电动糕手</p></div>
                    <div class="skill-card"><span class="skill-icon">🔮</span><span class="skill-name">活着</span><span class="skill-lv">MAX</span><p class="skill-desc">+1+1+1+1+1+1+1</p></div>
                </div>
            </div>
        </div>
        <div class="pixel-panel menu-bar" style="padding:12px 16px;">
            <a href="#" class="menu-item" id="contactMenuBtn"><span class="menu-dot"></span> 关于我</a>
        </div>
        <div class="status-footer">
            <span><span class="footer-dot"></span> SYSTEM READY</span>
            <span>© 2024 一如既往</span>
            <span id="uptimeDisplay">⌛ 起動時間: --日</span>
        </div>
    </div>

    <script>
        // 立即执行动态数值初始化,避免静态占位符闪烁
        (function() {
            const MAX_HP = 400;
            const MAX_MP = 200;
            const BASE_LV = 31;
            const START_YEAR = 2026;

            function updateStats() {
                const now = new Date();
                const currentYear = now.getFullYear();
                
                // 等级:基础31,每过一整年+1
                const extraLv = Math.max(0, currentYear - START_YEAR);
                const lv = BASE_LV + extraLv;
                document.getElementById('lvDisplay').textContent = `Lv.${lv}`;
                const modalLvSpan = document.getElementById('modalLv');
                if (modalLvSpan) modalLvSpan.textContent = lv;

                // EXP:一年365天进度条
                const startOfYear = new Date(currentYear, 0, 1);
                const diffFromYearStart = now - startOfYear;
                const dayOfYear = Math.floor(diffFromYearStart / (1000 * 60 * 60 * 24)) + 1;
                const totalDays = 365;
                const expPercent = Math.min(100, Math.max(0, (dayOfYear / totalDays) * 100));
                document.getElementById('expBar').style.width = expPercent + '%';
                document.getElementById('expValue').textContent = Math.floor(expPercent) + '%';

                // HP:与吃饭时间相关 (早饭8:00, 午饭12:00, 晚饭18:00)
                const currentHour = now.getHours();
                const currentMinute = now.getMinutes();
                const currentTimeInHours = currentHour + currentMinute / 60;
                const mealTimes = [8, 12, 18];
                let minDiff = Infinity;
                mealTimes.forEach(meal => {
                    let diff = Math.abs(currentTimeInHours - meal);
                    if (currentTimeInHours < mealTimes[0]) {
                        const diffToYesterdayDinner = Math.abs(currentTimeInHours + 24 - 18);
                        if (diffToYesterdayDinner < diff) diff = diffToYesterdayDinner;
                    }
                    if (diff < minDiff) minDiff = diff;
                });
                const hpPercent = Math.max(20, 100 - Math.min(80, minDiff * 15));
                const currentHP = Math.round(MAX_HP * (hpPercent / 100));
                document.getElementById('hpBar').style.width = hpPercent + '%';
                document.getElementById('hpValue').textContent = `${currentHP}/${MAX_HP}`;

                // MP:与睡眠时间相关 (睡眠时段22:00-次日7:00,MP逐渐恢复)
                const sleepStartMinutes = 22 * 60;
                const sleepEndMinutes = 7 * 60;
                const currentMinutes = currentHour * 60 + currentMinute;
                let mpPercent;
                if (currentMinutes >= 420 && currentMinutes < 1320) {
                    const elapsedWake = currentMinutes - 420;
                    const totalWake = 900;
                    mpPercent = 100 - (elapsedWake / totalWake) * 80;
                } else {
                    let elapsedSleep;
                    if (currentMinutes >= 1320) {
                        elapsedSleep = currentMinutes - 1320;
                    } else {
                        elapsedSleep = currentMinutes + (24 * 60 - 1320);
                    }
                    const totalSleep = 540;
                    mpPercent = 20 + (elapsedSleep / totalSleep) * 80;
                }
                mpPercent = Math.min(100, Math.max(20, mpPercent));
                const currentMP = Math.round(MAX_MP * (mpPercent / 100));
                document.getElementById('mpBar').style.width = mpPercent + '%';
                document.getElementById('mpValue').textContent = `${currentMP}/${MAX_MP}`;

                // 启动时间
                const daysSinceEpoch = Math.floor(now / (1000 * 60 * 60 * 24));
                document.getElementById('uptimeDisplay').textContent = `⌛ 起動時間: ${daysSinceEpoch}日`;
            }

            updateStats();
            setInterval(updateStats, 60000);

            // 状态条加载动画(仅首次触发过渡效果)
            ['hpBar','mpBar','expBar'].forEach(id => {
                const bar = document.getElementById(id);
                if (bar) {
                    const currentWidth = bar.style.width;
                    bar.style.transition = 'none';
                    bar.style.width = '0%';
                    requestAnimationFrame(() => {
                        requestAnimationFrame(() => {
                            bar.style.transition = 'width 1.2s cubic-bezier(0.25, 0.46, 0.45, 0.94)';
                            bar.style.width = currentWidth;
                        });
                    });
                }
            });
        })();

        // 弹窗控制
        const modalOverlay = document.getElementById('contactModal');
        const modalCloseBtn = document.getElementById('modalCloseBtn');
        const contactMenuBtn = document.getElementById('contactMenuBtn');
        const modalWindow = modalOverlay.querySelector('.modal-window');
        function openModal() {
            modalOverlay.classList.add('active');
            document.body.classList.add('modal-open');
            modalOverlay.setAttribute('aria-hidden', 'false');
            setTimeout(() => modalCloseBtn.focus(), 100);
        }
        function closeModal() {
            modalOverlay.classList.remove('active');
            document.body.classList.remove('modal-open');
            modalOverlay.setAttribute('aria-hidden', 'true');
            setTimeout(() => contactMenuBtn.focus(), 100);
        }
        contactMenuBtn.addEventListener('click', (e) => { e.preventDefault(); openModal(); });
        modalCloseBtn.addEventListener('click', closeModal);
        modalOverlay.addEventListener('click', (e) => { if (e.target === modalOverlay) closeModal(); });
        document.addEventListener('keydown', (e) => { if (e.key === 'Escape' && modalOverlay.classList.contains('active')) closeModal(); });
        modalWindow.addEventListener('click', (e) => e.stopPropagation());

        // 菜单项反馈
        document.querySelectorAll('.menu-item').forEach(item => {
            if (item.id === 'contactMenuBtn') return;
            item.addEventListener('click', function(e) {
                e.preventDefault();
                this.style.borderColor = '#ffffff';
                this.style.boxShadow = '0 0 25px rgba(255,255,255,0.6)';
                setTimeout(() => { this.style.borderColor = ''; this.style.boxShadow = ''; }, 150);
            });
        });
        document.querySelectorAll('.skill-card').forEach(card => {
            card.addEventListener('click', function() {
                this.style.borderColor = '#ffffff';
                setTimeout(() => { this.style.borderColor = ''; }, 200);
            });
        });

        // 粒子随机颜色
        setInterval(() => {
            const particles = document.querySelectorAll('.particle');
            const colors = ['#ff6b9d','#00e5ff','#ffd740','#b388ff','#39ff14','#ff8844'];
            const p = particles[Math.floor(Math.random() * particles.length)];
            if (p && Math.random() > 0.7) {
                const c = colors[Math.floor(Math.random() * colors.length)];
                p.style.background = c;
                p.style.boxShadow = `0 0 8px ${c}, 0 0 16px ${c}`;
                setTimeout(() => { p.style.background = ''; p.style.boxShadow = ''; }, 400);
            }
        }, 3000);

        console.log('%c六朝何事, 只成门户私计。',
            'font-family:"Press Start 2P",monospace;color:#39ff14;font-size:10px;');
    </script>
</body>
</html>