4039 字
20 分钟
班主任模拟器
2026-01-04
<!DOCTYPE html>
<!--班主任模拟器 - v6.1--><html lang="zh-CN"><head><meta charset="UTF-8"><title>whk班主任模拟器</title>
<style>
:root{--cq-red:#e63946;--primary:#1e293b;--secondary:#334155;--accent:#4f46e5;--accent-glow:rgba(79,70,229,0.4);--success:#10b981;--warning:#f59e0b;--danger:#ef4444;--text:#1e293b;--text-light:#475569;--bg-w-10:rgba(255,255,255,0.1);--bg-w-15:rgba(255,255,255,0.15);--bg-w-20:rgba(255,255,255,0.2);--bg-w-25:rgba(255,255,255,0.25);--bg-w-30:rgba(255,255,255,0.3);--bg-w-40:rgba(255,255,255,0.4);--bg-w-45:rgba(255,255,255,0.45);--bg-w-50:rgba(255,255,255,0.5);--bg-w-55:rgba(255,255,255,0.55);--bg-w-60:rgba(255,255,255,0.6);--bg-w-65:rgba(255,255,255,0.65);--bg-w-70:rgba(255,255,255,0.7);--bg-w-75:rgba(255,255,255,0.75);--bg-w-80:rgba(255,255,255,0.8);--bg-w-85:rgba(255,255,255,0.85);--bg-w-90:rgba(255,255,255,0.9);--bg-w-95:rgba(255,255,255,0.95);--bg-w-100:rgba(255,255,255,1);--bd-w-10:rgba(255,255,255,0.1);--bd-w-15:rgba(255,255,255,0.15);--bd-w-20:rgba(255,255,255,0.2);--bd-w-30:rgba(255,255,255,0.3);--bd-w-40:rgba(255,255,255,0.4);--bd-w-50:rgba(255,255,255,0.5);--bd-w-60:rgba(255,255,255,0.6);--bd-w-70:rgba(255,255,255,0.7);--bd-w-80:rgba(255,255,255,0.8);--bd-w-90:rgba(255,255,255,0.9);--bd-w-100:rgba(255,255,255,1);--sd-02:rgba(0,0,0,0.02);--sd-03:rgba(0,0,0,0.03);--sd-05:rgba(0,0,0,0.05);--sd-08:rgba(0,0,0,0.08);--sd-10:rgba(0,0,0,0.1);--sd-15:rgba(0,0,0,0.15);--sd-20:rgba(0,0,0,0.2);--sd-25:rgba(0,0,0,0.25);--sd-30:rgba(0,0,0,0.3);--sd-40:rgba(0,0,0,0.4);--body-bg:#e2e8f0;--overlay-bg:rgba(15,23,42,0.5);--nav-bg-1:rgba(30,41,59,0.85);--nav-bg-2:rgba(30,41,59,0.6);--sub-bg-1:rgba(248,250,252,0.6);--sub-bg-2:rgba(248,250,252,0.3);--sick-bg-1:rgba(255,251,235,0.85);--sick-bg-2:rgba(255,251,235,0.4);--dash-bd:rgba(148,163,184,0.4);--stress-bg:rgba(226,232,240,0.8);--log-bg-1:rgba(15,23,42,0.85);--log-bg-2:rgba(15,23,42,0.55);--btn-skip-1:rgba(15,23,42,0.08);--btn-skip-bd:rgba(15,23,42,0.1);--btn-skip-2:rgba(15,23,42,0.15);--scroll-thumb:rgba(148,163,184,0.5);--input-focus:#fff;--bg-grad-1:rgba(167,139,250,0.45);--bg-grad-2:rgba(96,165,250,0.45);--bg-grad-3:rgba(244,114,182,0.45);--table-th-bg:linear-gradient(135deg,var(--primary),#334155);--glass-bg:linear-gradient(135deg, var(--bg-w-60) 0%, var(--bg-w-15) 100%);--glass-border:var(--bd-w-30);--glass-shadow:0 12px 40px -10px var(--sd-15);--text-shadow-light:0 2px 4px rgba(255,255,255,0.8);--danger-bg:rgba(239,68,68,0.15);--danger-bd:rgba(239,68,68,0.3);--danger-sd:rgba(239,68,68,0.2)}
.dark-mode{--primary:#f1f5f9;--secondary:#94a3b8;--accent:#6366f1;--accent-glow:rgba(99,102,241,0.5);--text:#e2e8f0;--text-light:#94a3b8;--body-bg:#0f172a;--overlay-bg:rgba(0,0,0,0.7);--nav-bg-1:rgba(15,23,42,0.9);--nav-bg-2:rgba(15,23,42,0.6);--sub-bg-1:rgba(30,41,59,0.8);--sub-bg-2:rgba(30,41,59,0.5);--sick-bg-1:rgba(69,26,3,0.85);--sick-bg-2:rgba(69,26,3,0.4);--dash-bd:rgba(255,255,255,0.1);--stress-bg:rgba(30,41,59,0.8);--log-bg-1:rgba(2,6,23,0.9);--log-bg-2:rgba(2,6,23,0.6);--btn-skip-1:rgba(255,255,255,0.1);--btn-skip-bd:rgba(255,255,255,0.15);--btn-skip-2:rgba(255,255,255,0.2);--scroll-thumb:rgba(255,255,255,0.2);--input-focus:#1e293b;--bg-grad-1:rgba(167,139,250,0.15);--bg-grad-2:rgba(96,165,250,0.15);--bg-grad-3:rgba(244,114,182,0.15);--bg-w-10:rgba(15,23,42,0.6);--bg-w-15:rgba(15,23,42,0.65);--bg-w-20:rgba(15,23,42,0.7);--bg-w-25:rgba(15,23,42,0.75);--bg-w-30:rgba(15,23,42,0.8);--bg-w-40:rgba(15,23,42,0.85);--bg-w-45:rgba(15,23,42,0.88);--bg-w-50:rgba(30,41,59,0.8);--bg-w-55:rgba(30,41,59,0.85);--bg-w-60:rgba(30,41,59,0.85);--bg-w-65:rgba(30,41,59,0.9);--bg-w-70:rgba(30,41,59,0.92);--bg-w-75:rgba(30,41,59,0.95);--bg-w-80:rgba(30,41,59,0.98);--bg-w-85:rgba(30,41,59,1);--bg-w-90:rgba(30,41,59,1);--bg-w-95:rgba(30,41,59,1);--bg-w-100:rgba(15,23,42,1);--bd-w-10:rgba(255,255,255,0.05);--bd-w-15:rgba(255,255,255,0.08);--bd-w-20:rgba(255,255,255,0.1);--bd-w-30:rgba(255,255,255,0.15);--bd-w-40:rgba(255,255,255,0.2);--bd-w-50:rgba(255,255,255,0.25);--bd-w-60:rgba(255,255,255,0.3);--bd-w-70:rgba(255,255,255,0.35);--bd-w-80:rgba(255,255,255,0.4);--bd-w-90:rgba(255,255,255,0.5);--bd-w-100:rgba(255,255,255,0.6);--sd-02:rgba(0,0,0,0.2);--sd-03:rgba(0,0,0,0.3);--sd-05:rgba(0,0,0,0.4);--sd-08:rgba(0,0,0,0.5);--sd-10:rgba(0,0,0,0.6);--sd-15:rgba(0,0,0,0.7);--sd-20:rgba(0,0,0,0.8);--sd-25:rgba(0,0,0,0.85);--sd-30:rgba(0,0,0,0.9);--sd-40:rgba(0,0,0,0.95);--table-th-bg:linear-gradient(135deg,#1e293b,#0f172a);--glass-bg:linear-gradient(135deg, rgba(30,41,59,0.8) 0%, rgba(15,23,42,0.9) 100%);--glass-border:var(--bd-w-20);--glass-shadow:0 12px 40px -10px rgba(0,0,0,0.8);--text-shadow-light:0 2px 4px rgba(0,0,0,0.8);--danger-bg:rgba(239,68,68,0.3);--danger-bd:rgba(239,68,68,0.5);--danger-sd:rgba(239,68,68,0.4)}
body::before{content:"";position:fixed;inset:0;background:radial-gradient(circle at 15% 50%,var(--bg-grad-1),transparent 40%),radial-gradient(circle at 85% 30%,var(--bg-grad-2),transparent 40%),radial-gradient(circle at 50% 80%,var(--bg-grad-3),transparent 40%);background-color:var(--body-bg);z-index:-1;animation:bgShift 15s ease-in-out infinite alternate}@keyframes bgShift{0%{transform:scale(1)}100%{transform:scale(1.15)}}*{box-sizing:border-box;font-family:'Segoe UI','Microsoft YaHei',sans-serif;transition:all .35s cubic-bezier(.25,.8,.25,1)}body{color:var(--text);margin:0;display:flex;flex-direction:column;min-height:100vh;overflow-y:auto;overflow-x:hidden}button{cursor:pointer;border:none;outline:none;border-radius:8px;font-weight:bold}button:active:not(:disabled){transform:scale(.98) translateY(0)!important;box-shadow:0 2px 5px var(--sd-05)!important;transition-duration:.05s!important}button:disabled{opacity:.5;cursor:not-allowed;filter:grayscale(1);box-shadow:none!important;transform:none!important}.hidden{display:none!important}@keyframes slideUpFade{0%{opacity:0;transform:translateY(40px) scale(.98)}100%{opacity:1;transform:translateY(0) scale(1)}}.animate-up{animation:slideUpFade .6s cubic-bezier(.16,1,.3,1) forwards;opacity:0}
.glass-panel{background:var(--glass-bg);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--glass-border);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80);border-radius:16px;box-shadow:var(--glass-shadow),inset 0 0 20px var(--bd-w-20)}
.overlay{position:fixed;inset:0;background:var(--overlay-bg);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);z-index:9999;display:flex;justify-content:center;align-items:center;flex-direction:column}
.modal-box{background:linear-gradient(135deg,var(--bg-w-85),var(--bg-w-55));backdrop-filter:blur(25px);-webkit-backdrop-filter:blur(25px);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);border-radius:24px;padding:30px;width:90%;max-width:650px;box-shadow:0 30px 60px -12px var(--sd-30),inset 0 0 20px var(--bd-w-50);max-height:90vh;overflow-y:auto;animation:slideUpFade .5s cubic-bezier(.16,1,.3,1) forwards}
.modal-title{font-size:1.8em;color:var(--primary);margin-top:0;border-bottom:2px solid rgba(79,70,229,.2);padding-bottom:10px}
header{height:75px;background:linear-gradient(135deg,var(--bg-w-70),var(--bg-w-30));backdrop-filter:blur(25px);-webkit-backdrop-filter:blur(25px);border-bottom:1px solid var(--bd-w-40);display:flex;align-items:center;justify-content:space-between;padding:0 80px 0 30px;box-shadow:0 4px 15px var(--sd-05),inset 0 -1px 0 var(--bd-w-60);z-index:10;position:relative}header::after{content:'';position:absolute;bottom:0;left:0;width:100%;height:3px;background:linear-gradient(90deg,var(--cq-red),var(--accent),var(--success))}
.stat-group{display:flex;gap:15px}
.stat-pill{background:linear-gradient(135deg,var(--bg-w-70),var(--bg-w-30));backdrop-filter:blur(15px);-webkit-backdrop-filter:blur(15px);padding:8px 18px;border-radius:12px;border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);font-weight:bold;display:flex;align-items:center;gap:8px;box-shadow:0 4px 10px var(--sd-05),inset 0 0 10px var(--bd-w-40)}
.stat-pill b{color:var(--accent);font-size:1.1em;text-shadow:0 0 10px rgba(79,70,229,.2)}
#btn-next-turn{background:linear-gradient(135deg,var(--danger),#be123c);box-shadow:0 4px 15px rgba(225,29,72,.3);color:#fff;padding:10px 25px;border-radius:25px}#btn-next-turn:hover{transform:translateY(-2px) scale(1.05);box-shadow:0 8px 25px rgba(225,29,72,.5)}
.app-body{display:grid;grid-template-columns:340px 1fr 320px;gap:24px;padding:24px;flex:1;overflow-y:auto;overflow-x:hidden;max-width:1600px;margin:0 auto;width:100%}
.sidebar{display:flex;flex-direction:column;overflow:hidden}
.nav-tabs{display:flex;background:linear-gradient(135deg,var(--nav-bg-1),var(--nav-bg-2));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-radius:16px 16px 0 0}
.tab-btn{flex:1;padding:15px;background:transparent;color:rgba(255,255,255,.7);font-weight:bold;border-radius:16px 16px 0 0;text-shadow:0 1px 3px rgba(0,0,0,.5)}
.tab-btn:hover:not(.active){color:#fff}
.tab-btn.active{background:linear-gradient(135deg,var(--bg-w-60),var(--bg-w-20));color:var(--primary);border-top:1px solid var(--bd-w-60);border-left:1px solid var(--bd-w-60);box-shadow:inset 0 2px 5px var(--bd-w-50);text-shadow:none}
.panel-content{flex:1;overflow-y:auto;padding:20px;display:none;background:linear-gradient(135deg,var(--bg-w-50),var(--bg-w-15));backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border-radius:0 0 16px 16px;border:1px solid var(--bd-w-30);border-top:none;box-shadow:inset 0 5px 15px var(--sd-03)}.panel-content.active{display:block}
.btn-action{width:100%;text-align:left;padding:15px;border:1px solid var(--bd-w-30);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80);border-radius:12px;background:linear-gradient(135deg,var(--bg-w-65),var(--bg-w-25));margin-bottom:12px;position:relative;backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);box-shadow:0 4px 15px var(--sd-05),inset 0 0 10px var(--bd-w-30)}
.btn-action:hover:not(:disabled){border-color:var(--accent);background:linear-gradient(135deg,var(--bg-w-95),var(--bg-w-65));transform:translateY(-3px) scale(1.02);box-shadow:0 10px 20px var(--accent-glow),inset 0 0 15px var(--bd-w-80)}
.cost-tag{position:absolute;right:12px;top:15px;font-size:.75em;color:#b45309;background:#fef3c7;padding:4px 8px;border-radius:6px;font-weight:bold;box-shadow:0 2px 4px var(--sd-05)}
.btn-action h5{margin:0;color:var(--primary);font-size:1.1em;display:flex;align-items:center;gap:8px}.btn-action p{margin:6px 0 0 0;font-size:.8em;color:var(--text-light);line-height:1.5}
.sub-menu{display:none;grid-template-columns:1fr 1fr;gap:10px;background:linear-gradient(135deg,var(--sub-bg-1),var(--sub-bg-2));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);padding:15px;border-radius:12px;border:1px solid var(--bd-w-50);box-shadow:inset 0 2px 10px var(--sd-02);margin-bottom:15px;animation:slideUpFade .3s ease-out forwards}.sub-menu.active{display:grid}
.btn-mini{padding:10px;font-size:.85em;border:1px solid var(--bd-w-50);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);border-radius:8px;background:linear-gradient(135deg,var(--bg-w-70),var(--bg-w-30));backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);font-weight:bold;color:var(--text)}
.btn-mini:hover{transform:translateY(-2px) scale(1.05);background:linear-gradient(135deg,var(--accent),#6366f1);color:#fff;border-color:transparent;box-shadow:0 6px 15px var(--accent-glow)}
.main-view{padding:25px}
.main-tabs-wrapper{display:flex;gap:12px;margin-bottom:20px;border-bottom:2px solid var(--bd-w-30);padding-bottom:15px;align-items:center}
.main-tabs-wrapper button{display:flex;align-items:center;padding:12px 25px;border-radius:12px;background:linear-gradient(135deg,var(--bg-w-60),var(--bg-w-20));backdrop-filter:blur(15px);-webkit-backdrop-filter:blur(15px);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80);box-shadow:0 4px 10px var(--sd-05);color:var(--primary)}
.main-tabs-wrapper button.active{background:linear-gradient(135deg,var(--accent),#4338ca);color:#fff;border-color:#6366f1;border-top:1px solid #818cf8;border-left:1px solid #818cf8;box-shadow:0 4px 15px var(--accent-glow)}
.main-tabs-wrapper button:hover:not(.active){background:linear-gradient(135deg,var(--bg-w-90),var(--bg-w-60));transform:translateY(-2px)}
.stu-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:20px}
.stu-card{background:linear-gradient(135deg,var(--bg-w-75),var(--bg-w-25));backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);border:1px solid var(--bd-w-30);border-top:5px solid var(--accent);border-left:1px solid var(--bd-w-80);border-radius:16px;padding:20px;position:relative;box-shadow:0 10px 30px var(--sd-05),inset 0 0 15px var(--bd-w-40);transition:all .5s cubic-bezier(.175,.885,.32,1.275);overflow:hidden}
.stu-card:hover{transform:translateY(-8px) scale(1.02);background:linear-gradient(135deg,var(--bg-w-90),var(--bg-w-45));box-shadow:0 20px 45px var(--sd-10),0 0 30px var(--accent-glow),inset 0 0 20px var(--bd-w-60);border-color:var(--bd-w-90);border-top-color:var(--accent)}
.stu-card.sick{background:linear-gradient(135deg,var(--sick-bg-1),var(--sick-bg-2));border-top-color:var(--warning)}.stu-card.sick:hover{border-top-color:var(--warning)}
.stu-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px;border-bottom:1px dashed var(--dash-bd);padding-bottom:10px}
.stu-name{font-size:1.3em;font-weight:900;color:var(--primary);text-shadow:0 1px 2px var(--sd-05)}
.tag-pool{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:15px;min-height:24px}
.tag{font-size:.75em;padding:4px 10px;border-radius:8px;font-weight:bold;box-shadow:0 2px 4px var(--sd-05)}
.tag-pos{background:linear-gradient(135deg,#dcfce7,#bbf7d0);color:#15803d;border:1px solid #86efac}
.tag-neg{background:linear-gradient(135deg,#fee2e2,#fecaca);color:#b91c1c;border:1px solid #fca5a5}
.sub-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.sub-box{background:linear-gradient(135deg,var(--bg-w-60),var(--bg-w-15));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--bd-w-30);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80);padding:8px;border-radius:10px;text-align:center;box-shadow:inset 0 2px 6px var(--bd-w-60),0 4px 10px var(--sd-03)}
.sub-label{font-size:.7em;color:var(--text-light);display:block;margin-bottom:4px;font-weight:bold}
.sub-val{font-size:1.15em;font-weight:900;padding:4px 0;border-radius:6px;color:#fff;text-shadow:0 1px 3px var(--sd-40);box-shadow:0 2px 5px var(--sd-10)}
.sub-val.dark-text{color:var(--primary);text-shadow:none}
.stress-bar{height:10px;background:var(--stress-bg);border-radius:5px;margin-top:15px;overflow:hidden;box-shadow:inset 0 1px 3px var(--sd-10)}
.stress-fill{height:100%;transition:width .5s cubic-bezier(.4,0,.2,1);border-radius:5px;position:relative}
.stress-fill::after{content:'';position:absolute;inset:0;background:linear-gradient(90deg,var(--bg-w-10),var(--bg-w-40))}
.right-panel{display:flex;flex-direction:column;gap:24px}
.weather-panel{text-align:center;position:relative;overflow:hidden}
.weather-panel::before{content:'';position:absolute;top:-50%;left:-50%;width:200%;height:200%;background:radial-gradient(circle,var(--bg-w-40) 0,transparent 60%);z-index:0;pointer-events:none}
.month-tag{position:absolute;top:12px;right:12px;background:linear-gradient(135deg,var(--danger),#be123c);color:#fff;padding:4px 10px;font-size:.8em;border-radius:6px;font-weight:bold;box-shadow:0 2px 8px rgba(225,29,72,.4);z-index:1}
.log-panel{flex:1;background:linear-gradient(135deg,var(--log-bg-1),var(--log-bg-2));backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);color:#f8fafc;border-radius:16px;padding:20px;overflow-y:auto;font-size:.85em;border:1px solid var(--bd-w-15);border-top:5px solid var(--accent);border-left:1px solid var(--bd-w-30);box-shadow:0 15px 40px var(--sd-20),inset 0 0 20px var(--sd-40)}
.log-entry{margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid var(--bd-w-10);line-height:1.6;animation:slideUpFade .4s ease forwards}
.log-eff{color:#fcd34d;font-weight:bold;margin-left:6px;text-shadow:0 0 5px rgba(252,211,77,.4)}
.arc-tab{padding:10px 20px;background:linear-gradient(135deg,var(--bg-w-60),var(--bg-w-20));backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80);border-radius:20px;cursor:pointer;display:inline-block;margin:0 8px 10px 0;font-weight:bold}
.arc-tab.active{background:linear-gradient(135deg,var(--accent),#6366f1);color:#fff;box-shadow:0 4px 10px var(--accent-glow);border-color:transparent}
.chart-container{width:100%;height:220px;border-radius:12px;margin-top:15px;padding:20px 10px 10px 10px;background:linear-gradient(135deg,var(--bg-w-50),var(--bg-w-10));backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border-top:1px solid var(--bd-w-70);border-left:1px solid var(--bd-w-70);box-shadow:inset 0 2px 10px var(--sd-05);position:relative;display:flex;align-items:flex-end}
.exam-table{width:100%;border-collapse:separate;border-spacing:0;margin-top:20px;font-size:.95em;border-radius:12px;overflow:hidden;box-shadow:0 4px 15px var(--sd-05)}
.exam-table th,.exam-table td{padding:15px 10px;text-align:center;border-bottom:1px solid var(--sd-05);background:var(--bg-w-25);color:var(--text)}
.exam-table th{background:var(--table-th-bg);color:#fff;border-bottom:none}
.exam-cell{transform:translateY(10px);opacity:0;font-weight:bold}
.exam-cell.pop{animation:slideUpFade .4s forwards}
.event-col{text-align:left!important;font-size:.85em;color:var(--danger);line-height:1.5}
.choice-grid{display:grid;grid-template-columns:1fr;gap:12px;margin-top:25px}
.btn-choice{padding:18px;background:linear-gradient(135deg,var(--bg-w-70),var(--bg-w-30));backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--accent);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);color:var(--primary);text-align:left;border-radius:12px;font-size:1.05em;box-shadow:0 5px 15px var(--sd-05)}
.btn-choice:hover{background:linear-gradient(135deg,var(--bg-w-10),var(--bg-w-15));color:var(--accent);box-shadow:0 8px 20px var(--accent-glow);transform:translateY(-2px);border-color:var(--accent)}
.name-input{padding:12px;background:linear-gradient(135deg,var(--bg-w-90),var(--bg-w-50));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--bd-w-50);border-top:1px solid var(--bd-w-100);border-left:1px solid var(--bd-w-100);border-radius:8px;width:100%;font-size:1em;outline:none;text-align:center;box-shadow:inset 0 2px 6px var(--sd-05),0 2px 5px var(--sd-02);color:var(--text)}
.name-input:focus{background:var(--input-focus);transform:translateY(-2px);box-shadow:0 8px 20px var(--accent-glow),inset 0 2px 4px var(--sd-02);border-color:var(--accent)}
#exam-skip-btn{position:absolute;top:20px;right:25px;padding:8px 18px;background:var(--btn-skip-1);color:var(--text-light);border-radius:20px;font-weight:bold;border:1px solid var(--btn-skip-bd)}#exam-skip-btn:hover{background:var(--btn-skip-2);color:var(--primary)}
::-webkit-scrollbar{width:8px}::-webkit-scrollbar-track{background:var(--bg-w-20);border-radius:4px}::-webkit-scrollbar-thumb{background:var(--scroll-thumb);border-radius:4px}::-webkit-scrollbar-thumb:hover{background:var(--accent)}
@keyframes pulse{0%{transform:scale(1)}50%{transform:scale(1.05)}100%{transform:scale(1)}}@keyframes blinkDanger{0%,100%{opacity:1}50%{opacity:.3}}.stress-blink{animation:blinkDanger .8s cubic-bezier(.4,0,.6,1) infinite !important}
.status-badge{display:inline-flex;align-items:center;gap:4px;font-size:.8em;padding:3px 8px;border-radius:12px;margin-left:8px;font-weight:bold;background:linear-gradient(135deg,var(--bg-w-60),var(--bg-w-20));backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);color:var(--text-light);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-80);border-left:1px solid var(--bd-w-80)}
.status-badge.danger{background:var(--danger-bg);color:var(--danger);border-color:var(--danger-bd);box-shadow:inset 0 0 5px var(--danger-sd),0 0 10px var(--danger-sd)}
.theme-btn{position:fixed;top:16px;right:25px;z-index:10000;background:var(--bg-w-50);backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);border:1px solid var(--bd-w-40);border-radius:50%;width:42px;height:42px;color:var(--primary);display:flex;align-items:center;justify-content:center;padding:0;box-shadow:0 4px 10px var(--sd-05)}
.theme-btn:hover{transform:scale(1.1);background:var(--bg-w-80)}#theme-icon{display:flex;align-items:center;justify-content:center;width:100%;height:100%}
.g-cd1{background:linear-gradient(135deg,var(--bg-w-80),var(--bg-w-40));backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--bd-w-50);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);box-shadow:0 4px 10px var(--sd-05);padding:15px;border-radius:12px}
.g-cd2{background:linear-gradient(135deg,var(--bg-w-70),var(--bg-w-25));backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);border-radius:12px;padding:18px;box-shadow:0 6px 15px var(--sd-05),inset 0 0 10px var(--bd-w-50)}
.g-cd3{background:linear-gradient(135deg,var(--bg-w-65),var(--bg-w-25));backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border:1px solid var(--bd-w-40);border-top:1px solid var(--bd-w-90);border-left:1px solid var(--bd-w-90);border-radius:16px;padding:25px;box-shadow:0 10px 30px var(--sd-05),inset 0 0 15px var(--bd-w-50)}
.g-bt1{padding:15px;background:linear-gradient(135deg,var(--bg-w-80),var(--bg-w-40));color:var(--primary);border:1px solid var(--bd-w-80);backdrop-filter:blur(10px)}.g-flx{display:flex;justify-content:space-between;align-items:center}
</style></head><body>
<button class=theme-btn onclick=UI.tThm()><span id=theme-icon><svg viewBox="0 0 24 24" width=22 height=22 stroke=currentColor stroke-width=2 fill=none stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=5></circle><line x1=12 y1=1 x2=12 y2=3></line><line x1=12 y1=21 x2=12 y2=23></line><line x1=4.22 y1=4.22 x2=5.64 y2=5.64></line><line x1=18.36 y1=18.36 x2=19.78 y2=19.78></line><line x1=1 y1=12 x2=3 y2=12></line><line x1=21 y1=12 x2=23 y2=12></line><line x1=4.22 y1=19.78 x2=5.64 y2=18.36></line><line x1=18.36 y1=5.64 x2=19.78 y2=4.22></line></svg></span></button>
<div id=start-screen class=overlay><div class=modal-box style="max-width:750px;border-top:6px solid var(--accent)"><h1 style="color:var(--primary);font-size:2.8em;margin-bottom:20px;text-align:center;text-shadow:var(--sd-10)">whk班主任模拟器</h1><div class=g-cd2 style=margin-bottom:25px;color:var(--text);line-height:1.7><b>📝 背景档案:</b><br>你接手了一群刚刚结束信息学奥赛(OI)的退役生。他们虽思维敏捷,但文化课(whk)基础薄弱。距离2026年6月的高考只有不到10个月的时间。<br>请合理安排他们的学习、测试与身心健康。</div><div class=g-cd2 style=margin-bottom:25px><h3 style="text-align:center;margin-top:0;margin-bottom:15px;color:var(--primary)">为你的6名神仙命名(留空则默认):</h3><div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:15px"><input type=text id=name-0 placeholder="Double10" class="name-input animate-up" style=animation-delay:.1s><input type=text id=name-1 placeholder="_Sparktasia_" class="name-input animate-up" style=animation-delay:.2s><input type=text id=name-2 placeholder="paper_" class="name-input animate-up" style=animation-delay:.3s><input type=text id=name-3 placeholder="GoldSpade" class="name-input animate-up" style=animation-delay:.4s><input type=text id=name-4 placeholder="xxxxxzy" class="name-input animate-up" style=animation-delay:.5s><input type=text id=name-5 placeholder="_Communist" class="name-input animate-up" style=animation-delay:.6s></div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:15px"><button class="btn-action animate-up" style="margin:0;padding:10px;animation-delay:.65s" onclick=UI.iNms()><h5>📥 导入名单</h5><p>导入本地名单</p></button><button class="btn-action animate-up" style="margin:0;padding:10px;animation-delay:.65s" onclick=UI.eNms()><h5>📤 导出名单</h5><p>保存当前名单</p></button><input type=file id=import-input class=hidden accept=.txt onchange="UI.hFS(event)"></div></div><div style="display:grid;grid-template-columns:1fr 1fr;gap:20px"><button class="btn-action animate-up" style="margin:0;border-color:var(--success);animation-delay:.7s" onclick="Game.start('easy')"><h5 style="color:var(--success);font-size:1.3em">🟢 稳健带班</h5><p>初始资金 ¥10000。提分效率正常。</p></button><button class="btn-action animate-up" style="margin:0;border-color:var(--danger);animation-delay:.8s" onclick="Game.start('hard')"><h5 style="color:var(--danger);font-size:1.3em">🔴 地狱开局</h5><p>初始资金 ¥2000。所有学科学习能力下降 20%。</p></button></div></div></div>
<header class="hidden animate-up" id=main-header style=animation-delay:.1s><div style="font-size:1.6em;font-weight:900;color:var(--primary);text-shadow:var(--text-shadow-light)">高三(OI退役)班</div><div class=stat-group><div class=stat-pill>🗓️ <span id=ui-time></span></div><div class=stat-pill>💰 班费: <b id=ui-money></b></div><div class=stat-pill>⚡ AP: <b id=ui-ap></b><span id=ap-max-txt style="font-size:.75em;color:var(--text-light)"></span></div><button id=btn-next-turn onclick=Game.nextT()>结束本周 ⏭</button></div></header>
<div class="app-body hidden" id=main-body><aside class="sidebar glass-panel animate-up" style=animation-delay:.2s><div class=nav-tabs><button class="tab-btn active" onclick="UI.sTab('action')">🎯 决策指令</button><button class=tab-btn onclick="UI.sTab('fac')">🏗️ 班级设施</button></div><div id=panel-action class="panel-content active"><h4 style="margin:0 0 12px 0;color:var(--text-light);font-size:.95em;border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:5px">📖 学习提分</h4><div id=action-list-1><button class="btn-action animate-up" style=animation-delay:.1s onclick="UI.tMnu('menu-study')"><h5>自习针对复习</h5><p>选择单科进行强化,稳步提升,增加少量压力</p><span class=cost-tag>AP: 1</span></button><div class=sub-menu id=menu-study><button class=btn-mini onclick="Game.doA('study','chi')">语文</button><button class=btn-mini onclick="Game.doA('study','mat')">数学</button><button class=btn-mini onclick="Game.doA('study','eng')">英语</button><button class=btn-mini onclick="Game.doA('study','phy')">物理</button><button class=btn-mini onclick="Game.doA('study','che')">化学</button><button class=btn-mini onclick="Game.doA('study','bio')">生物</button></div><button class="btn-action animate-up" style=animation-delay:.2s onclick="UI.tMnu('menu-test')"><h5>📝 单科随堂小测</h5><p>小测验逼出潜能,提分效果相当于 1.5 次自习</p><span class=cost-tag>¥500 | AP: 1</span></button><div class=sub-menu id=menu-test><button class=btn-mini onclick="Game.doA('test','chi')">语文测</button><button class=btn-mini onclick="Game.doA('test','mat')">数学测</button><button class=btn-mini onclick="Game.doA('test','eng')">英语测</button><button class=btn-mini onclick="Game.doA('test','phy')">物理测</button><button class=btn-mini onclick="Game.doA('test','che')">化学测</button><button class=btn-mini onclick="Game.doA('test','bio')">生物测</button></div><button class="btn-action animate-up" style=animation-delay:.3s onclick="UI.tMnu('menu-train')"><h5>🚀 课外魔鬼特训班</h5><p>重金名师,包含的两科均获得 2 次自习的效果</p><span class=cost-tag id=cost-train>¥2000 | AP: 2</span></button><div class=sub-menu id=menu-train><button class=btn-mini onclick="Game.doA('train','mat_phy')">数理强基</button><button class=btn-mini onclick="Game.doA('train','chi_eng')">语英专项</button><button class=btn-mini onclick="Game.doA('train','che_bio')">生化实验</button></div><button class="btn-action animate-up" style=animation-delay:.4s onclick=Game.doME()><h5>📚 组织全真模拟考</h5><p>买卷子直接开考!全科获 1 次自习效果,不记入历史</p><span class=cost-tag>¥4000 | AP: 2</span></button></div><h4 style="margin:20px 0 12px 0;color:var(--text-light);font-size:.95em;border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:5px">☕ 状态管理</h4><div id=action-list-2><button class="btn-action animate-up" style=animation-delay:.5s onclick=UI.sDMod()><h5>🏥 聘请私人医生</h5><p>立刻治愈 1 名学生的病假状态,不消耗行动力</p><span class=cost-tag>¥1000 | AP: 0</span></button><button class="btn-action animate-up" style=animation-delay:.6s onclick=UI.sHPMod()><h5 id=title-hotpot>🍲 包场九宫格火锅</h5><p>全班聚餐!清空所有人压力,70%概率洗掉负面天赋</p><span class=cost-tag id=cost-hotpot>¥3000 | AP: 2</span></button><button class="btn-action animate-up" style=animation-delay:.7s onclick="Game.doA('rest','snack')"><h5 id=title-snack>🍢 校门口买小吃</h5><p>便宜实惠,小幅缓解全班压力</p><span class=cost-tag id=cost-snack>¥500 | AP: 1</span></button><button class="btn-action animate-up" style=animation-delay:.8s onclick="Game.doA('rest','walk')"><h5>🚶 广场免费散步</h5><p>零消耗缓解压力</p><span class=cost-tag>¥0 | AP: 1</span></button></div><div id=graduated-actions class=hidden><h4 style="margin:20px 0 12px 0;color:var(--text-light);font-size:.95em;border-bottom:1px solid rgba(0,0,0,.1);padding-bottom:5px">🎓 毕业留念</h4><button class="btn-action animate-up" style="border-color:var(--success);animation-delay:.1s" onclick=Game.eGK()><h5 style=color:var(--success)>📊 导出高考成绩</h5><p>将2026届高考成绩单存为包含动画的本地独立HTML文件</p></button></div></div><div id=panel-fac class=panel-content><div id=fac-container></div><p class=animate-up style="animation-delay:.4s;font-size:.85em;color:var(--text-light);margin-top:20px;text-align:center;background:var(--bg-w-50);padding:10px;border-radius:8px">提示:提升设施可显著减轻压力、增强学习收益并抵御恶劣天气造成的生病。</p></div></aside><main class="main-view glass-panel animate-up" style=animation-delay:.3s><div class=main-tabs-wrapper><button onclick="UI.sMain('classroom')" id=btn-classroom class=active>🏫 教室概况 <span id=badge-classroom class=status-badge>🤒 0 🤯 0</span></button><button onclick="UI.sMain('archive')" id=btn-archive>📂 学生档案</button></div><div id=view-classroom class=stu-grid></div><div id=view-archive class=hidden><div id=arc-tabs style=margin-bottom:20px></div><div id=arc-detail class=g-cd3></div></div></main><aside class=right-panel><div class="weather-panel glass-panel animate-up" style=padding:25px;animation-delay:.4s><div class="month-tag hidden" id=sprint-tag>冲刺月</div><div style=position:relative;z-index:1><div style="font-size:1em;color:var(--text-light);font-weight:bold;letter-spacing:2px" id=ui-season></div><div style="font-size:4em;margin:15px 0;filter:drop-shadow(0 4px 6px var(--sd-10))" id=ui-weather></div><div style="font-size:1.2em;font-weight:bold;color:var(--primary)" id=ui-weather-txt></div></div></div><div class="log-panel animate-up" id=log-area style=animation-delay:.5s></div></aside></div>
<div id=hotpot-modal class="overlay hidden"><div class=modal-box style=text-align:center><h2 class=modal-title>🍲 全班包场吃火锅</h2><p style="font-size:1.1em;color:var(--text);line-height:1.6">消耗 ¥3000 和 2 点行动力,清空全班压力,并有 70% 概率消除大家身上的负面天赋。</p><div style="display:flex;gap:15px;margin-top:25px"><button class=g-bt1 style=flex:1 onclick="UI.cMod('hotpot-modal')">取消</button><button style="flex:2;padding:15px;background:linear-gradient(135deg,var(--danger),#be123c);color:#fff;box-shadow:0 4px 15px rgba(225,29,72,.4)" onclick=Game.cHP()>痛快买单!</button></div></div></div><div id=doctor-modal class="overlay hidden"><div class=modal-box><h2 class=modal-title>🏥 聘请私人医生</h2><p style=color:var(--text-light)>消耗 ¥1000 立即消除所选学生的病假状态 (0 AP)。</p><div id=doctor-list style="display:flex;flex-direction:column;gap:12px;margin-bottom:25px"></div><button class=g-bt1 style=width:100% onclick="UI.cMod('doctor-modal')">关闭</button></div></div><div id=weekly-modal class="overlay hidden"><div class=modal-box><h2 class=modal-title>📝 周考复盘分配</h2><p style="font-size:1.05em;line-height:1.6">通过本周的以赛代练,你获得了 <b><span id=weekly-pts style="color:var(--danger);font-size:1.4em;text-shadow:0 0 5px rgba(239,68,68,.3)"></span></b> 点提升点数。请分配(全班共享微幅提升):</p><div id=weekly-alloc style="display:grid;grid-template-columns:1fr 1fr;gap:15px;margin-bottom:25px"></div><button style="width:100%;padding:15px;background:linear-gradient(135deg,var(--success),#047857);box-shadow:0 4px 15px rgba(16,185,129,.3);color:#fff;font-size:1.1em" onclick=Game.cWk()>确认分配并继续</button></div></div><div id=choice-modal class="overlay hidden"><div class=modal-box><h2 class=modal-title style=color:var(--warning);border-color:rgba(245,158,11,.3)>⚠️ 突发状况</h2><p id=choice-desc style="font-size:1.15em;line-height:1.6;color:var(--text);margin-bottom:20px"></p><div class=choice-grid id=choice-btns></div></div></div><div id=exam-modal class="overlay hidden" style=background:var(--overlay-bg);backdrop-filter:blur(20px)><div class=g-cd3 style="width:95%;max-width:1400px;height:85vh;display:flex;flex-direction:column;animation:slideUpFade .6s forwards"><button id=exam-skip-btn class=hidden>⏭ 跳过动画</button><h1 id=exam-title style="color:var(--cq-red);text-align:center;font-size:2.8em;margin:0 0 10px 0;text-shadow:0 2px 10px rgba(230,57,70,.2)"></h1><p id=exam-rewards-txt style="text-align:center;color:var(--text-light);margin-top:0;font-weight:bold;font-size:1.1em"></p><div style="flex:1;overflow-y:auto;padding-right:15px;margin-top:10px"><table class=exam-table id=exam-table></table></div><button id=exam-close-btn class="hidden animate-up" style="width:350px;margin:25px auto 0 auto;padding:18px;background:linear-gradient(135deg,var(--accent),#3730a3);box-shadow:0 10px 25px var(--accent-glow);color:#fff;font-size:1.3em;border-radius:30px" onclick=UI.cExm()>确认成绩并入档</button></div></div><div id=gaokao-modal class="overlay hidden"><div class=modal-box style="text-align:center;border:4px solid var(--cq-red);background:linear-gradient(135deg,var(--bg-w-95),var(--bg-w-85));box-shadow:0 0 50px rgba(230,57,70,.3)"><h1 style="color:var(--cq-red);font-size:3.5em;margin-bottom:10px;text-shadow:0 4px 15px rgba(230,57,70,.3)">🎓 2026 高考</h1><p style="font-size:1.25em;line-height:1.7;color:var(--text)">终于到了这一天。无论过去多少个夜晚在刷题,无论退役时有多少遗憾,现在,所有的努力都将凝结在答题卡上。</p><button onclick=Game.sGK() style="padding:20px 60px;background:linear-gradient(135deg,var(--cq-red),#9f1239);color:#fff;font-size:1.6em;border-radius:50px;margin-top:30px;box-shadow:0 15px 30px rgba(230,57,70,.4);transform:scale(1.05);animation:pulse 2s infinite">奔赴考场</button></div></div><div id=ending-modal class="overlay hidden" style="background:var(--overlay-bg);overflow-y:auto;padding:40px 0;backdrop-filter:blur(20px)"><div class=modal-box style="max-width:950px;text-align:center;margin:0 auto;border:none;box-shadow:0 30px 60px var(--sd-25)"><h1 style="font-size:3em;color:var(--primary);margin-bottom:20px;background:-webkit-linear-gradient(45deg,var(--accent),var(--danger));-webkit-background-clip:text;-webkit-text-fill-color:transparent">🎓 2026届 毕业盛典 🎓</h1><div id=ending-player style="background:linear-gradient(135deg, var(--sub-bg-1), var(--sub-bg-2));backdrop-filter:blur(16px);padding:25px;border:2px solid var(--warning);border-radius:16px;margin-bottom:35px;text-align:left;box-shadow:0 10px 30px var(--sd-10)"></div><h3 style="color:var(--primary);border-bottom:2px solid rgba(79,70,229,.2);padding-bottom:10px;text-align:left;font-size:1.5em">🗺️ 全国大一新生蹭饭地图</h3><div id=ending-cengfan style="text-align:left;margin-bottom:40px;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:15px"></div><div style="display:flex;gap:20px;justify-content:center"><button class=g-bt1 style="padding:15px 35px;font-size:1.2em" onclick=Game.rTC()>回到班级 (彩蛋)</button><button style="padding:15px 35px;background:linear-gradient(135deg,var(--accent),#3730a3);box-shadow:0 10px 25px var(--accent-glow);color:#fff;font-size:1.2em" onclick=location.reload()>再带一届</button></div></div></div>
<script>
const $=id=>document.getElementById(id),$$=sel=>document.querySelectorAll(sel),R=Math.random,M_M=Math.max,M_N=Math.min,O=Math.round;
const EXAM_EV={chi:[["作文超常发挥",10],["阅读理解翻车",-8]],mat:[["压轴题秒解",15],["计算失误",-10]],eng:[["完形全对",12],["听力拉胯",-8]],phy:[["力学满分",12],["电磁翻车",-8]],che:[["推断全对",10],["方程式写错",-7]],bio:[["遗传题全对",10],["知识点遗忘",-7]]};
const CONFIG={SUB:[['chi','语文',150],['mat','数学',150],['eng','英语',150],['phy','物理',100],['che','化学',100],['bio','生物',100]].map(x=>({id:x[0],n:x[1],c:x[2]})),GRD:[['US',148],['SSS+',142],['SSS',135],['SS',125],['S',115],['A',100],['B',85],['C',70],['D',50],['E',0]].map(x=>({l:x[0],v:x[1]})),FAC:[['desk','课桌椅',['破木桌','普通课桌','人体工学椅'],[0,2000,6000],'降低复习压力'],['tech','教学硬件',['粉笔黑板','投影仪','智慧屏'],[0,3000,8000],'提高吸收效率'],['ac','恒温系统',['无','空调','中央新风'],[0,2500,7000],'减免恶劣天气生病率与惩罚']].map(x=>({id:x[0],n:x[1],lv:x[2],p:x[3],d:x[4]})),TAL:[['t1','解析眼','pos','数学/物理提升+20%'],['t2','语感','pos','英语提升+20%'],['t3','大心脏','pos','压力自然增长减半'],['t4','实验狂','pos','化/生提升+20%'],['t5','卷王','pos','全科微弱加成'],['t6','锦鲤','pos','考试不易发挥失常'],['t7','记忆大师','pos','生物/化学提升+30%'],['t8','逻辑鬼才','pos','数学/物理提升+30%'],['n1','粗心','neg','大考易扣分'],['n2','玻璃心','neg','压力极易升高'],['n3','偏科','neg','大考随机发挥拉胯'],['n4','网瘾','neg','概率翘课打CF'],['n5','失眠','neg','每周额外增加压力']].map(x=>({id:x[0],n:x[1],t:x[2],d:x[3]})),UNI:[[685,['清华大学','北京大学']],[650,['复旦大学','上海交通大学','浙江大学','中国科学技术大学','南京大学','哈尔滨工业大学','西安交通大学']],[600,['重庆大学','四川大学','电子科大','中南大学','厦门大学','山东大学','武汉大学']],[500,['重庆邮电大学','西南大学','合肥工业大学','郑州大学','福州大学']],[0,['重庆蓝翔技校','家里蹲大学','复读高中']]].map(x=>({min:x[0],list:x[1]}))};
const SEASONS={'8':'秋','9':'秋','10':'秋','11':'冬','12':'冬','1':'冬','2':'春','3':'春','4':'春','5':'夏','6':'夏'};
const WEATHER_POOL={'秋':[{i:'☀️',n:'秋高气爽'},{i:'🌧️',n:'秋雨连绵'}],'冬':[{i:'🌫️',n:'湿冷大雾',eff:'cold'},{i:'🌨️',n:'寒潮入侵',eff:'cold'}],'春':[{i:'🌤️',n:'春暖花开'},{i:'🌧️',n:'春雨绵绵'}],'夏':[{i:'🥵',n:'高温预警',eff:'hot'},{i:'⛈️',n:'狂风暴雨'}]};
let State={week:1,month:8,year:2025,money:0,ap:3,maxAp:3,diff:'normal',isGraduated:!1,isMockExam:!1,weather:{i:'☀️',n:'晴朗',eff:''},season:'秋',fac:{desk:0,tech:0,ac:0},tempAlloc:{},stu:[]};
const Game={examTimeouts:[],examSettled:!1,
addM(s,subId,gain){if(gain<=0){s.m[subId]+=gain;return;}let c=CONFIG.SUB.find(x=>x.id===subId);let oR=s.m[subId]/c.c;let oG=CONFIG.GRD.find(x=>oR>=x.v/150)||CONFIG.GRD[9];s.m[subId]+=gain;let nR=s.m[subId]/c.c;let nG=CONFIG.GRD.find(x=>nR>=x.v/150)||CONFIG.GRD[9];if(nG.v>oG.v&&R()<.01){s.m[subId]=c.c;Game.log(`🎉 奇迹发生!${s.name} 的${c.n}突然开窍了,直接达到了满级!`,"[顿悟]");}},
start(diff){State.diff=diff;State.money=diff==='easy'?10000:2000;let rMin=diff==='easy'?.42:.36,rMax=diff==='easy'?.80:.70;const def=["Double10","_Sparktasia_","paper_","GoldSpade","xxxxxzy","_Communist"];let names=[];for(let i=0;i<6;i++)names.push($(`name-${i}`).value.trim()||def[i]);localStorage.setItem('whk-names',JSON.stringify(names));let p=CONFIG.TAL.filter(t=>t.t==='pos'),n=CONFIG.TAL.filter(t=>t.t==='neg');let rl=()=>rMin+Math.sqrt(R())*(rMax-rMin);State.stu=names.map(nm=>({name:nm,status:'normal',st:30+R()*20,sk:0,h:{scores:[],ranks:[]},tl:[...this.shf([...p]).slice(0,2),...this.shf([...n]).slice(0,1)],m:{chi:O(150*rl()),mat:O(150*rl()),eng:O(150*rl()),phy:O(100*rl()),che:O(100*rl()),bio:O(100*rl())}}));$('start-screen').classList.add('hidden');$('main-header').classList.remove('hidden');$('main-body').classList.remove('hidden');$$('.animate-up').forEach(el=>{el.style.animation='none';el.offsetHeight;el.style.animation=null});this.uW();this.log("新学期开始,目标:2026年6月高考!","[档案建立]");this.uUI()},
shf(a){let r=[...a];for(let i=r.length-1;i>0;i--){const j=Math.floor(R()*(i+1));[r[i],r[j]]=[r[j],r[i]]}return r},gRS(num){return this.shf(State.stu).slice(0,num)},
gGM(sub,cur){if(sub==='mat'&&cur<120)return 1.4;if(sub==='eng'&&cur<110)return 1.4;if(sub==='chi'&&cur<100)return 1.4;let c=CONFIG.SUB.find(x=>x.id===sub).c;return M_M(.05,1-Math.pow(cur/c,sub==='chi'?1.5:3.0))},
doA(cat,sub){if(State.isGraduated){if(['study','train','test'].includes(cat))return alert("同学们已经毕业啦哦!");if(cat==='rest'&&sub==='snack'){Game.log("学生们凑钱请你吃了校门口小吃!","[压力清零]");State.stu.forEach(s=>s.st=0);this.uUI();return}if(cat==='rest'&&sub==='walk')return Game.log("你独自在校园散步,回忆着他们的高三。","[思绪万千]");}if(State.ap<1&&!State.isGraduated)return alert("AP 不足!");let aC=State.stu.filter(s=>s.sk===0).length;if(aC===0)return alert("全班都病假了!");let cA=cat==='train'?2:(cat==='rest'&&sub==='walk'?1:1),cM=cat==='test'?500:(cat==='train'?2000:(cat==='rest'&&sub==='snack'?500:0));if(State.ap<cA&&!State.isGraduated)return alert("AP 不足!");if(State.money<cM)return alert("班费不足!");if(!State.isGraduated){State.ap-=cA;State.money-=cM}let tB=1+(State.fac.tech*.15),dR=State.fac.desk*5,dM=State.diff==='hard'?.8:1.0;State.stu.filter(s=>s.sk===0).forEach(s=>{if(s.tl.some(t=>t.id==='n4')&&R()<.15)return this.log(`${s.name} 翘课去机房打 CF 去了!`,"[网瘾发作]");if(['study','test'].includes(cat)){let bG=(sub==='chi'?1.5:2.5)*tB*this.gGM(sub,s.m[sub])*dM;if(s.st>80)bG*=M_M(0,1-(s.st-80)/100);if(cat==='test')bG*=1.5;if(s.tl.some(t=>t.id==='t5'))bG*=1.2;if(['mat','phy'].includes(sub)&&s.tl.some(t=>t.id==='t1'))bG*=1.2;if(['mat','phy'].includes(sub)&&s.tl.some(t=>t.id==='t8'))bG*=1.3;if(sub==='eng'&&s.tl.some(t=>t.id==='t2'))bG*=1.2;if(['che','bio'].includes(sub)){if(s.tl.some(t=>t.id==='t4'))bG*=1.2;if(s.tl.some(t=>t.id==='t7'))bG*=1.3}Game.addM(s,sub,bG);s.st+=M_M(2,(cat==='test'?15:12)-dR)}else if(cat==='train'){sub.split('_').forEach(su=>{let bG=(su==='chi'?1.5:2.5)*2.0*tB*this.gGM(su,s.m[su])*dM;if(s.st>80)bG*=M_M(0,1-(s.st-80)/100);Game.addM(s,su,bG)});s.st+=M_M(10,25-dR)}else if(cat==='rest'){s.st=M_M(0,s.st-(sub==='walk'?20:30))}});UI.hAM();this.uUI();if(cat!=='rest')this.log(cat==='study'?`组织了自习`:cat==='test'?`进行了随堂测验`:`开启了特训`,cM>0?`[资金-${cM}]`:``)},
healD(i){if(State.money<1000)return alert("班费不足!");State.money-=1000;let s=State.stu[i];s.sk=0;UI.cMod('doctor-modal');this.log(`请私人医生治好了 ${s.name}。`,"[资金-1000, 恢复健康]");this.uUI()},
cHP(){if(State.isGraduated){Game.log("学生们重返母校,凑份子请你吃了一顿顶级的九宫格老火锅!","[极度愉悦]");State.stu.forEach(s=>s.st=0);UI.cMod('hotpot-modal');this.uUI();return}if(State.money<3000||State.ap<2)return alert("班费不够包场或AP不足!");State.money-=3000;State.ap-=2;let cN=[];State.stu.forEach(s=>{s.st=0;let iL=s.tl.length;s.tl=s.tl.filter(t=>t.t!=='neg'||R()>.7);if(s.tl.length<iL)cN.push(s.name)});UI.cMod('hotpot-modal');this.log(`花费 ¥3000 包场吃火锅。`,`[压力清空${cN.length>0?`, ${cN.join(',')}克服了心魔`:''}]`);this.uUI()},
doME(){if(State.isGraduated||State.money<4000||State.ap<2)return alert("资金不足买题或AP不足!");State.money-=4000;State.ap-=2;State.isMockExam=!0;let tB=1+(State.fac.tech*.15),dM=State.diff==='hard'?.8:1.0;State.stu.filter(s=>s.sk===0).forEach(s=>{CONFIG.SUB.forEach(sub=>{let bG=(sub.id==='chi'?1.5:2.5)*tB*this.gGM(sub.id,s.m[sub.id])*dM;if(s.st>80)bG*=M_M(0,1-(s.st-80)/100);Game.addM(s,sub.id,bG)});s.st+=15});this.log("豪掷 ¥4000 组织全真模拟考!","[全科能力+]");this.pEx("全真模拟考试",!0)},
nextT(){State.week++;State.stu.forEach(s=>{if(s.sk>0){s.sk--;if(s.sk===0)this.log(`${s.name} 病好了。`,"[状态恢复]")}});if(State.week===2&&State.month!==6)return UI.sWMod();if(State.week>4){State.week=1;State.month++;if(State.month>12){State.month=1;State.year++}this.uW();if(State.month===5&&State.year===2026){State.maxAp=4;this.log("🔥 进入五月冲刺期!大家进入狂暴状态,每周获得 4 点行动力!","[冲刺开启]");State.stu.forEach(s=>s.st+=20);this.pEx("四月调考");return}if(State.month===6&&State.year===2026){$('gaokao-modal')&&$('gaokao-modal').classList.remove('hidden');return}else return this.pEx()}this.fTL()},
cWk(){let p=parseInt($('weekly-pts').innerText);if(p>0)return alert("请分配完!");State.stu.filter(s=>s.sk===0).forEach(s=>{for(let k in State.tempAlloc)Game.addM(s,k,State.tempAlloc[k]*1.5)});UI.cMod('weekly-modal');this.log("周考复盘,薄弱学科微幅补强。");this.fTL()},
tRE(){if(R()>.6)return;let evs=[{c:s=>s.fac.desk<2,t:"由于课桌椅陈旧摇晃,学生们联合写信向你请求修理。",c1:{n:"拨专款直接升级课桌",f:()=>{let cs=CONFIG.FAC[0].p[State.fac.desk+1];if(State.money>=cs){State.money-=cs;State.fac.desk++;Game.log("升级了课桌","[设施升级]")}else{State.stu.forEach(x=>x.st+=20);Game.log("没钱修桌子","[压力+]")}}},c2:{n:"厉声驳回:克服困难",f:()=>{State.stu.forEach(s=>s.st+=25);Game.log("驳回了换桌子请求","[压力++]")}}},{c:s=>s.weather.eff==='hot'&&s.fac.ac<2,t:"酷暑难耐,电风扇已经失去作用,大家热得发晕,请求改善制冷。",c1:{n:"咬牙升级空调系统",f:()=>{let cs=CONFIG.FAC[2].p[State.fac.ac+1];if(State.money>=cs){State.money-=cs;State.fac.ac++;Game.log("升级了恒温系统","[设施升级]")}else{State.stu.forEach(x=>x.st+=20);Game.log("没钱装空调","[压力+]")}}},c2:{n:"心静自然凉!",f:()=>{State.stu.forEach(s=>s.st+=30);Game.log("大家都在流汗","[压力++]")}}},{c:s=>!0,t:"巡查机房时,你隔着窗户发现两名学生似乎在偷偷打 Codeforces 比赛!",c1:{n:"直接冲进去没收电脑",f:()=>{let vs=Game.gRS(2);vs.forEach(s=>{s.st+=35;Game.addM(s,'mat',-2)});Game.log(`没收了 ${vs[0].name} 和 ${vs[1].name} 的作案工具`,"[压力++, 纪律加强]")}},c2:{n:"装作没看见,顺便祈祷他们能上分",f:()=>{let vs=Game.gRS(2);vs.forEach(s=>{s.st=0;Game.addM(s,'mat',5);Game.addM(s,'phy',3)});Game.log(`放任 ${vs[0].name} 和 ${vs[1].name} 打CF,这下不得不绿名了`,"[压力清零, 数理+]")}}},{c:s=>!0,t:"课代表跑来申请:『老师,大家觉得纯看书太枯燥了,想去实验室做做真实的生化实验!』",c1:{n:"立刻安排!(¥1000)",f:()=>{if(State.money>=1000){State.money-=1000;State.stu.forEach(s=>{s.st=M_M(0,s.st-20);Game.addM(s,'che',6);Game.addM(s,'bio',6)});Game.log("去实验室玩火","[资金-1000, 生化+, 压力-]")}else{State.stu.forEach(s=>s.st+=10);Game.log("资金不足以做实验","[失望]")}}},c2:{n:"安全第一,乖乖刷题",f:()=>{State.stu.forEach(s=>s.st+=10);Game.log("驳回了实验请求","[压力+]")}}},{c:s=>!0,t:"上一届毕业的学长回校探望,看到你们班在苦熬,非常感动。",c1:{n:"感谢并接受他的捐款",f:()=>{State.money+=1500;Game.log("收到学长捐助 ¥1500","[天降横财]")}},c2:{n:"婉拒捐款,让他传授经验",f:()=>{State.stu.forEach(s=>{s.st=M_M(0,s.st-15);Game.addM(s,'chi',3);Game.addM(s,'mat',3)});Game.log("学长分享了独门复习法","[全班微幅提升, 压力-]")}}}];let vs=evs.filter(e=>e.c(State));if(vs.length>0){window.currEv=vs[Math.floor(R()*vs.length)];UI.sCMod(window.currEv)}},
fTL(){State.ap=State.maxAp;State.money+=500+(State.stu.length*100);if(State.month===10&&State.week===1){this.log("🏃‍♂️ 全校秋季运动会召开!大家在赛场上尽情挥洒汗水!","[全员压力清空]");State.stu.forEach(s=>s.st=0);this.uUI();return}let wS=0;if(['cold','hot'].includes(State.weather.eff))wS=State.fac.ac===0?.10:(State.fac.ac===1?.05:0);State.stu.forEach(s=>{let hl=s.tl.some(t=>t.id==='t3')?8:4;s.st=M_M(0,s.st-hl);if(s.tl.some(t=>t.id==='n5'))s.st+=8;if(s.st>90&&R()>.7){let ns=CONFIG.TAL.filter(t=>t.t==='neg');let gT=ns[Math.floor(R()*ns.length)];if(!s.tl.some(x=>x.id===gT.id)){s.tl.push(gT);this.log(`⚠️ ${s.name} 心态崩溃了!`,`[负面: ${gT.n}]`)}}if(wS>0&&s.sk===0&&R()<wS){s.sk=4;this.log(`糟糕,${s.name} 因为天气原因病倒了!`,"[生病1个月]")}});this.tRE();this.uUI()},
uW(){State.season=SEASONS[State.month.toString()];let p=WEATHER_POOL[State.season];State.weather=p[Math.floor(R()*p.length)]},
gRR(sc){if(sc>=720)return 1;if(sc>=681)return Math.floor(1+158*Math.pow((720-sc)/39,2));const tb=[{s:681,r:159},{s:680,r:176},{s:650,r:1701},{s:600,r:11716},{s:550,r:32260},{s:500,r:62078},{s:450,r:91261},{s:400,r:112843},{s:350,r:126882},{s:300,r:134938},{s:250,r:138444},{s:200,r:139415},{s:180,r:139478},{s:0,r:140000}];for(let i=0;i<tb.length-1;i++){if(sc>=tb[i+1].s)return M_M(1,O(tb[i].r+((tb[i].s-sc)/(tb[i].s-tb[i+1].s))*(tb[i+1].r-tb[i].r)))}return 140000},
fEC(rI,cI,rw){let cl=$(`c-${rI}-${cI}`);if(!cl||cl.classList.contains('pop'))return;if(cI==='total'){cl.innerText=rw.total;cl.style.color="var(--danger)"}else if(cI==='rank'){cl.innerText=`第${rw.rank}名`;cl.style.color="var(--accent)"}else if(cI==='ev')cl.innerHTML=rw.evTxt||'-';else{let c=CONFIG.SUB.find(x=>x.id===cI).c;cl.innerText=rw.scores[cI];cl.style.background=UI.gSCol(rw.scores[cI],c);if(rw.scores[cI]/c>.65)cl.style.color='#fff'}cl.classList.add('pop')},
fES(rD,isM){if(this.examSettled)return;this.examSettled=!0;let rw=0,dt=[];rD.forEach(r=>{let p=0;if(r.rank===1){p=100000;if(!isM)this.log(`🎉 震惊!${r.name} 荣获全市理科状元!`,"[巨额奖金]")}else if(r.rank<=10)p=30000;else if(r.rank<=100)p=10000;else if(r.rank<=1000)p=5000;else if(r.rank<=5000)p=3000;else if(r.rank<=50000)p=1000;rw+=p;if(p>0)dt.push(`${r.name}+${p}`);if(!isM){r.ref.h.scores.push(r.total);r.ref.h.ranks.push(r.rank)}});if(!isM){let b=2000;State.money+=(rw+b);$('exam-rewards-txt').innerText=`🏆 保底补助¥2000。达标奖励¥${rw} (${dt.join(', ')||'无'})`;this.log(`大考结算:共获 ¥${rw+b}`,"[入账]")}$('exam-close-btn').classList.remove('hidden');$('exam-skip-btn').classList.add('hidden')},
pEx(fN="",isM=!1){const m=$('exam-modal');$('exam-title').innerText=fN||(State.month===9?"起点摸底":State.month===1?"一诊":State.month===3?"二诊":"月度联考");$('exam-rewards-txt').innerText=isM?"(本场为模拟考试,成绩不计入档案)":"";$('exam-close-btn').classList.add('hidden');m.classList.remove('hidden');const tb=$('exam-table');tb.innerHTML=`<tr><th>姓名</th>${CONFIG.SUB.map(s=>`<th>${s.n}</th>`).join('')}<th style=background:var(--danger)>总分</th><th style=background:var(--accent)>市排名</th><th style="width:250px;background:#f59e0b">考场动态</th></tr>`;let rD=State.stu.map(s=>{let o={name:s.name,scores:{},total:0,evTxt:"",ref:s},dp=s.tl.some(t=>t.id==='n3')?.9:1,sd=s.tl.some(t=>t.id==='t6')?0:1,sP=s.sk>0?.8:1;CONFIG.SUB.forEach(sub=>{let b=s.m[sub.id];if(sub.id==='chi'&&b>120)b=120+(b-120)*.1;let r=b*(1-(s.st/600))*dp*sP,pG=(b/sub.c)*.4,pB=(1-b/sub.c)*.4*(s.sk>0?2:1),rn=R();if(rn<pG){let eL=EXAM_EV[sub.id].filter(x=>x[1]>0),ev=eL[Math.floor(R()*eL.length)];o.evTxt+=`[${sub.n}]${ev[0]}(+${ev[1]})<br>`;r+=ev[1]}else if(rn>1-pB){let eL=EXAM_EV[sub.id].filter(x=>x[1]<0),ev=eL[Math.floor(R()*eL.length)];o.evTxt+=`[${sub.n}]${ev[0]}(${ev[1]})<br>`;r+=(ev[1]*(1-sd))}o.scores[sub.id]=M_M(0,M_N(sub.c,O(r)))});o.total=Object.values(o.scores).reduce((a,b)=>a+b,0);return o});rD.sort((a,b)=>b.total-a.total);for(let i=0;i<rD.length;i++){if(i>0&&rD[i].total===rD[i-1].total)rD[i].rank=rD[i-1].rank;else{let cl=this.gRR(rD[i].total);rD[i].rank=rD[i].total>=720?i+1:M_M(cl,i+1,(i>0?rD[i-1].rank+1:1))}}let cs=[...CONFIG.SUB.map(x=>x.id),'total','rank','ev'];rD.forEach((rw,rI)=>{let tr=document.createElement('tr');tr.innerHTML=`<td>${rw.name} ${rw.ref.sk>0?'🤒':''}</td>`;cs.forEach(c=>tr.innerHTML+=`<td id=c-${rI}-${c} class="exam-cell ${c==='ev'?'event-col':''}"></td>`);tb.appendChild(tr)});this.examSettled=!1;this.examTimeouts.forEach(clearTimeout);this.examTimeouts=[];let sB=$('exam-skip-btn');sB.classList.remove('hidden');sB.onclick=()=>{this.examTimeouts.forEach(clearTimeout);this.examTimeouts=[];rD.forEach((rw,rI)=>{cs.forEach(cI=>{let cl=$(`c-${rI}-${cI}`);if(cl)cl.style.animationDuration='.1s';this.fEC(rI,cI,rw)})});this.fES(rD,isM)};cs.forEach((cI,cIdx)=>{this.examTimeouts.push(setTimeout(()=>{rD.forEach((rw,rI)=>{this.examTimeouts.push(setTimeout(()=>{this.fEC(rI,cI,rw)},rI*100))});if(cIdx===cs.length-1)this.examTimeouts.push(setTimeout(()=>{this.fES(rD,isM)},rD.length*100+500))},cIdx*600))})},
sGK(){$('gaokao-modal')&&$('gaokao-modal').classList.add('hidden');this.pEx("全国统一高考 (重庆卷)");$('exam-close-btn').innerText="查看录取去向";$('exam-close-btn').onclick=()=>{State.isGraduated=!0;this.sEd()}},
sEd(){$('exam-modal').classList.add('hidden');$('ending-modal').classList.remove('hidden');let tS=0,cH="";State.stu.forEach((s,i)=>{let fS=s.h.scores[s.h.scores.length-1];tS+=fS;let tr=CONFIG.UNI.find(u=>fS>=u.min)||CONFIG.UNI[4],un=tr.list[Math.floor(R()*tr.list.length)];cH+=`<div class="cengfan-card animate-up g-cd1 g-flx" style="animation-delay:${i*.1}s;gap:12px"><div style=font-size:2em>📍</div><div><b style="font-size:1.1em;color:var(--primary)">${s.name}</b><br><span style="font-size:.9em;color:var(--accent);font-weight:bold">${un} (${fS}分)</span></div></div>`});$('ending-cengfan').innerHTML=cH;let aS=tS/State.stu.length;let pT=aS>=685?`均分 ${O(aS)}!全员清北!神级教练,你被直接提拔为校长!`:aS>=650?`均分 ${O(aS)}!全员C9!神仙班级再续辉煌,你晋升为副校长!`:aS>=600?`均分 ${O(aS)}!全员985!你获得了市级优秀教师称号,提拔为年级主任。`:aS>=500?`均分 ${O(aS)}!全员211!无一人掉队,你稳稳保住了班主任的职位。`:`均分 ${O(aS)}。未能带领大家全部突破211线,家长频频投诉,你遗憾被下放去教初中。`;$('ending-player').innerHTML=`<h3 style="margin-top:0;border-bottom:1px solid rgba(245,158,11,.3);padding-bottom:10px">你的执教评价</h3><p style="font-size:1.2em;color:var(--text);font-weight:bold">${pT}</p>`},
rTC(){$('ending-modal').classList.add('hidden');State.ap='INF';State.maxAp='INF';$('ui-ap').innerText='INF';$('ap-max-txt').innerText='';$('btn-next-turn').innerText='已毕业';$('btn-next-turn').disabled=!0;$('title-snack').innerText='🍢 同学请客吃小吃';$('cost-snack').innerText='免费 | AP: 0';$('title-hotpot').innerText='🍲 同学请客老火锅';$('cost-hotpot').innerText='免费 | AP: 0';$('cost-train').innerText='无法使用';$('graduated-actions').classList.remove('hidden');this.log("同学们已经毕业,班级里空空荡荡,但偶尔他们会回来看你。","[完结撒花]");this.uUI()},
eGK(){let tH=$('exam-table').innerHTML;let tm=`<!DOCTYPE html><html lang=zh-CN><head><meta charset=UTF-8><title>2026届 高考成绩单 - 班主任模拟器</title><style>body{background:radial-gradient(circle at 50% 0,#fef2f2,#f1f5f9);font-family:'Segoe UI',sans-serif;padding:40px;color:#1e293b;margin:0}.container{background:rgba(255,255,255,.95);border:2px solid #e2e8f0;border-radius:24px;padding:40px;box-shadow:0 20px 50px rgba(0,0,0,.1);max-width:1400px;margin:0 auto;backdrop-filter:blur(10px)}h1{color:#e63946;text-align:center;font-size:2.8em;margin:0 0 30px 0;letter-spacing:2px;text-shadow:0 2px 10px rgba(230,57,70,.2)}.exam-table{width:100%;border-collapse:separate;border-spacing:0;font-size:1.05em;border-radius:12px;overflow:hidden;box-shadow:0 10px 30px rgba(0,0,0,.05);background:rgba(255,255,255,.6)}.exam-table th,.exam-table td{padding:16px 10px;text-align:center;border-bottom:1px solid rgba(0,0,0,.05)}.exam-table th{background:linear-gradient(135deg,#1e293b,#334155);color:#fff;font-weight:bold;font-size:1.15em}.exam-cell{transform:translateY(15px);opacity:0;font-weight:bold}@keyframes pop{to{opacity:1;transform:translateY(0)}}.pop{animation:pop .5s ease-out forwards}.event-col{text-align:left!important;font-size:.85em;color:#ef4444;line-height:1.6}</style></head><body><div class=container><h1>🎓 2026届 高考成绩榜 🎓</h1><table class=exam-table>${tH}</table></div><script>window.onload=()=>{document.querySelectorAll('.exam-cell').forEach(c=>c.classList.remove('pop'));let r=document.querySelectorAll('tr'),d=0;for(let i=1;i<r.length;i++){r[i].querySelectorAll('.exam-cell').forEach(c=>setTimeout(()=>c.classList.add('pop'),d));d+=150}}<\/script></body></html>`;let a=document.createElement("a");a.href=URL.createObjectURL(new Blob([tm],{type:"text/html;charset=utf-8"}));a.download="2026届高考成绩单.html";a.click();this.log("已成功导出高考成绩单至本地。","[文件导出]")},
log(m,e=""){const a=$('log-area');a.innerHTML=`<div class=log-entry><span style="color:#94a3b8;font-size:.9em">[${State.year}届 ${State.month}月W${State.week}]</span> ${m} ${e?`<span class=log-eff>${e}</span>`:''}</div>`+a.innerHTML},
uUI(){let l=State.diff==='hard'?150:180,wL=l-30,skC=0,stC=0;for(let i=0;i<State.stu.length;i++){let s=State.stu[i];if(s.st>=l){alert(`【重大事故】${s.name} 压力达到 ${O(s.st)}%,承受不住选择了跳楼!\n\n发生严重校园安全事故,你的教师资格证被吊销,游戏强制结束。`);return location.reload()}if(s.sk>0)skC++;if(s.st>=wL)stC++}let bC=$('badge-classroom');if(bC){bC.innerHTML=`🤒 ${skC} 🤯 ${stC}`;bC.className=skC>0||stC>0?'status-badge danger':'status-badge'}$('ui-time').innerText=`${State.year}年 ${State.month}月 W${State.week}`;$('ui-money').innerText=State.money;if(!State.isGraduated){$('ui-ap').innerText=State.ap;$('ap-max-txt').innerText=`/${State.maxAp}`}$('ui-weather').innerText=State.weather.i;$('ui-weather-txt').innerText=State.weather.n;$('ui-season').innerText=State.season+"季";State.month===5&&State.year===2026?$('sprint-tag').classList.remove('hidden'):$('sprint-tag').classList.add('hidden');UI.rCls();UI.rFac();UI.rATbs()}};
const UI={tThm(){let isD=document.body.classList.toggle('dark-mode');localStorage.setItem('whk-thm',isD?'d':'l');$('theme-icon').innerHTML=isD?`<svg viewBox="0 0 24 24" width=22 height=22 stroke=currentColor stroke-width=2 fill=none stroke-linecap=round stroke-linejoin=round><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>`:`<svg viewBox="0 0 24 24" width=22 height=22 stroke=currentColor stroke-width=2 fill=none stroke-linecap=round stroke-linejoin=round><circle cx=12 cy=12 r=5></circle><line x1=12 y1=1 x2=12 y2=3></line><line x1=12 y1=21 x2=12 y2=23></line><line x1=4.22 y1=4.22 x2=5.64 y2=5.64></line><line x1=18.36 y1=18.36 x2=19.78 y2=19.78></line><line x1=1 y1=12 x2=3 y2=12></line><line x1=21 y1=12 x2=23 y2=12></line><line x1=4.22 y1=19.78 x2=5.64 y2=18.36></line><line x1=18.36 y1=5.64 x2=19.78 y2=4.22></line></svg>`},
sTab(id){$$('.panel-content').forEach(e=>{e.classList.remove('active');e.querySelectorAll('.animate-up').forEach(c=>{c.style.animation='none';c.offsetHeight;c.style.animation=null})});$$('.sidebar .tab-btn').forEach(e=>e.classList.remove('active'));$(`panel-${id}`).classList.add('active');event.target.classList.add('active')},
sMain(id){$('view-classroom').classList.add('hidden');$('view-archive').classList.add('hidden');$(`view-${id}`).classList.remove('hidden');$('btn-classroom').classList.remove('active');$('btn-archive').classList.remove('active');$(`btn-${id}`).classList.add('active');$(`view-${id}`).querySelectorAll('.animate-up').forEach(c=>{c.style.animation='none';c.offsetHeight;c.style.animation=null})},
tMnu(id){let e=$(id);e.classList.toggle('active')},hAM(){$$('.sub-menu').forEach(e=>e.classList.remove('active'))},cMod(id){$(id).classList.add('hidden')},
cExm(){$('exam-modal').classList.add('hidden');if(!State.isMockExam)Game.fTL();else{State.isMockExam=!1;Game.uUI()}},
sCMod(ev){$('choice-desc').innerText=ev.t;let b1=`<button class=btn-choice onclick=UI.hCh(1)>${ev.c1.n}</button>`,b2=`<button class=btn-choice onclick=UI.hCh(2)>${ev.c2.n}</button>`;$('choice-btns').innerHTML=R()>.5?b2+b1:b1+b2;$('choice-modal').classList.remove('hidden')},
hCh(id){UI.cMod('choice-modal');id===1?window.currEv.c1.f():window.currEv.c2.f();Game.uUI()},
sHPMod(){if(State.isGraduated)return Game.cHP();$('hotpot-modal').classList.remove('hidden')},
sDMod(){let ss=State.stu.map((s,i)=>({s,i})).filter(x=>x.s.sk>0);if(ss.length===0)return alert("当前没有学生生病!");$('doctor-list').innerHTML=ss.map(x=>`<div class="g-cd1 g-flx"><div><b style=color:var(--primary)>${x.s.name}</b> <span style="color:var(--danger);font-size:.85em;font-weight:bold">(病假剩余 ${x.s.sk} 周)</span></div><button style="padding:10px 20px;background:linear-gradient(135deg,var(--success),#047857);color:#fff" onclick=Game.healD(${x.i})>立刻治愈 (¥1000)</button></div>`).join('');$('doctor-modal').classList.remove('hidden')},
sWMod(){State.tempAlloc={chi:0,mat:0,eng:0,phy:0,che:0,bio:0};this.rWkAl();$('weekly-modal').classList.remove('hidden')},
rWkAl(){$('weekly-pts').innerText=3-Object.values(State.tempAlloc).reduce((a,b)=>a+b,0);$('weekly-alloc').innerHTML=CONFIG.SUB.map(sb=>`<div class="g-cd1 g-flx"><b style=color:var(--primary)>${sb.n}</b><div><button style="padding:4px 12px;background:var(--dash-bd)" onclick="UI.mWk('${sb.id}',-1)">-</button> <span style="display:inline-block;width:25px;text-align:center;font-weight:bold;color:var(--accent)">${State.tempAlloc[sb.id]}</span> <button style="padding:4px 12px;background:var(--accent);color:#fff" onclick="UI.mWk('${sb.id}',1)">+</button></div></div>`).join('')},
mWk(s,v){let u=Object.values(State.tempAlloc).reduce((a,b)=>a+b,0);if((v>0&&u>=3)||(v<0&&State.tempAlloc[s]<=0))return;State.tempAlloc[s]+=v;this.rWkAl()},
gSCol(v,c){let r=v/c;if(r>=.95)return 'linear-gradient(135deg,#a855f7,#7e22ce)';if(r>=.9)return 'linear-gradient(135deg,#fb7185,#e11d48)';if(r>=.8)return 'linear-gradient(135deg,#fb923c,#ea580c)';if(r>=.65)return 'linear-gradient(135deg,#4ade80,#16a34a)';if(r>=.5)return 'linear-gradient(135deg,#60a5fa,#2563eb)';return 'var(--bg-w-90)'},
gRTg(v,c){return(CONFIG.GRD.find(x=>(v/c)>=x.v/150)||CONFIG.GRD[9]).l},
rCls(){const ct=$('view-classroom');let l=State.diff==='hard'?150:180,wL=l-30;if(ct.children.length!==State.stu.length){ct.innerHTML=State.stu.map((s,i)=>`<div class="stu-card animate-up" id=stu-card-${i} style=animation-delay:${i*.1}s><div class=stu-header><span class=stu-name><span id=stu-name-txt-${i}>${s.name}</span><span id=stu-sick-${i} class=hidden style="font-size:.5em;background:var(--danger);color:#fff;padding:4px 8px;border-radius:6px;vertical-align:middle"></span></span><span style="font-size:.85em;font-weight:bold;color:var(--text-light);background:var(--sd-05);padding:4px 10px;border-radius:12px">预估: <span id=stu-est-${i} style=color:var(--accent)>0</span></span></div><div class=tag-pool id=stu-tags-${i}></div><div class=sub-grid id=stu-subs-${i}>${CONFIG.SUB.map(sb=>`<div class=sub-box><span class=sub-label>${sb.n}</span><div class=sub-val id=stu-sub-${i}-${sb.id}></div></div>`).join('')}</div><div style="font-size:.75em;margin-top:18px;display:flex;justify-content:space-between;font-weight:bold"><span style=color:var(--text-light)>心理防线</span> <span id=stu-stress-txt-${i}>0%</span></div><div class=stress-bar><div class=stress-fill id=stu-stress-bar-${i} style=width:0%></div></div></div>`).join('')}State.stu.forEach((s,i)=>{let cd=$(`stu-card-${i}`),nT=$(`stu-name-txt-${i}`),skE=$(`stu-sick-${i}`),stB=$(`stu-stress-bar-${i}`),isD=s.st>=wL,isH=s.st>100||isD;if(s.sk>0){cd.classList.add('sick');skE.innerText=`病假 ${s.sk}周`;skE.classList.remove('hidden')}else{cd.classList.remove('sick');skE.classList.add('hidden')}$(`stu-est-${i}`).innerText=O(Object.values(s.m).reduce((a,b)=>a+b,0));$(`stu-tags-${i}`).innerHTML=s.tl.map(t=>`<span class="tag ${t.t==='neg'?'tag-neg':'tag-pos'}" title="${t.d}">${t.n}</span>`).join('');CONFIG.SUB.forEach(sb=>{let el=$(`stu-sub-${i}-${sb.id}`),v=s.m[sb.id];el.className=(v/sb.c<.65)?'sub-val dark-text':'sub-val';el.innerText=this.gRTg(v,sb.c);el.style.background=this.gSCol(v,sb.c)});nT.style.color=isH?'var(--danger)':'';nT.style.textShadow=isH?'0 0 10px rgba(239,68,68,.4)':'';$(`stu-stress-txt-${i}`).innerText=`${O(s.st)}%`;$(`stu-stress-txt-${i}`).style.color=isH||s.st>85?'var(--danger)':'var(--primary)';stB.style.width=`${M_N(100,s.st)}%`;stB.style.background=s.st>85||isD?'linear-gradient(90deg,#f87171,#ef4444)':'linear-gradient(90deg,#818cf8,#4f46e5)';stB.style.boxShadow=s.st>85||isD?'0 0 10px rgba(239,68,68,.5)':'0 0 10px rgba(79,70,229,.5)';isD?(stB.classList.add('stress-blink'),nT.classList.add('stress-blink')):(stB.classList.remove('stress-blink'),nT.classList.remove('stress-blink'))})},
rFac(){$('fac-container').innerHTML=CONFIG.FAC.map((f,i)=>`<div class="g-cd2 animate-up g-flx" style=margin-bottom:12px;animation-delay:${i*.1}s><div><h4 style="margin:0;color:var(--primary);font-size:1.1em">${f.n} <span style="font-size:.8em;color:var(--accent);background:rgba(79,70,229,.1);padding:2px 6px;border-radius:6px">Lv.${State.fac[f.id]}</span></h4><p style="margin:8px 0 0 0;font-size:.8em;color:var(--text-light)">${f.d}</p></div><button style="padding:10px 18px;background:linear-gradient(135deg,var(--accent),#4338ca);color:#fff" ${State.fac[f.id]>=2?'disabled':''} onclick="Game.buyF('${f.id}')">${State.fac[f.id]>=2?'已满级':'¥'+f.p[State.fac[f.id]+1]}</button></div>`).join('')},
rATbs(){$('arc-tabs').innerHTML=State.stu.map((s,i)=>`<div class="arc-tab ${i===0?'active':''}" onclick="UI.sADtl(${i},this)">${s.name}</div>`).join('');if(State.stu.length>0)this.sADtl(0,document.querySelector('.arc-tab'))},
sADtl(i,el){$$('.arc-tab').forEach(e=>e.classList.remove('active'));if(el)el.classList.add('active');let s=State.stu[i];$('arc-detail').innerHTML=`<h2 style="margin-top:0;color:var(--primary);border-bottom:2px solid rgba(79,70,229,.2);padding-bottom:10px">${s.name} <span style="font-size:.5em;color:var(--text-light);font-weight:normal">核心档案</span></h2><h4 style=color:var(--text-light)>📊 总分历程 (满分750)</h4><div class=chart-container>${this.dBCht(s.h.scores,750,'var(--accent)')}</div><h4 style="color:var(--text-light);margin-top:25px">📈 排名历程 (市级)</h4><div class=chart-container>${this.dBCht(s.h.ranks,140000,'#6366f1',!0)}</div>`;$('arc-detail').classList.remove('animate-up');void $('arc-detail').offsetWidth;$('arc-detail').classList.add('animate-up')},
dBCht(dt,mV,c,r=!1){if(!dt||dt.length<1)return '<div style="width:100%;height:100%;display:flex;justify-content:center;align-items:center;color:var(--text-light);font-weight:bold;font-size:1.1em">暂无大考数据</div>';let tS=M_M(10,dt.length),bW=100/tS-3,h=`<svg viewBox="0 0 100 100" preserveAspectRatio=none style="width:100%;height:100%;overflow:visible">`;dt.forEach((v,i)=>{let hh=M_M(5,M_N(100,r?(1-v/mV)*100:(v/mV)*100));h+=`<rect x="${i*(100/tS)}" y="${100-hh}" width="${bW}" height="${hh}" fill="${c}" rx="1.5" style="filter:drop-shadow(0 -2px 4px ${c}88)"/><text x="${i*(100/tS)+bW/2}" y="${100-hh-3}" font-size="3.5" font-weight="bold" fill="var(--primary)" text-anchor="middle">${v}</text>`});return h+`</svg>`},
iNms(){$('import-input').click()},hFS(e){const f=e.target.files[0];if(!f)return;const rd=new FileReader();rd.onload=(ev)=>{const ls=ev.target.result.split(/\r?\n/);for(let i=0;i<6;i++)if(ls[i]!==undefined)$(`name-${i}`).value=ls[i].trim()};rd.readAsText(f)},
eNms(){let t="";for(let i=0;i<6;i++)t+=$(`name-${i}`).value.trim()+"\n";let a=document.createElement("a");a.href=URL.createObjectURL(new Blob([t],{type:"text/plain"}));a.download="student_names.txt";a.click()}};
Game.buyF=function(id){let f=CONFIG.FAC.find(x=>x.id===id),lv=State.fac[id],cs=f.p[lv+1];if(State.money>=cs){State.money-=cs;State.fac[id]++;this.uUI();this.log(`升级了:${f.n}`,`[资金-${cs}]`)}else alert("班费不足!")};
if(localStorage.getItem('whk-thm')==='d'){document.body.classList.add('dark-mode');$('theme-icon').innerHTML=`<svg viewBox="0 0 24 24" width=22 height=22 stroke=currentColor stroke-width=2 fill=none stroke-linecap=round stroke-linejoin=round><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>`;}
try{let sn=JSON.parse(localStorage.getItem('whk-names'));
const def=["Double10","_Sparktasia_","paper_","GoldSpade","xxxxxzy","_Communist"];
if(sn&&sn.length===6){for(let i=0;i<6;i++){if(sn[i]!==def[i]){$(`name-${i}`).value = sn[i];}}}}catch(e){}
</script></body></html>