From 49f3978d11c4013d5648016993770a306442dbad Mon Sep 17 00:00:00 2001 From: Cola-Echo Date: Tue, 30 Dec 2025 02:02:15 +0800 Subject: [PATCH] Add files via upload --- gift.js | 6 +- toy-control.js | 195 ++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 156 insertions(+), 45 deletions(-) diff --git a/gift.js b/gift.js index 7c1d178..c26671b 100644 --- a/gift.js +++ b/gift.js @@ -43,9 +43,9 @@ const GIFT_CATEGORIES = { { id: 'breastChain', name: '微电流乳链', emoji: '⚡', desc: '微电流乳链', hasControl: true, hasShock: true }, { id: 'analPlug', name: '肛塞', emoji: '🔌', desc: '震动肛塞', hasControl: true, hasShock: false }, { id: 'cockRing', name: '锁精环', emoji: '💍', desc: '震动锁精环', hasControl: true, hasShock: false }, - { id: 'handcuffs', name: '手铐', emoji: '⛓️', desc: '情趣手铐', hasControl: false }, - { id: 'blindfold', name: '眼罩', emoji: '🎭', desc: '丝绸眼罩', hasControl: false }, - { id: 'whip', name: '皮鞭', emoji: '🏇', desc: '轻柔的皮鞭', hasControl: false }, + { id: 'breastPump', name: '吸奶器', emoji: '🍼', desc: '电动吸奶器', hasControl: true, hasShock: false }, + { id: 'clitSucker', name: '阴蒂吮吸器', emoji: '💋', desc: '吮吸震动二合一', hasControl: true, hasShock: false }, + { id: 'butterfly', name: '穿戴式小蝴蝶', emoji: '🦋', desc: '隐蔽穿戴震动', hasControl: true, hasShock: false }, { id: 'collar', name: '项圈', emoji: '⭕', desc: '精致的项圈', hasControl: false }, { id: 'candle', name: '低温蜡烛', emoji: '🕯️', desc: '安全的低温蜡烛', hasControl: false }, { id: 'lingerie', name: '情趣内衣', emoji: '👙', desc: '性感的情趣内衣', hasControl: false } diff --git a/toy-control.js b/toy-control.js index da9f4e1..7f7f0be 100644 --- a/toy-control.js +++ b/toy-control.js @@ -24,10 +24,22 @@ const TOY_ICONS = { cameraOn: ``, cameraOff: ``, // 像素爱心图标(用于多玩具切换) - pixelHeart: `` + pixelHeart: ``, + // 吮吸类玩具图标 + gentle: ``, + strong: ``, + pulse: `` }; -// 控制模式定义 +// 吮吸类玩具ID列表 +const SUCTION_TOY_IDS = ['breastPump', 'clitSucker']; + +// 判断是否是吮吸类玩具 +function isSuctionToy(giftId) { + return SUCTION_TOY_IDS.includes(giftId); +} + +// 震动类控制模式定义 const TOY_CONTROL_MODES = { classic: { id: 'classic', @@ -61,6 +73,40 @@ const TOY_CONTROL_MODES = { } }; +// 吮吸类控制模式定义 +const SUCTION_CONTROL_MODES = { + gentle: { + id: 'gentle', + name: '轻柔吮吸', + icon: TOY_ICONS.gentle, + desc: '温柔的吮吸节奏' + }, + start: { + id: 'start', + name: '开始吮吸', + icon: TOY_ICONS.start, + desc: '开始/继续吮吸' + }, + strong: { + id: 'strong', + name: '强力吮吸', + icon: TOY_ICONS.strong, + desc: '高强度吮吸' + }, + pulse: { + id: 'pulse', + name: '脉冲模式', + icon: TOY_ICONS.pulse, + desc: '有节奏的吸放' + }, + pause: { + id: 'pause', + name: '暂停', + icon: TOY_ICONS.pause, + desc: '暂停吮吸' + } +}; + // 电击按钮(仅微电流乳链) const SHOCK_BUTTON = { id: 'shock', @@ -178,40 +224,82 @@ function renderToyControlPage() { titleEl.textContent = `${toyControlState.gift.giftName} · ${targetText}`; } + // 判断当前玩具类型 + const isSuction = isSuctionToy(toyControlState.gift.giftId); + const modes = isSuction ? SUCTION_CONTROL_MODES : TOY_CONTROL_MODES; + // 渲染按钮 if (buttonsEl) { - let buttonsHtml = ` -
- - - -
-
- - - - -
- `; + let buttonsHtml; + if (isSuction) { + // 吮吸类玩具按钮布局 + buttonsHtml = ` +
+ + + +
+
+ + + + +
+ `; + } else { + // 震动类玩具按钮布局(原有) + buttonsHtml = ` +
+ + + +
+
+ + + + +
+ `; + } buttonsEl.innerHTML = buttonsHtml; } @@ -469,14 +557,26 @@ ${newToy.giftName}的特点:${newToy.giftDesc} hideToyTypingIndicator(); if (response) { - let reply = response.trim(); - reply = reply.replace(/<\s*meme\s*>[\s\S]*?<\s*\/\s*meme\s*>/gi, '').trim(); - reply = reply.replace(/\[.*?\]/g, '').trim(); - reply = reply.replace(/([^)]*)/g, '').trim(); - reply = reply.replace(/\([^)]*\)/g, '').trim(); + // 使用 splitAIMessages 分割多条消息 + const parts = splitAIMessages(response); - if (reply) { - addToyMessage('ai', reply); + for (let i = 0; i < parts.length; i++) { + let reply = parts[i].trim(); + reply = reply.replace(/<\s*meme\s*>[\s\S]*?<\s*\/\s*meme\s*>/gi, '').trim(); + reply = reply.replace(/\[.*?\]/g, '').trim(); + reply = reply.replace(/([^)]*)/g, '').trim(); + reply = reply.replace(/\([^)]*\)/g, '').trim(); + + // 如果不是第一条消息,显示typing并延迟 + if (i > 0 && reply) { + showToyTypingIndicator(); + await sleep(1500 + Math.random() * 1000); + hideToyTypingIndicator(); + } + + if (reply) { + addToyMessage('ai', reply); + } } } } catch (err) { @@ -682,8 +782,19 @@ function updateButtonState(buttonId) { function buildButtonPressPrompt(buttonId, buttonName, pressedBy) { const isCharacterUsing = toyControlState.target === 'character'; const isAIPress = pressedBy === 'ai'; + const isSuction = isSuctionToy(toyControlState.gift.giftId); - const modeEffects = { + // 根据玩具类型选择效果描述 + const modeEffects = isSuction ? { + // 吮吸类玩具效果 + gentle: '轻柔的吮吸开始了,温柔地包裹着敏感部位', + start: '吮吸开始/继续了', + strong: '吮吸力度突然加大,强烈的吸力让人难以抗拒', + pulse: '有节奏的吸放开始了,一收一放的刺激', + pause: '吮吸停止了,可以喘息一下', + shock: '一阵微电流刺激瞬间传来,让人猛地一颤' + } : { + // 震动类玩具效果 classic: '稳定持续的震动开始了', start: '震动开始/继续了', rampage: '震动突然变到最大强度,非常强烈的刺激袭来',