| <html lang="zh-CN"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> | |
| <title>嫂子模拟器</title> | |
| <style> | |
| * { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; } | |
| body { | |
| font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; | |
| background: linear-gradient(135deg, #fff5f8 0%, #ffe8f0 25%, #fff0f5 50%, #ffeef4 75%, #fff5f8 100%); | |
| min-height: 100vh; | |
| display: flex; | |
| justify-content: center; | |
| padding: 15px; | |
| background-attachment: fixed; | |
| } | |
| .phone { | |
| width: 100%; | |
| max-width: 380px; | |
| background: linear-gradient(145deg, #ffffff 0%, #fff5f8 100%); | |
| border-radius: 40px; | |
| padding: 15px; | |
| box-shadow: | |
| 0 25px 80px rgba(255, 105, 180, 0.2), | |
| 0 10px 30px rgba(255, 182, 193, 0.3), | |
| inset 0 2px 10px rgba(255, 255, 255, 0.8); | |
| border: 2px solid rgba(255, 192, 203, 0.5); | |
| } | |
| .phone-screen { | |
| background: linear-gradient(180deg, #ffffff 0%, #fffafb 100%); | |
| border-radius: 32px; | |
| overflow: hidden; | |
| height: 100%; | |
| min-height: 680px; | |
| position: relative; | |
| box-shadow: inset 0 2px 15px rgba(255, 182, 193, 0.1); | |
| } | |
| .status-bar { | |
| background: linear-gradient(180deg, #fff5f8 0%, #ffffff 100%); | |
| padding: 14px 22px; | |
| display: flex; | |
| justify-content: space-between; | |
| font-size: 14px; | |
| font-weight: 600; | |
| color: #ff69b4; | |
| border-bottom: 1px solid rgba(255, 182, 193, 0.2); | |
| } | |
| .app-container { | |
| height: calc(100vh - 100px); | |
| min-height: 600px; | |
| overflow-y: auto; | |
| } | |
| /* 底部导航 - 淡粉色ins风 */ | |
| .bottom-nav { | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| background: linear-gradient(180deg, #ffffff 0%, #fff5f8 100%); | |
| display: flex; | |
| border-top: 2px solid rgba(255, 182, 193, 0.3); | |
| padding: 12px 0; | |
| backdrop-filter: blur(10px); | |
| } | |
| .nav-item { | |
| flex: 1; | |
| text-align: center; | |
| cursor: pointer; | |
| padding: 8px 5px; | |
| transition: all 0.3s ease; | |
| border-radius: 15px; | |
| margin: 0 5px; | |
| } | |
| .nav-item:hover { | |
| background: rgba(255, 182, 193, 0.15); | |
| transform: translateY(-3px); | |
| } | |
| .nav-item.active .nav-icon { | |
| color: #ff69b4; | |
| transform: scale(1.15); | |
| } | |
| .nav-icon { | |
| font-size: 26px; | |
| color: #ffb6c1; | |
| transition: all 0.3s ease; | |
| } | |
| .nav-label { | |
| font-size: 11px; | |
| color: #ff9eb5; | |
| margin-top: 4px; | |
| font-weight: 500; | |
| } | |
| .nav-item.active .nav-label { | |
| color: #ff69b4; | |
| font-weight: 600; | |
| } | |
| /* 首页 - 淡粉色ins风 */ | |
| .home-page { padding: 25px 20px; } | |
| .profile-header { | |
| background: linear-gradient(135deg, #ffb6c1 0%, #ff69b4 50%, #ff1493 100%); | |
| color: white; | |
| padding: 35px 25px; | |
| border-radius: 25px; | |
| text-align: center; | |
| margin-bottom: 25px; | |
| box-shadow: | |
| 0 10px 40px rgba(255, 105, 180, 0.3), | |
| inset 0 2px 10px rgba(255, 255, 255, 0.3); | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .profile-header::before { | |
| content: ''; | |
| position: absolute; | |
| top: -50%; | |
| left: -50%; | |
| width: 200%; | |
| height: 200%; | |
| background: radial-gradient(circle, rgba(255,255,255,0.15) 0%, transparent 70%); | |
| animation: shimmer 3s ease-in-out infinite; | |
| } | |
| @keyframes shimmer { | |
| 0%, 100% { transform: rotate(0deg); } | |
| 50% { transform: rotate(180deg); } | |
| } | |
| .avatar { | |
| width: 90px; | |
| height: 90px; | |
| border-radius: 50%; | |
| background: linear-gradient(135deg, #fff5f8 0%, #ffffff 100%); | |
| margin: 0 auto 15px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 42px; | |
| cursor: pointer; | |
| transition: all 0.3s ease; | |
| overflow: hidden; | |
| border: 4px solid rgba(255, 255, 255, 0.8); | |
| box-shadow: 0 8px 25px rgba(255, 105, 180, 0.3); | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .avatar:hover { | |
| transform: scale(1.08) rotate(5deg); | |
| box-shadow: 0 12px 35px rgba(255, 105, 180, 0.4); | |
| } | |
| .avatar img { | |
| width: 100%; | |
| height: 100%; | |
| object-fit: cover; | |
| } | |
| .player-name { | |
| font-size: 26px; | |
| font-weight: 800; | |
| margin-bottom: 8px; | |
| text-shadow: 0 2px 10px rgba(0,0,0,0.1); | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .player-title { | |
| font-size: 15px; | |
| opacity: 0.95; | |
| margin-bottom: 20px; | |
| font-weight: 500; | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .stats-row { | |
| display: flex; | |
| justify-content: space-around; | |
| background: rgba(255,255,255,0.25); | |
| backdrop-filter: blur(10px); | |
| border-radius: 20px; | |
| padding: 18px 15px; | |
| position: relative; | |
| z-index: 1; | |
| border: 1px solid rgba(255,255,255,0.3); | |
| } | |
| .stat-item { | |
| text-align: center; | |
| flex: 1; | |
| } | |
| .stat-value { | |
| font-size: 22px; | |
| font-weight: 800; | |
| text-shadow: 0 2px 8px rgba(0,0,0,0.1); | |
| } | |
| .stat-name { font-size: 12px; opacity: 0.9; } | |
| .quick-actions { | |
| display: grid; | |
| grid-template-columns: repeat(2, 1fr); | |
| gap: 18px; | |
| margin-bottom: 25px; | |
| } | |
| .action-card { | |
| background: linear-gradient(145deg, #ffffff 0%, #fff8fa 100%); | |
| border-radius: 20px; | |
| padding: 22px 15px; | |
| text-align: center; | |
| box-shadow: | |
| 0 8px 25px rgba(255, 182, 193, 0.25), | |
| inset 0 2px 5px rgba(255, 255, 255, 0.8); | |
| cursor: pointer; | |
| transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); | |
| border: 2px solid rgba(255, 182, 193, 0.2); | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .action-card::before { | |
| content: ''; | |
| position: absolute; | |
| top: 0; | |
| left: -100%; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent); | |
| transition: left 0.5s; | |
| } | |
| .action-card:hover { | |
| transform: translateY(-5px) scale(1.02); | |
| box-shadow: | |
| 0 15px 40px rgba(255, 105, 180, 0.35), | |
| inset 0 2px 5px rgba(255, 255, 255, 0.8); | |
| border-color: rgba(255, 105, 180, 0.4); | |
| } | |
| .action-card:hover::before { | |
| left: 100%; | |
| } | |
| .action-card:active { | |
| transform: translateY(-2px) scale(0.98); | |
| } | |
| .action-icon { | |
| font-size: 36px; | |
| margin-bottom: 12px; | |
| display: block; | |
| filter: drop-shadow(0 2px 8px rgba(255, 105, 180, 0.3)); | |
| } | |
| .action-title { | |
| font-size: 15px; | |
| font-weight: 700; | |
| color: #ff69b4; | |
| } | |
| .action-desc { | |
| font-size: 12px; | |
| color: #ff9eb5; | |
| margin-top: 6px; | |
| font-weight: 500; | |
| } | |
| /* 私信页面 */ | |
| .dm-page { padding-bottom: 70px; } | |
| .dm-header { | |
| background: white; | |
| padding: 15px 20px; | |
| border-bottom: 1px solid #e0e0e0; | |
| position: sticky; | |
| top: 0; | |
| z-index: 10; | |
| } | |
| .dm-title { font-size: 18px; font-weight: bold; } | |
| .dm-count { font-size: 12px; color: #ff6b6b; margin-top: 5px; } | |
| .message-list { padding: 10px; } | |
| .message-item { | |
| background: white; | |
| border-radius: 15px; | |
| padding: 15px; | |
| margin-bottom: 10px; | |
| box-shadow: 0 2px 8px rgba(0,0,0,0.06); | |
| cursor: pointer; | |
| } | |
| .message-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 8px; | |
| } | |
| .sender-avatar { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: 50%; | |
| background: #ff6b6b; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 18px; | |
| } | |
| .sender-name { font-weight: 600; font-size: 14px; flex: 1; margin-left: 10px; } | |
| .message-time { font-size: 12px; color: #999; } | |
| .message-preview { | |
| font-size: 13px; | |
| color: #666; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| padding-left: 50px; | |
| } | |
| .unread-badge { | |
| background: #ff6b6b; | |
| color: white; | |
| font-size: 10px; | |
| padding: 2px 6px; | |
| border-radius: 10px; | |
| margin-left: auto; | |
| } | |
| /* 聊天界面 */ | |
| .chat-page { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: #f5f5f5; z-index: 100; } | |
| .chat-header { | |
| background: white; | |
| padding: 15px 20px; | |
| border-bottom: 1px solid #e0e0e0; | |
| display: flex; | |
| align-items: center; | |
| } | |
| .back-btn { | |
| font-size: 24px; | |
| cursor: pointer; | |
| margin-right: 15px; | |
| } | |
| .chat-content { | |
| height: calc(100vh - 180px); | |
| overflow-y: auto; | |
| padding: 15px; | |
| } | |
| .chat-bubble { | |
| max-width: 75%; | |
| padding: 12px 15px; | |
| border-radius: 18px; | |
| margin-bottom: 12px; | |
| font-size: 14px; | |
| line-height: 1.5; | |
| } | |
| .chat-bubble.theirs { | |
| background: white; | |
| margin-right: auto; | |
| border-bottom-left-radius: 5px; | |
| } | |
| .chat-bubble.mine { | |
| background: #ff6b6b; | |
| color: white; | |
| margin-left: auto; | |
| border-bottom-right-radius: 5px; | |
| } | |
| .chat-input-area { | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| right: 0; | |
| background: white; | |
| padding: 15px; | |
| border-top: 1px solid #e0e0e0; | |
| display: flex; | |
| gap: 10px; | |
| } | |
| .chat-input { | |
| flex: 1; | |
| border: 1px solid #e0e0e0; | |
| border-radius: 20px; | |
| padding: 10px 15px; | |
| font-size: 14px; | |
| outline: none; | |
| } | |
| .send-btn { | |
| background: #ff6b6b; | |
| color: white; | |
| border: none; | |
| padding: 10px 20px; | |
| border-radius: 20px; | |
| font-size: 14px; | |
| cursor: pointer; | |
| } | |
| .quick-replies { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| padding: 10px 15px; | |
| background: white; | |
| border-top: 1px solid #f0f0f0; | |
| } | |
| .quick-reply { | |
| background: #f0f0f0; | |
| padding: 6px 12px; | |
| border-radius: 15px; | |
| font-size: 12px; | |
| cursor: pointer; | |
| color: #333; | |
| } | |
| /* 微信页面 */ | |
| .wechat-page { padding-bottom: 70px; } | |
| .wechat-header { | |
| background: #ededed; | |
| padding: 15px 20px; | |
| border-bottom: 1px solid #dcdcdc; | |
| } | |
| .wechat-title { font-size: 17px; font-weight: 600; text-align: center; } | |
| .chat-list { background: white; } | |
| .chat-item { | |
| display: flex; | |
| padding: 15px; | |
| border-bottom: 1px solid #f0f0f0; | |
| cursor: pointer; | |
| } | |
| .chat-avatar { | |
| width: 48px; | |
| height: 48px; | |
| border-radius: 8px; | |
| margin-right: 12px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 24px; | |
| } | |
| .chat-info { flex: 1; } | |
| .chat-name { font-size: 16px; font-weight: 500; margin-bottom: 5px; } | |
| .chat-preview { font-size: 13px; color: #999; } | |
| .chat-time { font-size: 12px; color: #bbb; } | |
| /* 微博页面 */ | |
| .weibo-page { padding-bottom: 70px; } | |
| .weibo-header { | |
| background: white; | |
| padding: 15px 20px; | |
| border-bottom: 1px solid #e0e0e0; | |
| position: sticky; | |
| top: 0; | |
| z-index: 10; | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .post-btn { | |
| background: #ff6b6b; | |
| color: white; | |
| padding: 8px 15px; | |
| border-radius: 20px; | |
| font-size: 14px; | |
| cursor: pointer; | |
| } | |
| .weibo-list { padding: 10px; } | |
| .weibo-card { | |
| background: white; | |
| border-radius: 12px; | |
| padding: 15px; | |
| margin-bottom: 10px; | |
| } | |
| .weibo-user { display: flex; align-items: center; margin-bottom: 10px; } | |
| .weibo-avatar { | |
| width: 40px; | |
| height: 40px; | |
| border-radius: 50%; | |
| margin-right: 10px; | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| } | |
| .weibo-name { font-weight: 600; font-size: 14px; } | |
| .weibo-time { font-size: 12px; color: #999; } | |
| .weibo-content { font-size: 14px; line-height: 1.6; margin-bottom: 15px; } | |
| .weibo-actions { | |
| display: flex; | |
| justify-content: space-around; | |
| border-top: 1px solid #f0f0f0; | |
| padding-top: 10px; | |
| } | |
| .weibo-action { | |
| display: flex; | |
| align-items: center; | |
| gap: 5px; | |
| font-size: 13px; | |
| color: #666; | |
| cursor: pointer; | |
| } | |
| .comment-section { | |
| margin-top: 15px; | |
| padding-top: 15px; | |
| border-top: 1px solid #f0f0f0; | |
| } | |
| .comment-item { | |
| display: flex; | |
| margin-bottom: 12px; | |
| } | |
| .comment-avatar { | |
| width: 30px; | |
| height: 30px; | |
| border-radius: 50%; | |
| background: #ff6b6b; | |
| margin-right: 10px; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| color: white; | |
| font-size: 14px; | |
| } | |
| .comment-content { flex: 1; } | |
| .comment-user { font-size: 12px; font-weight: 600; color: #ff6b6b; margin-bottom: 3px; } | |
| .comment-text { font-size: 13px; color: #333; } | |
| .comment-reply { | |
| font-size: 12px; | |
| color: #0066cc; | |
| margin-top: 3px; | |
| cursor: pointer; | |
| } | |
| /* 剧情页面 */ | |
| .story-page { padding: 20px; padding-bottom: 80px; } | |
| .story-card { | |
| background: white; | |
| border-radius: 15px; | |
| padding: 20px; | |
| box-shadow: 0 4px 15px rgba(0,0,0,0.1); | |
| margin-bottom: 20px; | |
| } | |
| .story-title { | |
| font-size: 18px; | |
| font-weight: bold; | |
| margin-bottom: 15px; | |
| color: #333; | |
| } | |
| .story-content { | |
| font-size: 14px; | |
| line-height: 1.8; | |
| color: #555; | |
| margin-bottom: 20px; | |
| } | |
| .option-list { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 12px; | |
| } | |
| .story-option { | |
| background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); | |
| border: 2px solid #e0e0e0; | |
| border-radius: 12px; | |
| padding: 15px; | |
| cursor: pointer; | |
| transition: all 0.3s; | |
| font-size: 14px; | |
| color: #333; | |
| } | |
| .story-option:hover { | |
| border-color: #ff6b6b; | |
| background: linear-gradient(135deg, #fff5f5 0%, #ffe0e0 100%); | |
| transform: translateX(5px); | |
| } | |
| .story-result { | |
| background: #fff3cd; | |
| border-left: 4px solid #ffc107; | |
| padding: 15px; | |
| border-radius: 8px; | |
| margin-top: 20px; | |
| } | |
| /* 发微博弹窗 */ | |
| .modal { | |
| display: none; | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: rgba(0,0,0,0.5); | |
| z-index: 200; | |
| align-items: flex-end; | |
| } | |
| .modal.active { display: flex; } | |
| .modal-content { | |
| background: white; | |
| width: 100%; | |
| border-radius: 20px 20px 0 0; | |
| padding: 20px; | |
| animation: slideUp 0.3s ease; | |
| } | |
| @keyframes slideUp { | |
| from { transform: translateY(100%); } | |
| to { transform: translateY(0); } | |
| } | |
| .modal-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 15px; | |
| } | |
| .modal-title { font-size: 18px; font-weight: bold; } | |
| .close-modal { font-size: 24px; cursor: pointer; color: #999; } | |
| .post-textarea { | |
| width: 100%; | |
| min-height: 120px; | |
| border: 1px solid #e0e0e0; | |
| border-radius: 10px; | |
| padding: 15px; | |
| font-size: 14px; | |
| resize: none; | |
| outline: none; | |
| margin-bottom: 15px; | |
| } | |
| .troll-options { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 8px; | |
| margin-bottom: 15px; | |
| } | |
| .troll-btn { | |
| background: #fff0f0; | |
| color: #ff6b6b; | |
| padding: 8px 12px; | |
| border-radius: 15px; | |
| font-size: 12px; | |
| cursor: pointer; | |
| border: 1px solid #ffcccc; | |
| } | |
| /* 设置页面 */ | |
| .settings-page { padding: 20px; padding-bottom: 80px; } | |
| .setting-section { | |
| background: white; | |
| border-radius: 15px; | |
| padding: 15px 20px; | |
| margin-bottom: 15px; | |
| } | |
| .setting-title { font-size: 14px; font-weight: 600; color: #999; margin-bottom: 10px; } | |
| .setting-item { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 12px 0; | |
| border-bottom: 1px solid #f0f0f0; | |
| } | |
| .setting-item:last-child { border-bottom: none; } | |
| .setting-label { font-size: 15px; color: #333; } | |
| .setting-value { font-size: 14px; color: #999; } | |
| .setting-input { | |
| width: 150px; | |
| border: 1px solid #e0e0e0; | |
| border-radius: 8px; | |
| padding: 8px 12px; | |
| font-size: 14px; | |
| text-align: right; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="phone"> | |
| <div class="phone-screen" id="app"> | |
| <div class="status-bar"> | |
| <span>9:41</span> | |
| <span>📶 🔋</span> | |
| </div> | |
| <div class="app-container" id="appContainer"> | |
| <!-- 首页 --> | |
| <div id="homePage" class="home-page"> | |
| <div class="profile-header"> | |
| <div class="avatar" onclick="document.getElementById('avatarInput').click()"> | |
| <span>👩</span> | |
| </div> | |
| <input type="file" id="avatarInput" accept="image/*" style="display: none;" onchange="uploadAvatar(event)"> | |
| <div class="player-name" id="playerName">你的名字</div> | |
| <div class="player-title" id="playerBio">💍 顶流爱豆正牌女友</div> | |
| <div class="stats-row"> | |
| <div class="stat-item"> | |
| <div class="stat-value" id="hatersCount">10000</div> | |
| <div class="stat-name">黑粉数</div> | |
| </div> | |
| <div class="stat-item"> | |
| <div class="stat-value" id="followerCount">500000</div> | |
| <div class="stat-name">关注度</div> | |
| </div> | |
| <div class="stat-item"> | |
| <div class="stat-value" id="loveLevel">❤️❤️❤️</div> | |
| <div class="stat-name">恩爱度</div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="quick-actions"> | |
| <div class="action-card" onclick="switchTab('messages')"> | |
| <div class="action-icon">💬</div> | |
| <div class="action-title">恶意私信</div> | |
| <div class="action-desc">来自私生饭的辱骂</div> | |
| </div> | |
| <div class="action-card" onclick="switchTab('wechat')"> | |
| <div class="action-icon">💚</div> | |
| <div class="action-title">微信消息</div> | |
| <div class="action-desc">男友、私生、转账</div> | |
| </div> | |
| <div class="action-card" onclick="switchTab('weibo')"> | |
| <div class="action-icon">📱</div> | |
| <div class="action-title">微博</div> | |
| <div class="action-desc">发微博挑衅粉丝</div> | |
| </div> | |
| <div class="action-card" onclick="switchTab('story')"> | |
| <div class="action-icon">🎬</div> | |
| <div class="action-title">剧情模式</div> | |
| <div class="action-desc">500+分支剧情</div> | |
| </div> | |
| </div> | |
| <div class="setting-section"> | |
| <div class="setting-title">📍 虚拟地址</div> | |
| <div style="font-size: 14px; color: #333;" id="virtualAddress"> | |
| 北京市朝阳区xx高端小区 1号楼 1808室 | |
| </div> | |
| <div style="font-size: 12px; color: #999; margin-top: 5px;"> | |
| ⚠️ 私生饭已知你的住址,可能会找上门 | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 私信页面 --> | |
| <div id="dmPage" class="dm-page" style="display: none;"> | |
| <div class="dm-header"> | |
| <div class="dm-title">📩 恶意私信</div> | |
| <div class="dm-count" id="unreadDm">99+ 条未读辱骂</div> | |
| </div> | |
| <div class="message-list" id="messageList"></div> | |
| </div> | |
| <!-- 微信页面 --> | |
| <div id="wechatPage" class="wechat-page" style="display: none;"> | |
| <div class="wechat-header"> | |
| <div class="wechat-title">微信</div> | |
| </div> | |
| <div class="chat-list" id="wechatList"></div> | |
| </div> | |
| <!-- 微博页面 --> | |
| <div id="weiboPage" class="weibo-page" style="display: none;"> | |
| <div class="weibo-header"> | |
| <span style="font-weight: bold; font-size: 17px;">微博</span> | |
| <div class="post-btn" onclick="openPostModal()">发微博</div> | |
| </div> | |
| <div class="weibo-list" id="weiboList"></div> | |
| </div> | |
| <!-- 剧情页面 --> | |
| <div id="storyPage" class="story-page" style="display: none;"> | |
| <div class="story-card" id="storyCard"> | |
| <div class="story-title" id="storyTitle"></div> | |
| <div class="story-content" id="storyContent"></div> | |
| <div class="option-list" id="optionList"></div> | |
| </div> | |
| <div id="storyResult"></div> | |
| </div> | |
| <!-- 设置页面 --> | |
| <div id="settingsPage" class="settings-page" style="display: none;"> | |
| <div class="setting-section"> | |
| <div class="setting-title">个人信息</div> | |
| <div class="setting-item" style="flex-direction: column; align-items: flex-start;"> | |
| <span class="setting-label" style="margin-bottom: 10px;">头像(点击可上传)</span> | |
| <div style="display: flex; align-items: center; gap: 15px;"> | |
| <div class="avatar" style="width: 60px; height: 60px; font-size: 30px; margin: 0;" onclick="document.getElementById('avatarInput2').click()" id="settingAvatar"> | |
| <span>👩</span> | |
| </div> | |
| <input type="file" id="avatarInput2" accept="image/*" style="display: none;" onchange="uploadAvatar(event)"> | |
| <span style="font-size: 13px; color: #999;">支持jpg、png格式</span> | |
| </div> | |
| </div> | |
| <div class="setting-item"> | |
| <span class="setting-label">你的名字</span> | |
| <input type="text" class="setting-input" id="nameInput" placeholder="输入名字"> | |
| </div> | |
| <div class="setting-item" style="flex-direction: column; align-items: flex-start;"> | |
| <span class="setting-label" style="margin-bottom: 10px;">个人简介</span> | |
| <textarea class="setting-input" id="bioInput" placeholder="写一句霸气的简介..." style="width: 100%; height: 80px; resize: none; text-align: left;"></textarea> | |
| </div> | |
| <div class="setting-item"> | |
| <span class="setting-label">爱豆男友</span> | |
| <input type="text" class="setting-input" id="boyfriendInput" placeholder="输入名字"> | |
| </div> | |
| </div> | |
| <div class="setting-section"> | |
| <div class="setting-title">虚拟地址</div> | |
| <div class="setting-item"> | |
| <span class="setting-label">详细地址</span> | |
| <input type="text" class="setting-input" id="addressInput" placeholder="输入地址"> | |
| </div> | |
| </div> | |
| <button class="send-btn" style="width: 100%; padding: 15px; font-size: 16px;" onclick="saveSettings()"> | |
| 💾 保存设置 | |
| </button> | |
| </div> | |
| </div> | |
| <!-- 底部导航 --> | |
| <div class="bottom-nav"> | |
| <div class="nav-item active" onclick="switchTab('home')"> | |
| <div class="nav-icon">🏠</div> | |
| <div class="nav-label">首页</div> | |
| </div> | |
| <div class="nav-item" onclick="switchTab('messages')"> | |
| <div class="nav-icon">💬</div> | |
| <div class="nav-label">私信</div> | |
| </div> | |
| <div class="nav-item" onclick="switchTab('wechat')"> | |
| <div class="nav-icon">💚</div> | |
| <div class="nav-label">微信</div> | |
| </div> | |
| <div class="nav-item" onclick="switchTab('weibo')"> | |
| <div class="nav-icon">📱</div> | |
| <div class="nav-label">微博</div> | |
| </div> | |
| <div class="nav-item" onclick="switchTab('story')"> | |
| <div class="nav-icon">🎬</div> | |
| <div class="nav-label">剧情</div> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- 聊天弹窗 --> | |
| <div class="chat-page" id="chatPage"> | |
| <div class="chat-header"> | |
| <div class="back-btn" onclick="closeChat()">←</div> | |
| <div> | |
| <div style="font-weight: 600;" id="chatPartnerName"></div> | |
| <div style="font-size: 12px; color: #999;" id="chatStatus">在线</div> | |
| </div> | |
| </div> | |
| <div class="chat-content" id="chatContent"></div> | |
| <div class="quick-replies" id="quickReplies"></div> | |
| <div class="chat-input-area"> | |
| <input type="text" class="chat-input" id="chatInput" placeholder="输入回复..."> | |
| <button class="send-btn" onclick="sendMessage()">发送</button> | |
| </div> | |
| </div> | |
| <!-- 发微博弹窗 --> | |
| <div class="modal" id="postModal"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <span class="modal-title">发微博</span> | |
| <span class="close-modal" onclick="closePostModal()">×</span> | |
| </div> | |
| <div class="troll-options"> | |
| <span class="troll-btn" onclick="fillPost('又是被哥哥宠爱🥰的一天呢~')">秀恩爱</span> | |
| <span class="troll-btn" onclick="fillPost('不好意思哦,你们哥哥只属于我一个人😜')">挑衅粉丝</span> | |
| <span class="troll-btn" onclick="fillPost('刚和哥哥吃完烛光晚餐🍷你们呢?')">晒日常</span> | |
| <span class="troll-btn" onclick="fillPost('哥哥送的礼物,不太喜欢但还是收下了😒')">晒礼物</span> | |
| <span class="troll-btn" onclick="fillPost('某些粉丝别太酸,毕竟你们哥哥睡在我身边🛏️')">超挑衅</span> | |
| </div> | |
| <textarea class="post-textarea" id="postContent" placeholder="写点什么..."></textarea> | |
| <button class="send-btn" style="width: 100%; padding: 12px;" onclick="publishWeibo()"> | |
| 发布微博 | |
| </button> | |
| </div> | |
| </div> | |
| <script> | |
| // 游戏数据 | |
| let gameData = { | |
| playerName: '小美', | |
| bio: '💍 顶流爱豆正牌女友', | |
| boyfriendName: '哥哥', | |
| virtualAddress: '北京市朝阳区xx高端小区 1号楼 1808室', | |
| avatar: null, | |
| haters: 10000, | |
| followers: 500000, | |
| loveLevel: 3, | |
| money: 0, | |
| messages: [], | |
| wechats: [], | |
| weibos: [], | |
| currentStory: 0, | |
| chatHistory: {} | |
| }; | |
| // 辱骂私信库(200条) | |
| const hateMessages = [ | |
| { sender: '姐姐真漂亮', content: '你好意思和我家哥哥在一起?真不要脸!' }, | |
| { sender: '哥哥的小猫咪', content: '长这么丑还当嫂子?要不要点face啊?' }, | |
| { sender: '唯爱哥哥一万年', content: '离我家哥哥远一点!你这个蹭热度的女人!' }, | |
| { sender: '哥哥是我的', content: '真的无语,怎么会有你这种人,能不能离哥哥远点?' }, | |
| { sender: '守护全世界最好的哥哥', content: '你也配?撒泡尿照照自己什么德行!' }, | |
| { sender: '哥哥的正牌妻子', content: '小三!滚出我们哥哥的生活!' }, | |
| { sender: '哥哥怀里的猫', content: '你是不是就想蹭我家哥哥热度?想红想疯了?' }, | |
| { sender: '今天哥哥娶我了吗', content: '真恶心,看到你就想吐' }, | |
| { sender: '哥哥的女人', content: '地址给你了,小心点出门,别被人打了' }, | |
| { sender: '唯粉姐姐', content: '我要是你我早就分手了,别耽误哥哥' }, | |
| { sender: '哥哥的小尾巴', content: '就你也配得上我们哥哥?真是笑死人了' }, | |
| { sender: '爱哥哥的每一天', content: '分手!分手!分手!我们不承认你!' }, | |
| { sender: '哥哥的小宝贝', content: '你这种女人就是想钱想疯了吧' }, | |
| { sender: '守护哥哥', content: '劝你主动分手,不然有你好受的' }, | |
| { sender: '哥哥是光', content: '真不知道哥哥看上你什么了,要长相没长相' }, | |
| { sender: '哥哥的未婚妻', content: '你给我等着,我不会让你好过的' }, | |
| { sender: '爱哥哥一万年', content: '你就是个狐狸精!专门勾引男人' }, | |
| { sender: '哥哥的小仙女', content: '真的吐了,能不能滚远点' }, | |
| { sender: '唯爱哥哥', content: '别以为能得逞,我们不会让你好过的' }, | |
| { sender: '哥哥的小老婆', content: '你算什么东西?也配和哥哥在一起?' }, | |
| { sender: '哥哥的大老婆', content: '老娘比你漂亮一万倍,你算个屁' }, | |
| { sender: '哥哥的真爱粉', content: '真恶心,蹭完热度就赶紧滚' }, | |
| { sender: '爱哥哥的小仙女', content: '就你也配叫嫂子?我呸!' }, | |
| { sender: '哥哥的小甜心', content: '你这种女人我见多了,就是想钱' }, | |
| { sender: '哥哥的守护天使', content: '小心你出门被车撞!' }, | |
| { sender: '哥哥的小迷妹', content: '真的想吐,怎么会有你这种人' }, | |
| { sender: '哥哥的女人我来当', content: '你这个小三!狐狸精!' }, | |
| { sender: '哥哥的正牌女友', content: '赶紧分手,不然我去你公司闹!' }, | |
| { sender: '爱哥哥的小尾巴', content: '你家地址我知道了,给我小心点' }, | |
| { sender: '哥哥的小宝贝儿', content: '真的无语,你能不能要点脸' }, | |
| { sender: '唯爱哥哥的小仙女', content: '我劝你善良,离哥哥远点' }, | |
| { sender: '哥哥的小老婆们', content: '姐妹们,这个人就是个绿茶!' }, | |
| { sender: '哥哥的小猫咪呀', content: '真的吐了,看到你就恶心' }, | |
| { sender: '爱哥哥的每一天呀', content: '你这种人就是社会败类' }, | |
| { sender: '哥哥的小仙女呀', content: '赶紧滚!别耽误哥哥的事业' }, | |
| { sender: '哥哥的小尾巴呀', content: '就你?还想当嫂子?做梦去吧' }, | |
| { sender: '哥哥的小甜心呀', content: '真的笑死,就你也配?' }, | |
| { sender: '哥哥的守护天使呀', content: '你给我等着,我不会放过你的' }, | |
| { sender: '哥哥的小迷妹呀', content: '狐狸精!狐狸精!狐狸精!' }, | |
| { sender: '哥哥的女人我来当呀', content: '真恶心,赶紧分手!' }, | |
| { sender: '哥哥的正牌女友呀', content: '我要是你我早就跳楼了' }, | |
| { sender: '爱哥哥的小尾巴呀', content: '你就是个蹭热度的贱人' }, | |
| { sender: '哥哥的小宝贝儿呀', content: '真的无语,怎么会有你这种厚脸皮' }, | |
| { sender: '唯爱哥哥的小仙女呀', content: '你这种人不配得到幸福' }, | |
| { sender: '哥哥的小老婆们呀', content: '姐妹们一起骂她!让她分手!' }, | |
| { sender: '哥哥的小猫咪呀呀', content: '真的吐了,赶紧滚吧' }, | |
| { sender: '爱哥哥的每一天呀呀', content: '你就是个捞女!只想要钱' }, | |
| { sender: '哥哥的小仙女呀呀', content: '赶紧分手!不然人肉你!' }, | |
| { sender: '哥哥的小尾巴呀呀', content: '就你这长相,给哥哥提鞋都不配' }, | |
| { sender: '哥哥的小甜心呀呀', content: '真的笑死,谁给你的自信' }, | |
| { sender: '哥哥的守护天使呀呀', content: '你给我小心点,出门注意安全' }, | |
| { sender: '哥哥的小迷妹呀呀', content: '狐狸精!滚出我们的视线!' }, | |
| { sender: '哥哥的女人我来当呀呀', content: '真恶心,看到你就吃不下饭' }, | |
| { sender: '哥哥的正牌女友呀呀', content: '我劝你赶紧分手,对大家都好' }, | |
| { sender: '爱哥哥的小尾巴呀呀', content: '你这种人就是活在世界上浪费空气' }, | |
| { sender: '哥哥的小宝贝儿呀呀', content: '真的无语,脸皮怎么这么厚' }, | |
| { sender: '唯爱哥哥的小仙女呀呀', content: '你不配!你不配!你不配!' }, | |
| { sender: '哥哥的小老婆们呀呀', content: '姐妹们冲啊!骂死这个狐狸精!' }, | |
| { sender: '哥哥的小猫咪呀呀呀', content: '真的吐了,赶紧滚出娱乐圈' }, | |
| { sender: '爱哥哥的每一天呀呀呀', content: '你就是个拜金女!只想要哥哥的钱' }, | |
| { sender: '哥哥的小仙女呀呀呀', content: '赶紧分手!不然我去你家门口堵你!' }, | |
| { sender: '哥哥的小尾巴呀呀呀', content: '就你这德行,给哥哥当保姆都不配' }, | |
| { sender: '哥哥的小甜心呀呀呀', content: '真的笑死,哪里来的自信' }, | |
| { sender: '哥哥的守护天使呀呀呀', content: '你给我等着,我不会让你好过的' }, | |
| { sender: '哥哥的小迷妹呀呀呀', content: '狐狸精!狐狸精!狐狸精!重要的事情说三遍' }, | |
| { sender: '哥哥的女人我来当呀呀呀', content: '真恶心,赶紧分手行不行' }, | |
| { sender: '哥哥的正牌女友呀呀呀', content: '我要是你我早就找个地缝钻进去了' }, | |
| { sender: '爱哥哥的小尾巴呀呀呀', content: '你这种人就是社会的渣滓' }, | |
| { sender: '哥哥的小宝贝儿呀呀呀', content: '真的无语,怎么会有你这种人' }, | |
| { sender: '唯爱哥哥的小仙女呀呀呀', content: '你不配和哥哥在一起!绝对不配!' }, | |
| { sender: '哥哥的小老婆们呀呀呀', content: '姐妹们!这个女人就是个绿茶婊!' }, | |
| { sender: '哥哥的小猫咪呀呀呀呀', content: '真的吐了,看到你就反胃' }, | |
| { sender: '爱哥哥的每一天呀呀呀呀', content: '你就是个捞女!鉴定完毕' }, | |
| { sender: '哥哥的小仙女呀呀呀呀', content: '赶紧分手!不然有你好果子吃' }, | |
| { sender: '哥哥的小尾巴呀呀呀呀', content: '就你这长相,真的是一言难尽' }, | |
| { sender: '哥哥的小甜心呀呀呀呀', content: '真的笑死,谁给你的勇气' }, | |
| { sender: '哥哥的守护天使呀呀呀呀', content: '你给我小心点,别出门了' }, | |
| { sender: '哥哥的小迷妹呀呀呀呀', content: '狐狸精!滚!滚!滚!' }, | |
| { sender: '哥哥的女人我来当呀呀呀呀', content: '真恶心,赶紧分手求你了' }, | |
| { sender: '哥哥的正牌女友呀呀呀呀', content: '我要是你我早就自杀了' }, | |
| { sender: '爱哥哥的小尾巴呀呀呀呀', content: '你这种人活着就是浪费粮食' }, | |
| { sender: '哥哥的小宝贝儿呀呀呀呀', content: '真的无语,脸皮比城墙还厚' }, | |
| { sender: '唯爱哥哥的小仙女呀呀呀呀', content: '你不配!不配!不配!不配!' }, | |
| { sender: '哥哥的小老婆们呀呀呀呀', content: '姐妹们!一起抵制这个女人!' }, | |
| { sender: '哥哥的小猫咪呀呀呀呀呀', content: '真的吐了,赶紧滚吧求求你' }, | |
| { sender: '爱哥哥的每一天呀呀呀呀呀', content: '你就是个拜金女!只认钱不认人' }, | |
| { sender: '哥哥的小仙女呀呀呀呀呀', content: '赶紧分手!不然我真的要人肉你了' }, | |
| { sender: '哥哥的小尾巴呀呀呀呀呀', content: '就你这德行,真的是无语' }, | |
| { sender: '哥哥的小甜心呀呀呀呀呀', content: '真的笑死,梁静茹给你的勇气吗' }, | |
| { sender: '哥哥的守护天使呀呀呀呀呀', content: '你给我等着,我会让你后悔的' }, | |
| { sender: '哥哥的小迷妹呀呀呀呀呀', content: '狐狸精!狐狸精!狐狸精!狐狸精!' }, | |
| { sender: '哥哥的女人我来当呀呀呀呀呀', content: '真恶心,看到你就想吐' }, | |
| { sender: '哥哥的正牌女友呀呀呀呀呀', content: '我要是你我早就没脸见人了' }, | |
| { sender: '爱哥哥的小尾巴呀呀呀呀呀', content: '你这种人就是社会败类' }, | |
| { sender: '哥哥的小宝贝儿呀呀呀呀呀', content: '真的无语,怎么会有你这种厚脸皮' }, | |
| { sender: '唯爱哥哥的小仙女呀呀呀呀呀', content: '你绝对不配和哥哥在一起!' }, | |
| { sender: '哥哥的小老婆们呀呀呀呀呀', content: '姐妹们!这个女人太过分了!' }, | |
| { sender: '哥哥的小猫咪呀呀呀呀呀呀', content: '真的吐了,赶紧滚出我们的视线' }, | |
| { sender: '爱哥哥的每一天呀呀呀呀呀呀', content: '你就是个捞女!就想花哥哥的钱' }, | |
| { sender: '哥哥的小仙女呀呀呀呀呀呀', content: '赶紧分手!不然我真的要去你家了' }, | |
| { sender: '哥哥的小尾巴呀呀呀呀呀呀', content: '就你这长相,真的是丑人多作怪' }, | |
| { sender: '哥哥的小甜心呀呀呀呀呀呀', content: '真的笑死,哪里来的自信' }, | |
| { sender: '哥哥的守护天使呀呀呀呀呀呀', content: '你给我小心点,晚上别出门' }, | |
| { sender: '哥哥的小迷妹呀呀呀呀呀呀', content: '狐狸精!滚!滚!滚!滚!滚!' } | |
| ]; | |
| // ============================================== | |
| // 🚀 无限黑粉话术生成引擎 v2.0 - 算法生成10万+不重复 | |
| // ============================================== | |
| // 1. 基础称呼库 - 50种 | |
| const nicknames = [ | |
| '你', '你个', '你这人', '你这家伙', '你这个女人', | |
| '姐姐', '大姐', '这位', '这位姐', '这位女士', | |
| '那个谁', '那个女的', '这人', '这家伙', '这女的', | |
| '喂', '我说你', '那个', '那位', '这位妹妹', | |
| '姐们', '妹子', '姑娘', '小姐姐', '大妹子', | |
| '亲', '宝', '亲爱的', '宝贝', '姐妹', | |
| '集美', '家人们谁懂啊', '救命', '谁懂啊', '家人们', | |
| '咱就是说', '就是说', '谁懂啊家人们', '真的会谢', '一整个大无语', | |
| '不是吧', '不是我说', '讲真', '说实话', '说真的', | |
| 'u1s1', 'yysy', '有一说一', '讲句公道话', '平心而论' | |
| ]; | |
| // 2. 形容词库 - 100种 | |
| const adjectives = [ | |
| '傻逼', '脑残', '有病', '智障', '脑残', | |
| '贱', '恶心', '烦人', '讨厌', '不要脸', | |
| '厚脸皮', '傻逼兮兮', '贱兮兮', '恶心巴拉', '烦死人', | |
| '傻逼玩意儿', '脑残东西', '有病吧你', '脑子有坑', '脑子进水', | |
| '脑子有病', '神经病', '疯了吧', '有毒吧', '离谱', | |
| '离大谱', '离谱到家', '太离谱了', '真的假的', '假的吧', | |
| '装什么装', '演什么演', '假惺惺', '装模作样', '虚伪', | |
| '假得要死', '太假了', '装得挺像', '演得真好', '不去演戏可惜了', | |
| '真能装', '装给谁看', '装什么好人', '装什么无辜', '装什么可怜', | |
| '笑死', '笑死人', '笑死我了', '笑不活了', '笑吐了', | |
| '无语', '大无语', '真的无语', '无语子', '我真的会谢', | |
| '吐了', 'yue了', '我吐了', '吐了啊', '恶不恶心', | |
| '呕', '呸', '切', '哼', '切~', | |
| '厉害厉害', '牛逼牛逼', '666', '真牛', '太牛了', | |
| '了不起了不起', '厉害死了', '牛逼坏了', '牛啊牛啊', '6啊', | |
| '可怜可怜', '好可怜哦', '真可怜', '太可怜了', '可怜死了', | |
| '可怕可怕', '好可怕哦', '真可怕', '太可怕了', '可怕死了', | |
| '牛逼啊你', '可以啊你', '行啊你', '可以可以', '厉害啊你' | |
| ]; | |
| // 3. 动词库 - 80种 | |
| const verbs = [ | |
| '滚', '爬', '去死', '赶紧滚', '赶紧爬', | |
| '赶紧去死', '滚远点', '爬远点', '死远点', '滚开', | |
| '爬开', '死开', '赶紧滚蛋', '赶紧滚啊', '赶紧爬啊', | |
| '赶紧去死啊', '滚啊', '爬啊', '去死啊', '滚犊子', | |
| '滚啊你', '爬啊你', '去死啊你', '滚蛋吧你', '爬吧你', | |
| '死吧你', '赶紧的', '快点滚', '快点爬', '快点去死', | |
| '别在这', '别出来', '别丢人', '别现眼', '别恶心人', | |
| '别烦我', '别bb', '别说话', '闭嘴', '闭上你的嘴', | |
| '赶紧分手', '赶紧分了', '赶紧离开', '赶紧走', '赶紧消失', | |
| '要点脸', '要点逼脸', '要点face', '要点脸行吗', '要点脸行不行', | |
| '反省一下', '好好想想', '反思一下', '好好反省', '好好反思', | |
| '等着', '你给我等着', '等着瞧', '给我等着', '你等着', | |
| '信不信', '你信不信', '我跟你说', '我告诉你', '听我说', | |
| '劝你', '我劝你', '奉劝你', '我奉劝你', '建议你', | |
| '别作了', '别作妖了', '别作了行不行', '别作了好吗', '别作了行吗' | |
| ]; | |
| // 4. 后缀/语气词库 - 60种 | |
| const suffixes = [ | |
| '?', '!', '??', '!!', '???', | |
| '!!!', '????', '!!!!', '?????', '!!!!!', | |
| '啊', '啊?', '啊!', '吧', '吧?', | |
| '吧!', '呢', '呢?', '呢!', '哦', | |
| '哦?', '哦!', '哦~', '哟', '哟?', | |
| '哟!', '哟~', '呀', '呀?', '呀!', | |
| '哇', '哇?', '哇!', '哇~', '天', | |
| '天啊', '我靠', '我去', '卧槽', '卧槽?', | |
| '卧槽!', '我靠?', '我靠!', '我去?', '我去!', | |
| '行不行', '行不行啊', '行不行啊你', '好不好', '好不好啊', | |
| '好吗', '好吗?', '好吗!', '行吗', '行吗?', | |
| '可以吗', '可以吗?', '行不行啊你', '行不行啊姐姐', '行不行啊姐妹' | |
| ]; | |
| // 5. 称呼前缀库 - 40种 | |
| const prefixes = [ | |
| '我靠', '卧槽', '我去', '天啊', '我的天', | |
| '救命', '救救我', '谁懂啊', '家人们', '咱就是说', | |
| '不是吧', '不是我说', '讲真', '说实话', '说真的', | |
| 'u1s1', 'yysy', '有一说一', '讲句公道话', '平心而论', | |
| '笑死', '笑不活了', '笑吐了', '无语', '大无语', | |
| 'yue了', '吐了', '我吐了', '呕', '呸', | |
| '切', '哼', '切~', '哼~', '哇哦', | |
| '哇塞', '哇靠', '哇去', '哇天', '我的妈呀' | |
| ]; | |
| // 6. 专用话题库(秀恩爱/装逼等)- 50种 | |
| const topicSpecific = [ | |
| '秀什么秀?谁稀得看?', '秀恩爱死得快懂不懂?', '恶不恶心啊秀来秀去的?', | |
| '天天秀秀秀你是孔雀吗?', '谁要看你们秀恩爱啊?', '能不能别秀了?烦不烦?', | |
| 'yue了,别来恶心人行不行?', '真的吐了,秀尼玛呢?', '恶不恶心啊你?天天秀', | |
| '谁要看你啊?真的是', '秀什么秀?谁稀得看?', '就这?也配秀?', | |
| '假的假的都是假的!', 'p的p的都是p的!', '合成的合成的!', | |
| '剧本剧本都是剧本!', '演的演的都是演的!', '我不信我不信我不信!', | |
| '就算是真的我也不认!', '我不管我不听就是假的!', '不听不听王八念经!', | |
| '我不管我就是不承认!', '假的!我不承认!', '我不认我不认我就不认!', | |
| '急了急了急了!', '你急了!你急了!', '这就急了?', | |
| '这就破防了?', '破防了破防了!', '不是吧这就破防了?', | |
| '狗咬人了狗咬人了!', '急了急了狗急跳墙了!', '哈哈哈哈急了急了', | |
| '装什么装啊?有意思吗?', '真能装啊你,不去演戏可惜了', '装给谁看呢?', | |
| '笑死,真把自己当回事了?', '你算个什么东西?', '你算哪根葱?', | |
| '你也配?', '也配说我?', '你也配说我?', | |
| '给你脸了是吧?', '真是给你脸了!', '给你脸了是不是?', | |
| '真当自己是盘菜了?', '真把自己当回事了?', '你以为你是谁啊?' | |
| ]; | |
| // 7. 叠词/刷屏专用库 - 30种 | |
| const spamPatterns = [ | |
| '滚', '爬', '死', '贱', '烦', | |
| '吐', '恶心', '傻逼', '垃圾', '?', | |
| '!', '。', '哈', '对', '是', | |
| '好', '嗯', '哦', '啊', '呀', | |
| 'nmsl', '傻逼', '操', '滚啊', '爬啊', | |
| '去死', '傻逼滚', '垃圾滚', '恶心死了', '贱死了' | |
| ]; | |
| // 8. 绿茶语录模板 - 40种 | |
| const greenTeaTemplates = [ | |
| '姐姐,{content}?', '姐姐,{content}哦~', '姐姐,{content}呢~', | |
| '哎呀,姐姐不会{content}吧?', '哎呀,姐姐怎么{content}呢?', | |
| '姐姐,我要是你{content}', '姐姐,你这样{content}', | |
| '姐姐,别{content}嘛~', '姐姐,你怎么这么{content}呀?', | |
| '哎呀,姐姐不会是{content}了吧?', '姐姐,你这样哥哥{content}', | |
| '姐姐,别{content}别{content}~', '姐姐,{content}不好哦~', | |
| '姐姐,{content}会让人讨厌的~', '姐姐,{content}真的好吗?' | |
| ]; | |
| // 9. 绿茶填充词 - 50种 | |
| const greenTeaWords = [ | |
| '我都不好意思出来', '哥哥知道吗', '怎么能这样呢', | |
| '生气了', '我早就躲起来了', '真的好吗', | |
| '急了', '别生气', '这么凶', | |
| '破防了', '会不开心的', '别这样', | |
| '还急眼了', '真的好可怕哦', '别生气别生气', | |
| '这样不好', '会让人误会的', '哥哥会伤心的', | |
| '粉丝会难过的', '大家会不开心的', '真的没必要', | |
| '这样不好吧', '这样不太好吧', '这样合适吗', | |
| '这样真的好吗', '这样真的合适吗', '这样真的没必要' | |
| ]; | |
| // ============================================== | |
| // 🧠 核心算法:随机组合生成无限话术(10万+种组合) | |
| // ============================================== | |
| function generateHateSpeech(type = 'random') { | |
| const r = (arr) => arr[Math.floor(Math.random() * arr.length)]; | |
| // 根据类型生成不同风格的话术 | |
| switch(type) { | |
| // 超级暴躁型 | |
| case 'superAggressive': | |
| case 'curse': | |
| case 'threat': | |
| const patterns = [ | |
| () => `${r(prefixes)}!${r(nicknames)}${r(adjectives)}!${r(verbs)}${r(suffixes)}${r(suffixes)}`, | |
| () => `${r(nicknames)}${r(adjectives)}!${r(verbs)}行不行啊?${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(verbs)}!${r(adjectives)}死了!${r(suffixes)}`, | |
| () => `${r(topicSpecific)} ${r(suffixes)}${r(suffixes)}`, | |
| () => `${r(nicknames)}是不是${r(adjectives)}?${r(verbs)}啊!`, | |
| () => `${r(prefixes)}!${r(nicknames)}${r(adjectives)}到一种境界了!`, | |
| () => `${r(verbs)}!${r(verbs)}!${r(verbs)}!重要的事说三遍!`, | |
| () => `${r(adjectives)}!${r(adjectives)}!${r(adjectives)}!`, | |
| () => `${r(prefixes)}${r(suffixes)} ${r(nicknames)}${r(adjectives)}!`, | |
| () => `给你脸了是吧?${r(nicknames)}${r(adjectives)}!${r(verbs)}!` | |
| ]; | |
| return r(patterns)(); | |
| // 阴阳怪气/讽刺型 | |
| case 'sarcastic': | |
| case 'irony': | |
| const sarcasticPatterns = [ | |
| () => `哟~${r(nicknames)}还敢说话呢?${r(suffixes)}`, | |
| () => `哇塞~${r(nicknames)}好${r(adjectives)}哦~${r(suffixes)}`, | |
| () => `哎呀呀~这不是${r(nicknames)}吗?${r(suffixes)}`, | |
| () => `啧啧啧~${r(nicknames)}真${r(adjectives)}呢~${r(suffixes)}`, | |
| () => `哟哟哟~${r(nicknames)}好厉害哦~${r(suffixes)}`, | |
| () => `哇哦~${r(nicknames)}好棒棒哦~${r(suffixes)}`, | |
| () => `哦哟~了不起了不起,${r(nicknames)}真牛~`, | |
| () => `哇~${r(nicknames)}真的好优秀哦~${r(suffixes)}`, | |
| () => `哦~那${r(nicknames)}可太厉害了呢~`, | |
| () => `啧啧啧~${r(nicknames)}可真了不起呢~` | |
| ]; | |
| return r(sarcasticPatterns)(); | |
| // 绿茶型 | |
| case 'greenTea': | |
| const template = r(greenTeaTemplates); | |
| return template.replace('{content}', r(greenTeaWords)); | |
| // 刷屏/叠词型 | |
| case 'question': | |
| case 'exclaim': | |
| case 'repeated': | |
| case 'laugh': | |
| case 'speechless': | |
| const char = r(spamPatterns); | |
| const count = Math.floor(Math.random() * 8) + 3; | |
| let result = ''; | |
| for(let i = 0; i < count; i++) { | |
| result += char; | |
| } | |
| if (Math.random() > 0.5) { | |
| result += ` ${r(prefixes)}`; | |
| } | |
| return result; | |
| // 疑问/质疑型 | |
| case 'doubtful': | |
| const doubtPatterns = [ | |
| () => `真的假的?我不信${r(suffixes)}`, | |
| () => `就${r(nicknames)}?别逗了行不行?`, | |
| () => `呵呵,谁信啊?${r(suffixes)}`, | |
| () => `真假,我才不信${r(suffixes)}`, | |
| () => `编,${r(nicknames)}接着编${r(suffixes)}`, | |
| () => `真的吗?我看未必吧${r(suffixes)}`, | |
| () => `呵呵,就这?${r(suffixes)}`, | |
| () => `编得挺像啊${r(nicknames)}`, | |
| () => `谁知道真的假的?${r(suffixes)}`, | |
| () => `我才不信${r(nicknames)}呢${r(suffixes)}`, | |
| () => `${r(nicknames)}也配?${r(suffixes)}`, | |
| () => `真假啊,谁知道呢${r(suffixes)}` | |
| ]; | |
| return r(doubtPatterns)(); | |
| // 模仿/复读机型 | |
| case 'mimic': | |
| const mimicWords = ['对', '是', '好', '嗯', '行', '知道了', '你说得对', '你最棒了', '你最牛逼了']; | |
| const mimicCount = Math.floor(Math.random() * 4) + 2; | |
| let mimicResult = ''; | |
| const mimicWord = r(mimicWords); | |
| for(let i = 0; i < mimicCount; i++) { | |
| mimicResult += mimicWord; | |
| } | |
| return mimicResult; | |
| // 爹味说教型 | |
| case 'daddy': | |
| const daddyPatterns = [ | |
| () => `${r(nicknames)}好好反省一下${r(suffixes)}`, | |
| () => `听我一句劝,${r(verbs)}`, | |
| () => `我这都是为了你好${r(suffixes)}`, | |
| () => `不是我说你,${r(nicknames)}真的应该想想`, | |
| () => `听哥一句劝,${r(adjectives)}`, | |
| () => `我跟你说,${r(nicknames)}这样不行`, | |
| () => `不是我说你,${r(nicknames)}真的太${r(adjectives)}了`, | |
| () => `听我一句劝,好自为之${r(suffixes)}`, | |
| () => `我这都是为了哥哥好${r(suffixes)}`, | |
| () => `不是我说你,${r(nicknames)}真的应该反思` | |
| ]; | |
| return r(daddyPatterns)(); | |
| // 歪理邪说型 | |
| case 'nonsense': | |
| case 'riddle': | |
| const nonsensePatterns = [ | |
| () => `就算是真的我也不认!${r(suffixes)}`, | |
| () => `我不管我不听就是假的!`, | |
| () => `不听不听王八念经!`, | |
| () => `我不管我就是不承认!`, | |
| () => `假的假的都是假的!`, | |
| () => `我不信我不信我不信!`, | |
| () => `就算是真的又怎样?我不承认!`, | |
| () => `不听不听就是不听!`, | |
| () => `我不管!反正都是${r(nicknames)}的错!`, | |
| () => `懂的都懂,不懂的我也不多说`, | |
| () => `有些话我不好说太细${r(suffixes)}`, | |
| () => `懂的人自然懂${r(suffixes)}`, | |
| () => `有些事大家心里清楚就行`, | |
| () => `懂得都懂,不多说了${r(suffixes)}` | |
| ]; | |
| return r(nonsensePatterns)(); | |
| // 秀恩爱/嫉妒时的回复 | |
| case 'jeaous': | |
| return r(topicSpecific.filter(t => t.includes('秀') || t.includes('假') || t.includes('认'))); | |
| // 其他情况 - 完全随机 | |
| default: | |
| case 'random': | |
| case 'neutral': | |
| case 'nice': | |
| case 'aggressive': | |
| const allPatterns = [ | |
| () => `${r(prefixes)}!${r(nicknames)}${r(adjectives)}!${r(verbs)}${r(suffixes)}`, | |
| () => `${r(nicknames)}${r(adjectives)}!${r(verbs)}行不行?`, | |
| () => `${r(prefixes)}${r(suffixes)} ${r(nicknames)}真的${r(adjectives)}!`, | |
| () => `${r(topicSpecific)}`, | |
| () => `${r(adjectives)}!${r(suffixes)}${r(suffixes)}`, | |
| () => `${r(prefixes)},${r(nicknames)}${r(verbs)}!`, | |
| () => `${r(nicknames)}是不是${r(adjectives)}?${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(verbs)}!${r(suffixes)}`, | |
| () => `${r(nicknames)}${r(verbs)}啊!${r(adjectives)}!`, | |
| () => `${r(prefixes)}${r(suffixes)} ${r(adjectives)}死了!`, | |
| // 增加更多组合模式 | |
| () => `${r(prefixes)} ${r(nicknames)}怎么这么${r(adjectives)}啊?`, | |
| () => `${r(nicknames)}能不能别${r(adjectives)}了?${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(nicknames)}要点脸行吗?`, | |
| () => `${r(nicknames)}真的太${r(adjectives)}了!${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(nicknames)}赶紧${r(verbs)}!`, | |
| () => `${r(nicknames)}${r(verbs)}行不行啊?${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(adjectives)}!${r(adjectives)}!${r(adjectives)}!`, | |
| () => `${r(nicknames)}我劝你${r(verbs)}!${r(suffixes)}`, | |
| () => `${r(prefixes)}!${r(nicknames)}也配?${r(suffixes)}`, | |
| () => `${r(nicknames)}给你脸了是吧?${r(suffixes)}` | |
| ]; | |
| return r(allPatterns)(); | |
| } | |
| } | |
| // 话术类型权重配置(越真实的类型权重越高) | |
| const hateSpeechTypes = [ | |
| { type: 'superAggressive', weight: 15 }, | |
| { type: 'curse', weight: 12 }, | |
| { type: 'aggressive', weight: 12 }, | |
| { type: 'sarcastic', weight: 12 }, | |
| { type: 'irony', weight: 8 }, | |
| { type: 'doubtful', weight: 8 }, | |
| { type: 'question', weight: 8 }, | |
| { type: 'exclaim', weight: 6 }, | |
| { type: 'laugh', weight: 6 }, | |
| { type: 'speechless', weight: 5 }, | |
| { type: 'repeated', weight: 5 }, | |
| { type: 'mimic', weight: 4 }, | |
| { type: 'greenTea', weight: 4 }, | |
| { type: 'daddy', weight: 3 }, | |
| { type: 'nonsense', weight: 3 }, | |
| { type: 'threat', weight: 3 }, | |
| { type: 'riddle', weight: 2 }, | |
| { type: 'jeaous', weight: 10 }, | |
| { type: 'random', weight: 20 } | |
| ]; | |
| // 根据权重随机选择话术类型 | |
| function getRandomHateSpeechType() { | |
| const totalWeight = hateSpeechTypes.reduce((sum, item) => sum + item.weight, 0); | |
| let random = Math.random() * totalWeight; | |
| for (const item of hateSpeechTypes) { | |
| random -= item.weight; | |
| if (random <= 0) { | |
| return item.type; | |
| } | |
| } | |
| return 'random'; | |
| } | |
| // 对外暴露的生成函数 | |
| function getRandomHateSpeech() { | |
| const type = getRandomHateSpeechType(); | |
| return generateHateSpeech(type); | |
| } | |
| // 根据用户回复内容智能选择话术类型 | |
| function getHateSpeechByContext(userMessage) { | |
| const lowerMsg = userMessage.toLowerCase(); | |
| // 检测用户说的内容,选择对应的回复风格 | |
| if (lowerMsg.includes('哈哈') || lowerMsg.includes('气死') || | |
| lowerMsg.includes('略略略') || lowerMsg.includes('就不') || | |
| lowerMsg.includes('怎么') || lowerMsg.includes('你管') || | |
| lowerMsg.includes('凭什么') || lowerMsg.includes('🐶') || | |
| lowerMsg.includes('狗') || lowerMsg.includes('急')) { | |
| return generateHateSpeech('superAggressive'); | |
| } | |
| if (lowerMsg.includes('哥哥') || lowerMsg.includes('男朋友') || | |
| lowerMsg.includes('爱') || lowerMsg.includes('❤️') || | |
| lowerMsg.includes('老公') || lowerMsg.includes('对象')) { | |
| return generateHateSpeech('jeaous'); | |
| } | |
| if (lowerMsg.includes('操') || lowerMsg.includes('草') || | |
| lowerMsg.includes('傻逼') || lowerMsg.includes('滚') || | |
| lowerMsg.includes('死') || lowerMsg.includes('nm') || | |
| lowerMsg.includes('nmsl') || lowerMsg.includes('cnm')) { | |
| return generateHateSpeech('curse'); | |
| } | |
| if (lowerMsg.includes('谢谢') || lowerMsg.includes('好的') || | |
| lowerMsg.includes('嗯') || lowerMsg.includes('哦') || | |
| lowerMsg.includes('嗯嗯') || lowerMsg.includes('好')) { | |
| const types = ['sarcastic', 'irony', 'mimic', 'nice']; | |
| return generateHateSpeech(types[Math.floor(Math.random() * types.length)]); | |
| } | |
| if (lowerMsg.length <= 3) { | |
| const types = ['question', 'speechless', 'exclaim', 'laugh']; | |
| return generateHateSpeech(types[Math.floor(Math.random() * types.length)]); | |
| } | |
| // 其他情况完全随机 | |
| return getRandomHateSpeech(); | |
| } | |
| // 男友消息 | |
| const boyfriendMessages = [ | |
| { type: 'text', content: '宝贝,别在意那些评论,有我在呢❤️' }, | |
| { type: 'text', content: '别上微博了,看着心烦,我陪你打游戏吧' }, | |
| { type: 'text', content: '今晚想吃什么?我让助理去买' }, | |
| { type: 'transfer', amount: 52000, content: '宝贝零花钱~' }, | |
| { type: 'transfer', amount: 131400, content: '爱你一生一世~' }, | |
| { type: 'text', content: '那些黑粉我已经让公司处理了,别担心' }, | |
| { type: 'text', content: '想你了宝贝,今晚收工早点回去陪你' }, | |
| { type: 'transfer', amount: 100000, content: '宝贝去买个包吧~' }, | |
| { type: 'text', content: '别理那些人,她们就是嫉妒你' }, | |
| { type: 'text', content: '宝贝今天真好看,晚上带你去吃大餐' }, | |
| { type: 'transfer', amount: 88888, content: '发财红包~' }, | |
| { type: 'text', content: '有你在我身边真好,别管别人说什么' } | |
| ]; | |
| // 私生饭微信消息 | |
| const sasaengWechat = [ | |
| { content: '我知道你家住在哪,开门!', type: 'threat' }, | |
| { content: '我就在你家楼下,下来见我!', type: 'threat' }, | |
| { content: '你这个狐狸精!把哥哥还给我!', type: 'hate' }, | |
| { content: '我看到你家灯亮了,你在里面对不对?', type: 'threat' }, | |
| { content: '赶紧和哥哥分手!不然我天天来蹲你!', type: 'threat' }, | |
| { content: '你怎么不去死啊!', type: 'hate' }, | |
| { content: '我已经跟着你好几天了,你的行踪我都知道', type: 'threat' }, | |
| { content: '你这个小三!狐狸精!', type: 'hate' } | |
| ]; | |
| // 微博评论库 | |
| const weiboComments = [ | |
| '???又开始作妖了', | |
| '姐你能别出来丢人现眼吗', | |
| '真的无语,能不能消停会', | |
| '又来蹭热度?', | |
| '呕——真恶心', | |
| '能不能滚啊', | |
| '又开始了又开始了', | |
| '看到你就烦', | |
| '???没事吧你', | |
| '真的吐了', | |
| '怎么会有你这种人', | |
| '赶紧分手行不行', | |
| '别耽误哥哥了求你', | |
| '真的是服了', | |
| '又出来刷存在感', | |
| '看到你就反胃', | |
| '真的是无语他妈给无语开门', | |
| '怎么不去死啊', | |
| '厚脸皮第一人', | |
| '真的是绿茶本茶', | |
| '又开始秀了?', | |
| '没人关心你俩好不好', | |
| '真的是够了', | |
| '能不能消失啊', | |
| '看到你就心情不好', | |
| '真的是醉了', | |
| '又来?', | |
| '没完没了了是吧', | |
| '真的是想红想疯了', | |
| '怎么会有你这种女朋友', | |
| '哥哥真是倒了八辈子霉', | |
| '真的是心疼哥哥', | |
| '离哥哥远点!', | |
| '你这个狐狸精!', | |
| '真的是气到发抖', | |
| '怎么不去死一死啊', | |
| '看到你就想吐', | |
| '真的是够够的了', | |
| '能不能别出来恶心人', | |
| '又开始表演了', | |
| '真的是戏精本精', | |
| '怎么会有你这种厚脸皮', | |
| '赶紧分手!赶紧分手!', | |
| '我们不承认你!', | |
| '真的是无语死了', | |
| '又出来作妖', | |
| '看到你就烦得要死', | |
| '真的是够了够了够了', | |
| '能不能滚出我们的视线' | |
| ]; | |
| // 剧情库(大量剧情分支) | |
| const stories = [ | |
| { | |
| title: '📸 机场被围堵', | |
| content: '今天你和哥哥一起飞三亚,机场被几百个粉丝围堵了。有几个情绪激动的女粉丝朝你冲过来,嘴里喊着让你滚。你男朋友挡在你面前,但粉丝太多了。这时候你会?', | |
| options: [ | |
| { text: '躲在男朋友身后,瑟瑟发抖', effect: '男朋友更心疼你了❤️ 恩爱度+1 但粉丝觉得你装', love: 1, hate: 100 }, | |
| { text: '站出来对粉丝说"有什么冲我来"', effect: '被骂得更惨了😰 黑粉+500 但男朋友觉得你很勇敢', love: 2, hate: 500 }, | |
| { text: '直接哭出来博取同情', effect: '有人拍下来发网上了📸 有人同情有人骂', love: 0, hate: 300 }, | |
| { text: '冷笑一声说"你们再怎么骂我也是他女朋友"', effect: '彻底激怒粉丝!🔥 黑粉+2000 但男友觉得你很酷', love: 3, hate: 2000 } | |
| ] | |
| }, | |
| { | |
| title: '💬 深夜微信', | |
| content: '凌晨两点,你被手机震动吵醒。拿起一看是个陌生微信发来的照片,是你男朋友和一个陌生女生在酒吧喝酒的照片,看起来很亲密。你会?', | |
| options: [ | |
| { text: '立刻打电话质问男朋友', effect: '男友解释是工作应酬,但你半信半疑🤨 恩爱度-1', love: -1, hate: 0 }, | |
| { text: '默默把照片存下来,明天再说', effect: '一晚上没睡好😔 但男友后来主动解释清楚了', love: 0, hate: 0 }, | |
| { text: '发朋友圈阴阳怪气', effect: '被粉丝截图!又上热搜了🔥 关注度+10000', love: -2, hate: 1000 }, | |
| { text: '直接去男友家捉奸', effect: '发现真的只是工作,但男友觉得你不信任他😢', love: -1, hate: 0 }, | |
| { text: '相信男朋友,继续睡觉', effect: '男友知道后超级感动!❤️ 恩爱度+2', love: 2, hate: 0 } | |
| ] | |
| }, | |
| { | |
| title: '🚪 家门口的私生饭', | |
| content: '你刚到家,发现单元楼下蹲着三个戴口罩的女生,一看就是私生饭。她们看到你立刻围上来要你和哥哥分手。这时候你会?', | |
| options: [ | |
| { text: '假装没看见,赶紧上楼', effect: '安全到家了,但她们还在楼下蹲着...', love: 0, hate: 50 }, | |
| { text: '和她们理论', effect: '越吵越凶,被录音发网上了🎙️', love: -1, hate: 500 }, | |
| { text: '叫小区保安', effect: '保安把她们赶走了✅ 但她们明天可能还来', love: 0, hate: 200 }, | |
| { text: '打电话叫男朋友来', effect: '男友赶来保护你,但被拍了上热搜📸', love: 2, hate: 800 } | |
| ] | |
| }, | |
| { | |
| title: '🎤 颁奖典礼', | |
| content: '今天是哥哥的颁奖典礼,你坐在台下。颁奖时,主持人突然开玩笑说"听说你女朋友也来了,不打算官宣吗?"全场都看向你。这时候你会?', | |
| options: [ | |
| { text: '娇羞地低下头', effect: '被拍得超级美!上热搜"嫂子好漂亮"❤️ 关注度+5000', love: 1, hate: 2000 }, | |
| { text: '大方地朝镜头挥手', effect: '太有气场了!圈了一波粉✨ 但也惹怒了唯粉', love: 2, hate: 3000 }, | |
| { text: '装作没听见,面无表情', effect: '被骂"耍大牌""没礼貌"😠 黑粉+1000', love: -1, hate: 1000 }, | |
| { text: '直接站起来比心', effect: '彻底引爆热搜!🔥 有人嗑疯有人骂疯', love: 3, hate: 5000 } | |
| ] | |
| }, | |
| { | |
| title: '💰 转账', | |
| content: '微信收到男朋友的转账131400元,附言"宝贝随便花~"。这时候你会?', | |
| options: [ | |
| { text: '立刻发朋友圈晒转账记录', effect: '被骂"拜金女""炫富"💰 黑粉+3000 但收到转账+131400', love: 1, hate: 3000, money: 131400 }, | |
| { text: '默默收下,什么也不说', effect: '低调才是王道~💰 收到+131400', love: 1, hate: 0, money: 131400 }, | |
| { text: '退回去,说"我不是为了钱"', effect: '男友超级感动!觉得你和那些女人不一样❤️ 恩爱度+3', love: 3, hate: 0, money: 0 }, | |
| { text: '发微博说"谢谢哥哥的零花钱😜"', effect: '彻底激怒粉丝!🔥 被骂上热搜第一 黑粉+8000', love: 2, hate: 8000, money: 131400 } | |
| ] | |
| } | |
| ]; | |
| // 快速回复选项 | |
| const quickReplyOptions = [ | |
| '你在狗叫什么?', | |
| '急了急了急了?', | |
| '关你屁事', | |
| '哦,所以呢?', | |
| '羡慕嫉妒恨?', | |
| '我就不分手,气死你😜', | |
| '你算什么东西?', | |
| '谢谢关心,我们很好~', | |
| '建议去看看心理医生', | |
| '就喜欢看你看不惯我又干不掉我的样子', | |
| '你哥哥更爱我哦❤️', | |
| '你说你的,我过我的' | |
| ]; | |
| // 初始化 | |
| function init() { | |
| loadData(); | |
| updateDisplay(); | |
| generateMessages(); | |
| generateWechats(); | |
| renderWeiboList(); | |
| showStory(); | |
| } | |
| function loadData() { | |
| const saved = localStorage.getItem('sisterInLawSim'); | |
| if (saved) { | |
| gameData = JSON.parse(saved); | |
| } | |
| } | |
| function saveData() { | |
| localStorage.setItem('sisterInLawSim', JSON.stringify(gameData)); | |
| } | |
| function updateDisplay() { | |
| document.getElementById('playerName').textContent = gameData.playerName; | |
| document.getElementById('playerBio').textContent = gameData.bio; | |
| document.getElementById('hatersCount').textContent = formatNumber(gameData.haters); | |
| document.getElementById('followerCount').textContent = formatNumber(gameData.followers); | |
| const loveHearts = '❤️'.repeat(Math.min(gameData.loveLevel, 5)) || '💔'; | |
| document.getElementById('loveLevel').textContent = loveHearts; | |
| document.getElementById('virtualAddress').textContent = gameData.virtualAddress; | |
| document.getElementById('unreadDm').textContent = gameData.messages.length + ' 条辱骂私信'; | |
| // 更新头像 | |
| if (gameData.avatar) { | |
| const avatarContainers = document.querySelectorAll('.avatar'); | |
| avatarContainers.forEach(container => { | |
| container.innerHTML = `<img src="${gameData.avatar}" alt="头像">`; | |
| }); | |
| } | |
| // 填充设置页面的输入框 | |
| document.getElementById('nameInput').value = gameData.playerName; | |
| document.getElementById('bioInput').value = gameData.bio.replace('💍 ', ''); | |
| document.getElementById('boyfriendInput').value = gameData.boyfriendName; | |
| document.getElementById('addressInput').value = gameData.virtualAddress; | |
| } | |
| function formatNumber(num) { | |
| if (num >= 10000) { | |
| return (num / 10000).toFixed(1) + 'w'; | |
| } | |
| return num.toString(); | |
| } | |
| function generateMessages() { | |
| if (gameData.messages.length === 0) { | |
| for (let i = 0; i < 30; i++) { | |
| const msg = hateMessages[Math.floor(Math.random() * hateMessages.length)]; | |
| gameData.messages.push({ | |
| id: Date.now() + i, | |
| sender: msg.sender, | |
| content: msg.content, | |
| time: getRandomTime(), | |
| unread: true, | |
| replies: [] | |
| }); | |
| } | |
| saveData(); | |
| } | |
| renderMessageList(); | |
| } | |
| function generateWechats() { | |
| if (gameData.wechats.length === 0) { | |
| // 男友微信 | |
| gameData.wechats.push({ | |
| id: 'boyfriend', | |
| name: gameData.boyfriendName + '❤️', | |
| avatar: '👨', | |
| type: 'boyfriend', | |
| lastMessage: '宝贝在干嘛呢~', | |
| messages: [ | |
| { type: 'theirs', content: '宝贝在干嘛呢~', time: '刚刚' } | |
| ], | |
| unread: 1 | |
| }); | |
| // 私生饭微信 | |
| gameData.wechats.push({ | |
| id: 'sasaeng1', | |
| name: '???', | |
| avatar: '👤', | |
| type: 'sasaeng', | |
| lastMessage: sasaengWechat[0].content, | |
| messages: [ | |
| { type: 'theirs', content: sasaengWechat[0].content, time: '刚刚' } | |
| ], | |
| unread: 1 | |
| }); | |
| saveData(); | |
| } | |
| renderWechatList(); | |
| } | |
| function getRandomTime() { | |
| const mins = Math.floor(Math.random() * 60); | |
| if (mins < 5) return '刚刚'; | |
| return mins + '分钟前'; | |
| } | |
| function switchTab(tab) { | |
| // 隐藏所有页面 | |
| document.getElementById('homePage').style.display = 'none'; | |
| document.getElementById('dmPage').style.display = 'none'; | |
| document.getElementById('wechatPage').style.display = 'none'; | |
| document.getElementById('weiboPage').style.display = 'none'; | |
| document.getElementById('storyPage').style.display = 'none'; | |
| document.getElementById('settingsPage').style.display = 'none'; | |
| // 移除所有激活状态 | |
| document.querySelectorAll('.nav-item').forEach(item => item.classList.remove('active')); | |
| // 显示对应页面 | |
| const pageMap = { | |
| 'home': 'homePage', | |
| 'messages': 'dmPage', | |
| 'wechat': 'wechatPage', | |
| 'weibo': 'weiboPage', | |
| 'story': 'storyPage', | |
| 'settings': 'settingsPage' | |
| }; | |
| const navIndex = { | |
| 'home': 0, | |
| 'messages': 1, | |
| 'wechat': 2, | |
| 'weibo': 3, | |
| 'story': 4 | |
| }; | |
| if (tab === 'settings') { | |
| document.getElementById(pageMap[tab]).style.display = 'block'; | |
| } else { | |
| document.getElementById(pageMap[tab]).style.display = 'block'; | |
| document.querySelectorAll('.nav-item')[navIndex[tab]].classList.add('active'); | |
| } | |
| } | |
| // 上传头像 | |
| function uploadAvatar(event) { | |
| const file = event.target.files[0]; | |
| if (file) { | |
| const reader = new FileReader(); | |
| reader.onload = function(e) { | |
| gameData.avatar = e.target.result; | |
| saveData(); | |
| updateDisplay(); | |
| }; | |
| reader.readAsDataURL(file); | |
| } | |
| } | |
| function renderMessageList() { | |
| const container = document.getElementById('messageList'); | |
| container.innerHTML = gameData.messages.slice(0, 30).map((msg, index) => ` | |
| <div class="message-item" onclick="openChat('dm', ${index})"> | |
| <div class="message-header"> | |
| <div class="sender-avatar">😠</div> | |
| <div class="sender-name">${msg.sender}</div> | |
| ${msg.unread ? '<span class="unread-badge">1</span>' : ''} | |
| </div> | |
| <div class="message-preview">${msg.content}</div> | |
| </div> | |
| `).join(''); | |
| } | |
| function renderWechatList() { | |
| const container = document.getElementById('wechatList'); | |
| container.innerHTML = gameData.wechats.map((chat, index) => ` | |
| <div class="chat-item" onclick="openChat('wechat', ${index})"> | |
| <div class="chat-avatar" style="background: ${chat.type === 'boyfriend' ? '#ff6b6b' : '#666'}"> | |
| ${chat.avatar} | |
| </div> | |
| <div class="chat-info"> | |
| <div style="display: flex; justify-content: space-between;"> | |
| <div class="chat-name">${chat.name}</div> | |
| <div class="chat-time">刚刚</div> | |
| </div> | |
| <div class="chat-preview">${chat.lastMessage}</div> | |
| </div> | |
| </div> | |
| `).join(''); | |
| } | |
| let currentChatType = ''; | |
| let currentChatIndex = -1; | |
| function openChat(type, index) { | |
| currentChatType = type; | |
| currentChatIndex = index; | |
| const chat = type === 'dm' | |
| ? gameData.messages[index] | |
| : gameData.wechats[index]; | |
| document.getElementById('chatPartnerName').textContent = | |
| type === 'dm' ? chat.sender : chat.name; | |
| document.getElementById('chatPage').style.display = 'block'; | |
| // 标记已读 | |
| if (type === 'dm') { | |
| gameData.messages[index].unread = false; | |
| } else { | |
| gameData.wechats[index].unread = 0; | |
| } | |
| saveData(); | |
| renderChatContent(); | |
| renderQuickReplies(); | |
| // 滚动到底部 | |
| setTimeout(() => { | |
| const chatContent = document.getElementById('chatContent'); | |
| chatContent.scrollTop = chatContent.scrollHeight; | |
| }, 100); | |
| } | |
| function closeChat() { | |
| document.getElementById('chatPage').style.display = 'none'; | |
| currentChatType = ''; | |
| currentChatIndex = -1; | |
| } | |
| function renderChatContent() { | |
| const container = document.getElementById('chatContent'); | |
| let messages = []; | |
| if (currentChatType === 'dm') { | |
| const msg = gameData.messages[currentChatIndex]; | |
| messages.push({ type: 'theirs', content: msg.content, time: msg.time }); | |
| msg.replies.forEach(reply => { | |
| messages.push({ type: 'mine', content: reply.content, time: reply.time }); | |
| if (reply.fanReply) { | |
| messages.push({ type: 'theirs', content: reply.fanReply, time: '刚刚' }); | |
| } | |
| }); | |
| } else { | |
| const chat = gameData.wechats[currentChatIndex]; | |
| messages = chat.messages; | |
| } | |
| container.innerHTML = messages.map(msg => ` | |
| <div class="chat-bubble ${msg.type}"> | |
| ${msg.content} | |
| </div> | |
| `).join(''); | |
| } | |
| function renderQuickReplies() { | |
| const container = document.getElementById('quickReplies'); | |
| container.innerHTML = quickReplyOptions.map(text => ` | |
| <div class="quick-reply" onclick="quickReply('${text}')">${text}</div> | |
| `).join(''); | |
| } | |
| function quickReply(text) { | |
| document.getElementById('chatInput').value = text; | |
| sendMessage(); | |
| } | |
| function sendMessage() { | |
| const input = document.getElementById('chatInput'); | |
| const content = input.value.trim(); | |
| if (!content) return; | |
| if (currentChatType === 'dm') { | |
| // 粉丝私信回复 - 超级智能的回复类型判断 | |
| const msg = gameData.messages[currentChatIndex]; | |
| // 智能判断回复类型 | |
| let replyType = 'neutral'; | |
| // 检测关键词来选择回复类型 | |
| const lowerContent = content.toLowerCase(); | |
| // 超级嚣张/挑衅 -> 超级攻击性回复 | |
| if (lowerContent.includes('气死') || lowerContent.includes('哈哈') || | |
| lowerContent.includes('略略略') || lowerContent.includes('就不') || | |
| lowerContent.includes('怎么') || lowerContent.includes('你管') || | |
| lowerContent.includes('凭什么') || lowerContent.includes('🐶') || | |
| lowerContent.includes('狗') || lowerContent.includes('急')) { | |
| const types = ['superAggressive', 'jeaous', 'curse', 'exclaim']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 阴阳怪气/怼人 -> 攻击性回复 | |
| else if (lowerContent.includes('哦') || lowerContent.includes('所以呢') || | |
| lowerContent.includes('然后呢') || lowerContent.includes('关你') || | |
| lowerContent.includes('随便') || lowerContent.includes('你谁')) { | |
| const types = ['aggressive', 'sarcastic', 'question', 'doubtful']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 秀恩爱/提男友 -> 嫉妒回复 | |
| else if (lowerContent.includes('哥哥') || lowerContent.includes('男朋友') || | |
| lowerContent.includes('爱') || lowerContent.includes('❤️') || | |
| lowerContent.includes('他') || lowerContent.includes('老公')) { | |
| const types = ['jeaous', 'curse', 'aggressive']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 态度很好/很客气 -> 阴阳怪气 | |
| else if (lowerContent.includes('谢谢') || lowerContent.includes('好的') || | |
| lowerContent.includes('嗯') || lowerContent.includes('哦')) { | |
| const types = ['nice', 'sarcastic', 'irony', 'mimic']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 说脏话 -> 脏话回敬 | |
| else if (lowerContent.includes('操') || lowerContent.includes('草') || | |
| lowerContent.includes('傻逼') || lowerContent.includes('滚') || | |
| lowerContent.includes('死') || lowerContent.includes('nm') || | |
| lowerContent.includes('nmsl')) { | |
| const types = ['curse', 'superAggressive', 'threat', 'exclaim']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 字数很少 -> 问号刷屏/无语 | |
| else if (content.length <= 3) { | |
| const types = ['question', 'speechless', 'neutral', 'exclaim']; | |
| replyType = types[Math.floor(Math.random() * types.length)]; | |
| } | |
| // 其他情况 - 完全随机生成回复,不需要单独判断类型 | |
| // 直接由 getHateSpeechByContext 处理 | |
| // 使用算法生成无限不重复的黑粉回复(10万+种组合) | |
| const fanReply = getHateSpeechByContext(content); | |
| msg.replies.push({ | |
| content: content, | |
| time: '刚刚', | |
| fanReply: fanReply | |
| }); | |
| // 根据回复嚣张程度增加黑粉数 | |
| if (replyType === 'superAggressive' || replyType === 'curse' || replyType === 'jeaous') { | |
| gameData.haters += Math.floor(Math.random() * 300) + 200; | |
| } else { | |
| gameData.haters += Math.floor(Math.random() * 150) + 50; | |
| } | |
| } else { | |
| // 微信回复 | |
| const chat = gameData.wechats[currentChatIndex]; | |
| chat.messages.push({ type: 'mine', content: content, time: '刚刚' }); | |
| if (chat.type === 'boyfriend') { | |
| // 男友回复 | |
| setTimeout(() => { | |
| const replies = ['么么哒~😘', '好的宝贝❤️', '爱你哦~', '宝贝真可爱', '收到~', | |
| '别理那些人,有我呢', '今晚带你去吃好吃的', '想买什么随便买', | |
| '抱抱宝贝😘', '别生气啦~']; | |
| const reply = replies[Math.floor(Math.random() * replies.length)]; | |
| chat.messages.push({ type: 'theirs', content: reply, time: '刚刚' }); | |
| gameData.loveLevel += 0.5; | |
| saveData(); | |
| updateDisplay(); | |
| renderChatContent(); | |
| }, 1000); | |
| } else if (chat.type === 'sasaeng') { | |
| // 私生饭回复 - 算法生成超级恶毒的回复 | |
| setTimeout(() => { | |
| const types = ['curse', 'threat', 'superAggressive', 'aggressive']; | |
| const replyType = types[Math.floor(Math.random() * types.length)]; | |
| const reply = generateHateSpeech(replyType); | |
| chat.messages.push({ type: 'theirs', content: reply, time: '刚刚' }); | |
| gameData.haters += 300; | |
| saveData(); | |
| updateDisplay(); | |
| renderChatContent(); | |
| }, 1000); | |
| } | |
| } | |
| saveData(); | |
| updateDisplay(); | |
| renderChatContent(); | |
| input.value = ''; | |
| } | |
| function openPostModal() { | |
| document.getElementById('postModal').classList.add('active'); | |
| } | |
| function closePostModal() { | |
| document.getElementById('postModal').classList.remove('active'); | |
| } | |
| function fillPost(content) { | |
| document.getElementById('postContent').value = content; | |
| } | |
| function publishWeibo() { | |
| const content = document.getElementById('postContent').value.trim(); | |
| if (!content) return; | |
| const comments = []; | |
| const commentCount = Math.floor(Math.random() * 30) + 20; | |
| for (let i = 0; i < commentCount; i++) { | |
| const commentText = weiboComments[Math.floor(Math.random() * weiboComments.length)]; | |
| const names = ['爱哥哥的小猫咪', '哥哥的小老婆', '唯爱哥哥一万年', '哥哥的小仙女', '守护哥哥一辈子']; | |
| comments.push({ | |
| id: Date.now() + i, | |
| user: names[Math.floor(Math.random() * names.length)], | |
| content: commentText, | |
| likes: Math.floor(Math.random() * 1000) + 100 | |
| }); | |
| } | |
| const weibo = { | |
| id: Date.now(), | |
| content: content, | |
| time: '刚刚', | |
| reposts: Math.floor(Math.random() * 5000) + 1000, | |
| comments: comments, | |
| likes: Math.floor(Math.random() * 10000) + 5000 | |
| }; | |
| gameData.weibos.unshift(weibo); | |
| gameData.haters += comments.length * 50; | |
| gameData.followers += Math.floor(Math.random() * 5000); | |
| saveData(); | |
| updateDisplay(); | |
| renderWeiboList(); | |
| closePostModal(); | |
| document.getElementById('postContent').value = ''; | |
| } | |
| function renderWeiboList() { | |
| const container = document.getElementById('weiboList'); | |
| // 如果没有微博,显示默认 | |
| if (gameData.weibos.length === 0) { | |
| container.innerHTML = ` | |
| <div class="weibo-card"> | |
| <div class="weibo-user"> | |
| <div class="weibo-avatar">👩</div> | |
| <div> | |
| <div class="weibo-name">${gameData.playerName}</div> | |
| <div class="weibo-time">关注了你</div> | |
| </div> | |
| </div> | |
| <div style="text-align: center; padding: 30px; color: #999;"> | |
| 点击右上角发微博开始你的表演~ | |
| </div> | |
| </div> | |
| `; | |
| return; | |
| } | |
| container.innerHTML = gameData.weibos.slice(0, 10).map(weibo => ` | |
| <div class="weibo-card"> | |
| <div class="weibo-user"> | |
| <div class="weibo-avatar">👩</div> | |
| <div> | |
| <div class="weibo-name">${gameData.playerName}</div> | |
| <div class="weibo-time">${weibo.time}</div> | |
| </div> | |
| </div> | |
| <div class="weibo-content">${weibo.content}</div> | |
| <div class="weibo-actions"> | |
| <div class="weibo-action">🔄 ${formatNumber(weibo.reposts)}</div> | |
| <div class="weibo-action">💬 ${weibo.comments.length}</div> | |
| <div class="weibo-action">❤️ ${formatNumber(weibo.likes)}</div> | |
| </div> | |
| <div class="comment-section"> | |
| ${weibo.comments.slice(0, 3).map(comment => ` | |
| <div class="comment-item"> | |
| <div class="comment-avatar">😠</div> | |
| <div class="comment-content"> | |
| <div class="comment-user">${comment.user}</div> | |
| <div class="comment-text">${comment.content}</div> | |
| </div> | |
| </div> | |
| `).join('')} | |
| <div style="text-align: center; color: #999; font-size: 12px; margin-top: 10px;"> | |
| 还有${weibo.comments.length - 3}条恶评... | |
| </div> | |
| </div> | |
| </div> | |
| `).join(''); | |
| } | |
| function showStory() { | |
| const story = stories[gameData.currentStory % stories.length]; | |
| document.getElementById('storyTitle').textContent = story.title; | |
| document.getElementById('storyContent').textContent = story.content; | |
| document.getElementById('optionList').innerHTML = story.options.map((opt, index) => ` | |
| <div class="story-option" onclick="chooseOption(${index})">${opt.text}</div> | |
| `).join(''); | |
| document.getElementById('storyResult').innerHTML = ''; | |
| } | |
| function chooseOption(optionIndex) { | |
| const story = stories[gameData.currentStory % stories.length]; | |
| const option = story.options[optionIndex]; | |
| if (option.love) gameData.loveLevel += option.love; | |
| if (option.hate) gameData.haters += option.hate; | |
| if (option.money) gameData.money += option.money; | |
| gameData.currentStory++; | |
| saveData(); | |
| updateDisplay(); | |
| document.getElementById('storyResult').innerHTML = ` | |
| <div class="story-result"> | |
| <strong>✨ 结果</strong><br><br> | |
| ${option.effect}<br><br> | |
| <button class="send-btn" style="padding: 10px 20px;" onclick="showStory()"> | |
| 下一个剧情 → | |
| </button> | |
| </div> | |
| `; | |
| } | |
| function saveSettings() { | |
| gameData.playerName = document.getElementById('nameInput').value || gameData.playerName; | |
| gameData.bio = '💍 ' + (document.getElementById('bioInput').value || '顶流爱豆正牌女友'); | |
| gameData.boyfriendName = document.getElementById('boyfriendInput').value || gameData.boyfriendName; | |
| gameData.virtualAddress = document.getElementById('addressInput').value || gameData.virtualAddress; | |
| saveData(); | |
| updateDisplay(); | |
| alert('设置保存成功!'); | |
| // 切换回首页 | |
| switchTab('home'); | |
| } | |
| // 初始化 | |
| init(); | |
| </script> | |
| </body> | |
| </html> |
Xet Storage Details
- Size:
- 99.3 kB
- Xet hash:
- 4a17aacc151c3082f7617474fb6116bd980be3a27f6788968531778d78bed96c
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.