Monday 爱豆生活
by ThunderPenguin58815 lines32.5 KB
```html
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<title>Monday 爱豆生活</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #0a0a0a;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
color: #fff;
}
#app {
width: 100%;
max-width: 420px;
height: 100vh;
max-height: 900px;
background: linear-gradient(145deg, #141414, #1a1a2e);
border-radius: 24px;
display: flex;
flex-direction: column;
overflow: hidden;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.8);
position: relative;
}
.status {
padding: 10px 16px 6px;
display: flex;
justify-content: space-between;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
flex-shrink: 0;
background: rgba(0, 0, 0, 0.2);
}
.header {
padding: 6px 16px 10px;
display: flex;
justify-content: space-between;
align-items: center;
flex-shrink: 0;
background: rgba(0, 0, 0, 0.15);
}
.header h1 {
font-size: 18px;
background: linear-gradient(135deg, #f7971e, #ffd200);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.stats {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 4px;
padding: 8px 12px;
background: rgba(0, 0, 0, 0.2);
border-bottom: 1px solid rgba(255, 255, 255, 0.04);
flex-shrink: 0;
font-size: 11px;
}
.stats .item {
background: rgba(255, 255, 255, 0.03);
border-radius: 8px;
padding: 4px 6px;
text-align: center;
}
.stats .item .val {
font-size: 15px;
font-weight: 700;
}
.stats .item .bar {
height: 3px;
background: rgba(255, 255, 255, 0.06);
border-radius: 2px;
margin-top: 2px;
overflow: hidden;
}
.stats .item .bar .fill {
height: 100%;
transition: width 0.4s;
}
.main {
flex: 1;
overflow-y: auto;
padding: 10px 14px 8px;
scroll-behavior: smooth;
}
.main::-webkit-scrollbar {
width: 3px;
}
.main::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.15);
border-radius: 10px;
}
.card {
background: rgba(255, 255, 255, 0.03);
border-radius: 12px;
padding: 12px 14px;
margin-bottom: 10px;
border: 1px solid rgba(255, 255, 255, 0.05);
animation: fade .4s;
}
@keyframes fade {
from {
opacity: 0;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.card .tit {
font-size: 12px;
font-weight: 600;
color: rgba(255, 255, 255, 0.7);
margin-bottom: 4px;
}
.card .txt {
font-size: 14px;
line-height: 1.7;
color: rgba(255, 255, 255, 0.8);
white-space: pre-wrap;
}
.hot {
background: rgba(255, 50, 50, 0.05);
border: 1px solid rgba(255, 50, 50, 0.1);
border-radius: 10px;
padding: 10px 14px;
margin-bottom: 10px;
}
.hot .row {
display: flex;
justify-content: space-between;
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
}
.hot .row .tag {
color: #ff6b6b;
}
.hot .item {
font-size: 13px;
padding: 2px 0;
color: rgba(255, 255, 255, 0.8);
}
.chat {
background: rgba(0, 200, 100, 0.04);
border: 1px solid rgba(0, 200, 100, 0.08);
border-radius: 10px;
padding: 10px 14px;
margin-bottom: 10px;
}
.chat .who {
font-size: 11px;
font-weight: 600;
color: rgba(255, 255, 255, 0.5);
}
.chat .bubble {
background: rgba(255, 255, 255, 0.06);
padding: 6px 12px;
border-radius: 10px;
display: inline-block;
font-size: 14px;
margin-top: 2px;
max-width: 90%;
}
.chat .bubble.self {
background: rgba(79, 172, 254, 0.2);
border: 1px solid rgba(79, 172, 254, 0.15);
}
.actions {
padding: 8px 12px 14px;
background: rgba(0, 0, 0, 0.3);
border-top: 1px solid rgba(255, 255, 255, 0.04);
flex-shrink: 0;
}
.actions .info {
font-size: 11px;
color: rgba(255, 255, 255, 0.3);
text-align: center;
margin-bottom: 6px;
}
.actions .grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 4px;
}
.actions .grid button {
background: rgba(255, 255, 255, 0.04);
border: 1px solid rgba(255, 255, 255, 0.06);
border-radius: 10px;
padding: 8px 2px;
color: rgba(255, 255, 255, 0.6);
font-size: 10px;
cursor: pointer;
transition: .2s;
font-family: inherit;
display: flex;
flex-direction: column;
align-items: center;
gap: 1px;
}
.actions .grid button:hover {
background: rgba(255, 255, 255, 0.08);
color: #fff;
}
.actions .grid button .icon {
font-size: 18px;
}
.actions .grid button.primary {
background: rgba(255, 215, 0, 0.1);
border-color: rgba(255, 215, 0, 0.15);
color: #ffd700;
}
.selector {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 30px 20px;
text-align: center;
}
.selector .logo {
font-size: 32px;
font-weight: 900;
background: linear-gradient(135deg, #f7971e, #ffd200);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.selector .sub {
font-size: 12px;
color: rgba(255, 255, 255, 0.3);
margin: 4px 0 20px;
}
.selector .grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 10px;
width: 100%;
max-width: 300px;
}
.selector .grid .item {
background: rgba(255, 255, 255, 0.04);
border-radius: 12px;
padding: 14px 8px;
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
transition: .2s;
}
.selector .grid .item:hover {
background: rgba(255, 255, 255, 0.08);
border-color: rgba(255, 215, 0, 0.2);
}
.selector .grid .item .emoji {
font-size: 32px;
}
.selector .grid .item .name {
font-weight: 600;
margin: 2px 0;
}
.selector .grid .item .cp {
font-size: 10px;
color: rgba(255, 215, 0, 0.5);
}
.hidden {
display: none !important;
}
.ending {
background: linear-gradient(135deg, rgba(255, 215, 0, 0.05), rgba(255, 50, 50, 0.05));
border: 2px solid rgba(255, 215, 0, 0.15);
border-radius: 14px;
padding: 20px;
text-align: center;
margin: 10px 0;
}
.ending .big {
font-size: 28px;
}
.ending .title {
font-size: 20px;
font-weight: 700;
color: #ffd700;
}
.ending .desc {
font-size: 14px;
color: rgba(255, 255, 255, 0.6);
line-height: 1.7;
margin-top: 4px;
}
.notification {
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background: rgba(0, 0, 0, 0.85);
backdrop-filter: blur(10px);
padding: 10px 20px;
border-radius: 12px;
font-size: 14px;
z-index: 999;
border: 1px solid rgba(255, 255, 255, 0.08);
animation: slide .4s;
max-width: 90%;
}
@keyframes slide {
from {
opacity: 0;
transform: translateX(-50%) translateY(-16px);
}
to {
opacity: 1;
transform: translateX(-50%) translateY(0);
}
}
@media (max-width:420px) {
#app {
border-radius: 0;
max-height: 100vh;
height: 100vh;
}
.stats {
grid-template-columns: repeat(3, 1fr);
gap: 2px;
padding: 4px 8px;
}
.actions .grid {
gap: 2px;
}
.actions .grid button {
font-size: 9px;
padding: 6px 2px;
}
}
</style>
</head>
<body>
<div id="app">
<!-- 选择界面 -->
<div id="selector" class="selector">
<div class="logo">Monday</div>
<div class="sub">✦ 爱豆生活 ✦</div>
<div class="grid" id="memberGrid">
<div class="item" data-id="0"><div class="emoji">🐱</div><div class="name">季灿</div><div class="cp">❤️ 纪澜沅</div></div>
<div class="item" data-id="1"><div class="emoji">🐏</div><div class="name">余升</div><div class="cp">❤️ 祝舟</div></div>
<div class="item" data-id="2"><div class="emoji">🐹</div><div class="name">纪澜沅</div><div class="cp">❤️ 季灿</div></div>
<div class="item" data-id="3"><div class="emoji">🦊</div><div class="name">祝舟</div><div class="cp">❤️ 余升</div></div>
</div>
</div>
<!-- 游戏界面 -->
<div id="game" class="hidden" style="display:flex;flex-direction:column;height:100%;">
<div class="status">
<span id="week">第 1 周</span>
<span id="phase">🌱 练习生</span>
<span id="day">Day 1/5</span>
</div>
<div class="header">
<h1>✦ Monday</h1>
<span id="memberTag" style="font-size:12px;color:rgba(255,255,255,0.6);background:rgba(255,255,255,0.05);padding:2px 12px;border-radius:12px;">季灿</span>
</div>
<div class="stats" id="stats">
<div class="item"><div class="val" id="sPop">35</div><div>人气</div><div class="bar"><div class="fill gold" id="bPop" style="width:35%"></div></div></div>
<div class="item"><div class="val" id="sStr">20</div><div>压力</div><div class="bar"><div class="fill pink" id="bStr" style="width:20%"></div></div></div>
<div class="item"><div class="val" id="sAff">25</div><div>好感</div><div class="bar"><div class="fill blue" id="bAff" style="width:25%"></div></div></div>
<div class="item"><div class="val" id="sStg">40</div><div>舞台</div><div class="bar"><div class="fill green" id="bStg" style="width:40%"></div></div></div>
<div class="item"><div class="val" id="sAnti">10</div><div>黑粉</div><div class="bar"><div class="fill red" id="bAnti" style="width:10%"></div></div></div>
<div class="item"><div class="val" id="sTeam">30</div><div>团亲</div><div class="bar"><div class="fill purple" id="bTeam" style="width:30%"></div></div></div>
</div>
<div class="main" id="main"></div>
<div class="actions">
<div class="info" id="actionInfo">本周剩余行动: 5</div>
<div class="grid">
<button data-act="practice"><span class="icon">🎵</span>练习</button>
<button data-act="social"><span class="icon">💬</span>社交</button>
<button data-act="rest"><span class="icon">😌</span>休息</button>
<button data-act="sns"><span class="icon">📱</span>SNS</button>
<button class="primary" data-act="next"><span class="icon">⏭</span>下一周</button>
</div>
</div>
</div>
</div>
<script>
// ==================== 数据 ====================
const M = [
{ id: 0, name: '季灿', emoji: '🐱', cp: 2 },
{ id: 1, name: '余升', emoji: '🐏', cp: 3 },
{ id: 2, name: '纪澜沅', emoji: '🐹', cp: 0 },
{ id: 3, name: '祝舟', emoji: '🦊', cp: 1 }
];
const EVENTS = {
trainee: [
{ id: 'e1', title: '月末评价', text: '你获得了A级评价,导师们纷纷称赞。', eff: { stage: 8, pop: 5, str: -5 } },
{ id: 'e2', title: '练习室偶遇', text: '深夜遇到{cp},你们相视一笑。', eff: { aff: 8, team: 3, str: -3 } },
{ id: 'e3', title: '私生跟踪', text: '你发现被私生饭跟踪,紧张地快步离开。', eff: { str: 15, anti: 5, pop: -2 } },
{ id: 'e4', title: '家人来电', text: '父母还是不赞成你当练习生,你有些失落。', eff: { str: 10, pop: -3 } },
{ id: 'e5', title: '宿舍夜谈', text: '你和{cp}聊到深夜,心更近了。', eff: { aff: 10, team: 5, str: -8 } },
{ id: 'e6', title: '站姐偷拍', text: '一张你打盹的照片火了,粉丝大呼可爱。', eff: { pop: 8, cpHeat: 3 } },
{ id: 'e7', title: '黑帖发酵', text: '匿名论坛有人黑你是“资源咖”,你感到压力。', eff: { anti: 12, str: 10, pop: -5 } },
{ id: 'e8', title: '队友安慰', text: '{cp}悄悄塞给你一张纸条:“加油!”', eff: { aff: 10, str: -10, team: 5 } },
],
debut: [
{ id: 'd1', title: '出道预告', text: '公司宣布Monday即将出道!', eff: { pop: 20, stage: 10, str: 15 } },
{ id: 'd2', title: '出道舞台', text: '聚光灯下,你梦想成真。', eff: { pop: 25, stage: 15, aff: 5 } },
{ id: 'd3', title: '初一位', text: '打歌获得一位,你们抱在一起流泪。', eff: { pop: 30, team: 10, str: -10 } },
{ id: 'd4', title: '绯闻风波', text: '媒体爆料你和{cp}的“恋情”,舆论炸了。', eff: { scandal: 25, pop: 10, str: 20, anti: 8 } },
{ id: 'd5', title: '品牌邀约', text: '你收到第一个个人代言邀请。', eff: { pop: 15, media: 10 } },
{ id: 'd6', title: '粉丝见面会', text: '台下满是Mod,你感到无比幸福。', eff: { pop: 12, team: 8, str: -5 } },
],
star: [
{ id: 's1', title: '年末大赏', text: 'Monday获得最佳男团奖!', eff: { pop: 35, team: 15, str: -10 } },
{ id: 's2', title: '世巡启程', text: '世界巡演第一站,你感慨万千。', eff: { pop: 20, stage: 10, aff: 5 } },
{ id: 's3', title: '恋情曝光', text: '私生拍到你与{cp}约会,全网爆了。', eff: { scandal: 50, pop: -15, str: 35, anti: 25 } },
{ id: 's4', title: '澄清发布会', text: '你亲自澄清,但有些东西已经变了。', eff: { scandal: -30, pop: 10, str: 5 } },
{ id: 's5', title: 'Vogue封面', text: '你登上Vogue Korea,成为时尚icon。', eff: { pop: 25, media: 20 } },
{ id: 's6', title: '毒唯大战', text: '你的毒唯和队友毒唯吵翻天。', eff: { anti: 15, str: 15, pop: -5 } },
{ id: 's7', title: 'CP官宣', text: '你在综艺上公开了和{cp}的关系。', eff: { aff: 30, cpHeat: 40, pop: -10, scandal: 20 } },
{ id: 's8', title: '顶流之路', text: '你成为二代男团顶流,全球代言人。', eff: { pop: 50, media: 30, stage: 20 } },
]
};
const HOT = {
trainee: ['#Monday练习生 神颜路透', '#JYJZ新男团 出道倒计时', '#月末评价 A级', '#CP粉扒糖', '#私生饭跟踪'],
debut: ['#Monday 出道舞台直拍', '#Monday 初一位', '#Monday 颜值暴击', '#Monday 绯闻疑云', '#Monday 品牌官宣'],
star: ['#Monday 年末大赏', '#Monday 世巡', '#Monday 恋情曝光', '#Monday Vogue封面', '#Monday 顶流']
};
const CHATS = [
{ who: '季灿', txt: '今晚练习到几点?我饿了。' },
{ who: '纪澜沅', txt: '再练一小时吧,新舞不熟。' },
{ who: '余升', txt: '我带了便当,谁要吃?' },
{ who: '祝舟', txt: '我要!饿死了。' },
{ who: 'cp', txt: '你睡了吗?我有点睡不着。' },
{ who: 'cp', txt: '今天谢谢你陪我。' },
{ who: 'cp', txt: '明天要不要一起去喝奶茶?' },
{ who: 'cp', txt: '我好像有点喜欢你。' },
];
// ==================== 状态 ====================
let S = {
pid: -1,
week: 1,
day: 1,
phase: 'trainee',
actions: 5,
pop: 35,
str: 20,
aff: 25,
stg: 40,
anti: 10,
team: 30,
media: 30,
cpHeat: 10,
scandal: 5,
triggered: [],
ended: false
};
// ==================== DOM ====================
const $ = id => document.getElementById(id);
const main = $('main');
const selector = $('selector');
const game = $('game');
// ==================== 工具 ====================
const rand = (a, b) => Math.floor(Math.random() * (b - a + 1)) + a;
const pick = arr => arr[rand(0, arr.length - 1)];
const clamp = (v, min, max) => Math.max(min, Math.min(max, v));
function fmt(text, cpName) {
return text.replace(/\{cp\}/g, cpName);
}
// ==================== 通知 ====================
let notiTimer;
function noti(msg, dur = 2000) {
const old = document.querySelector('.notification');
if (old) old.remove();
const div = document.createElement('div');
div.className = 'notification';
div.textContent = msg;
document.body.appendChild(div);
clearTimeout(notiTimer);
notiTimer = setTimeout(() => div.remove(), dur);
}
// ==================== 渲染 ====================
function updateUI() {
['pop', 'str', 'aff', 'stg', 'anti', 'team'].forEach(k => {
const el = $('s' + k.charAt(0).toUpperCase() + k.slice(1));
if (el) el.textContent = Math.round(S[k]);
const bar = $('b' + k.charAt(0).toUpperCase() + k.slice(1));
if (bar) bar.style.width = clamp(S[k], 0, 100) + '%';
});
$('week').textContent = `第 ${S.week} 周`;
$('day').textContent = `Day ${S.day}/5`;
const phases = { trainee: '🌱 练习生', debut: '🌟 出道', star: '👑 顶流' };
$('phase').textContent = phases[S.phase] || '🌱 练习生';
$('actionInfo').textContent = `本周剩余行动: ${S.actions}`;
if (S.pid >= 0) {
const p = M[S.pid];
$('memberTag').textContent = p.name;
}
}
function addCard(title, text, cls = '') {
const div = document.createElement('div');
div.className = 'card ' + cls;
div.innerHTML = `<div class="tit">${title}</div><div class="txt">${text}</div>`;
main.appendChild(div);
main.scrollTop = main.scrollHeight;
}
function addHot(items) {
const div = document.createElement('div');
div.className = 'hot';
let html = `<div class="row"><span>🔥 实时热搜</span><span class="tag">LIVE</span></div>`;
items.forEach((t, i) => {
html += `<div class="item">${i+1}. ${t}</div>`;
});
div.innerHTML = html;
main.appendChild(div);
}
function addChat(who, txt, self = false) {
const div = document.createElement('div');
div.className = 'chat';
const label = self ? '你' : who;
const cls = self ? 'self' : '';
div.innerHTML = `<div class="who">${label}</div><div class="bubble ${cls}">${txt}</div>`;
main.appendChild(div);
}
function addEnding(title, sub, desc) {
const div = document.createElement('div');
div.className = 'ending';
div.innerHTML = `<div class="big">🎬</div><div class="title">${title}</div><div style="color:rgba(255,255,255,0.6);margin:4px 0;">${sub}</div><div class="desc">${desc}</div>`;
main.appendChild(div);
S.ended = true;
}
// ==================== 事件触发 ====================
function triggerEvent() {
const pool = EVENTS[S.phase] || EVENTS.trainee;
const avail = pool.filter(e => !S.triggered.includes(e.id));
if (!avail.length) return null;
const evt = pick(avail);
S.triggered.push(evt.id);
const cp = M[M[S.pid].cp];
const text = fmt(evt.text, cp.name);
addCard(`📌 ${evt.title}`, text);
if (evt.eff) {
const e = evt.eff;
if (e.pop) S.pop = clamp(S.pop + e.pop, 0, 100);
if (e.str) S.str = clamp(S.str + e.str, 0, 100);
if (e.aff) S.aff = clamp(S.aff + e.aff, 0, 100);
if (e.stage) S.stg = clamp(S.stg + e.stage, 0, 100);
if (e.anti) S.anti = clamp(S.anti + e.anti, 0, 100);
if (e.team) S.team = clamp(S.team + e.team, 0, 100);
if (e.cpHeat) S.cpHeat = clamp(S.cpHeat + e.cpHeat, 0, 100);
if (e.media) S.media = clamp(S.media + e.media, 0, 100);
if (e.scandal) S.scandal = clamp(S.scandal + e.scandal, 0, 100);
}
updateUI();
return evt;
}
// ==================== 行动 ====================
function doAction(act) {
if (S.ended) { noti('游戏已结束,点击「下一周」重新开始'); return; }
if (S.actions <= 0) { noti('本周行动已用完'); return; }
S.actions--;
const cp = M[M[S.pid].cp];
let msg = '';
switch (act) {
case 'practice':
const g = rand(3, 8);
S.stg = clamp(S.stg + g, 0, 100);
S.str = clamp(S.str + rand(2, 5), 0, 100);
S.pop = clamp(S.pop + rand(1, 3), 0, 100);
msg = `你练习了数小时,舞台 +${g}。`;
break;
case 'social':
const a = rand(4, 10);
S.aff = clamp(S.aff + a, 0, 100);
S.team = clamp(S.team + rand(2, 5), 0, 100);
S.str = clamp(S.str - rand(2, 4), 0, 100);
msg = `你和${cp.name}共度时光,好感 +${a}。`;
// 随机聊天
const c = pick(CHATS);
const who = c.who === 'cp' ? cp.name : c.who;
const txt = fmt(c.txt, cp.name);
setTimeout(() => addChat(who, txt, Math.random() > 0.6), 300);
break;
case 'rest':
const r = rand(5, 12);
S.str = clamp(S.str - r, 0, 100);
S.pop = clamp(S.pop - rand(1, 3), 0, 100);
msg = `你休息了,压力 -${r}。`;
break;
case 'sns':
const p = rand(3, 8);
S.pop = clamp(S.pop + p, 0, 100);
S.str = clamp(S.str + rand(1, 3), 0, 100);
S.anti = clamp(S.anti + rand(0, 2), 0, 100);
msg = `你发了动态,人气 +${p}。`;
// 热搜
const hotList = HOT[S.phase] || HOT.trainee;
const selected = [];
for (let i = 0; i < 3; i++) {
const t = pick(hotList);
if (!selected.includes(t)) selected.push(t);
}
setTimeout(() => addHot(selected), 400);
break;
default:
return;
}
addCard(`🎯 ${act === 'practice' ? '练习' : act === 'social' ? '社交' : act === 'rest' ? '休息' : 'SNS'}`, msg);
// 随机事件
if (Math.random() < 0.3) {
setTimeout(triggerEvent, 500);
}
// 压力警告
if (S.str > 80) {
addCard('⚠️ 高压', '压力过高,注意休息!', '');
if (S.str > 90) {
S.stg = clamp(S.stg - 5, 0, 100);
addCard('💔 舞台失误', '压力导致练习出错。', '');
}
}
// 好感进展
if (S.aff > 70 && S.aff < 75) {
addCard('💗 暧昧', `你和${cp.name}的关系越来越微妙。`, '');
}
if (S.aff > 85) {
addCard('❤️ 心意相通', `你确定了自己的心意,${cp.name}也是。`, '');
}
// 黑粉警告
if (S.anti > 70) {
addCard('🌪️ 黑粉风暴', '网络恶评增多,你感到窒息。', '');
}
updateUI();
if (S.actions <= 0) {
setTimeout(() => noti('行动用完,点击「下一周」'), 500);
}
}
// ==================== 下一周 ====================
function nextWeek() {
if (S.ended) {
// 重置
S.week = 1;
S.day = 1;
S.phase = 'trainee';
S.actions = 5;
S.pop = 35;
S.str = 20;
S.aff = 25;
S.stg = 40;
S.anti = 10;
S.team = 30;
S.media = 30;
S.cpHeat = 10;
S.scandal = 5;
S.triggered = [];
S.ended = false;
main.innerHTML = '';
const p = M[S.pid];
addCard('🎬 新的开始', `你是 ${p.name},重新出发。`);
updateUI();
noti('重新开始!', 1500);
return;
}
// 周变化
const changes = [
{ label: '人气', v: rand(-3, 5) },
{ label: '压力', v: rand(-3, 5) },
{ label: '好感', v: rand(-2, 4) },
{ label: '舞台', v: rand(-2, 4) },
{ label: '黑粉', v: rand(-1, 3) },
{ label: '团亲', v: rand(-2, 4) }
];
changes.forEach(c => {
const k = c.label === '人气' ? 'pop' : c.label === '压力' ? 'str' : c.label === '好感' ? 'aff' :
c.label === '舞台' ? 'stg' : c.label === '黑粉' ? 'anti' : 'team';
S[k] = clamp(S[k] + c.v, 0, 100);
});
// 显示总结
let sumHtml = '本周数值变化:<br>';
changes.forEach(c => {
const sign = c.v > 0 ? '+' : '';
sumHtml += `${c.label}: ${sign}${c.v} `;
});
addCard('📋 周总结', sumHtml);
// 触发事件
setTimeout(triggerEvent, 300);
// 热搜
setTimeout(() => {
const hotList = HOT[S.phase] || HOT.trainee;
const sel = [];
for (let i = 0; i < 3; i++) {
const t = pick(hotList);
if (!sel.includes(t)) sel.push(t);
}
addHot(sel);
}, 600);
// 聊天
setTimeout(() => {
const c = pick(CHATS);
const cp = M[M[S.pid].cp];
const who = c.who === 'cp' ? cp.name : c.who;
addChat(who, fmt(c.txt, cp.name), false);
}, 800);
S.week++;
S.day = 1;
S.actions = 5;
// 阶段推进
if (S.week === 8) { S.phase = 'debut';
addCard('🌟 出道倒计时', 'Monday即将出道!', '');
noti('🎉 进入出道阶段!', 2000); }
if (S.week === 16) { S.phase = 'star';
addCard('👑 顶流之路', '你们已经站在了巅峰。', '');
noti('🏆 进入顶流阶段!', 2000); }
// 结局检查
checkEnding();
updateUI();
setTimeout(() => main.scrollTop = main.scrollHeight, 100);
}
// ==================== 结局 ====================
function checkEnding() {
const cp = M[M[S.pid].cp];
if (S.aff > 80 && S.pop > 70 && S.stg > 70 && S.str < 40) {
addEnding('💖 顶流情侣', `你和${cp.name}爱情事业双丰收。`, '你们公开恋情,收获祝福,携手走过每个舞台。');
} else if (S.pop > 85 && S.stg > 80 && S.aff < 50) {
addEnding('🏆 事业巅峰', '你站在了顶端,但感情空缺。', '你拥有了一切,却少了一个能分享喜悦的人。');
} else if (S.anti > 80 && S.str > 80 && S.pop < 30) {
addEnding('🌪️ 舆论漩涡', '黑粉和压力压垮了你。', '你选择暂停活动,在朋友陪伴下找回自己。');
} else if (S.aff > 60 && S.str < 30 && S.pop < 50) {
addEnding('🌸 平凡幸福', `你和${cp.name}过上了简单的生活。`, '你们没有成为顶流,但拥有了彼此。');
} else if (S.team > 80 && S.aff > 60 && S.pop > 50) {
addEnding('🤝 团魂永存', 'Monday的成员永远是一家人。', '你们是队友,更是家人,彼此支持前行。');
} else if (S.week > 25) {
addEnding('🔄 未完待续', '你的故事还在继续...', '娱乐圈的路还很长,继续前进吧。');
}
}
// ==================== 初始化 ====================
function initGame(id) {
S.pid = id;
const p = M[id];
selector.classList.add('hidden');
game.classList.remove('hidden');
game.style.display = 'flex';
$('memberTag').textContent = p.name;
addCard('🎬 序幕', `你是 ${p.name},${p.emoji} 练习生。你的CP是 ${M[p.cp].name}。`);
addCard('📖 指南', '每周5次行动,提升数值,触发事件,走向专属结局。');
updateUI();
noti('🎵 欢迎来到 Monday 爱豆生活!', 2000);
}
// 选择事件
document.querySelectorAll('#memberGrid .item').forEach(el => {
el.addEventListener('click', () => {
const id = parseInt(el.dataset.id);
initGame(id);
});
});
// 行动按钮
document.querySelectorAll('[data-act]').forEach(btn => {
btn.addEventListener('click', () => {
const act = btn.dataset.act;
if (act === 'next') nextWeek();
else doAction(act);
});
});
console.log('🎵 Monday 爱豆生活 简洁版已启动');
</script>
</body>
</html>
```
---
Game Source: Monday 爱豆生活
Creator: ThunderPenguin58
Libraries: none
Complexity: complex (815 lines, 32.5 KB)
The full source code is displayed above on this page.
Remix Instructions
To remix this game, copy the source code above and modify it. Add a ARCADELAB header at the top with "remix_of: monday-thunderpenguin58" to link back to the original. Then publish at arcadelab.ai/publish.