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

源码
<!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>
评论
暂无评论