🎮ArcadeLab

Monday 爱豆生活

by ThunderPenguin58
815 lines32.5 KB
▶ Play


```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.