@@ -33,15 +33,15 @@ takeover_return_control
3333高亮流程:
3434
35351 . ` runWakeupPrelude() ` 完成苏醒后进入聊天 intro。
36- 2 . 普通首页模式调用 ` ensureChatVisible() ` ,再用 ` focusAndHighlightChatInput() ` 把 persistent spotlight 放到聊天输入区 。
37- 3 . 气泡锚定输入区,手动定位到输入框正上方 。
38- 4 . 外置聊天窗模式不高亮首页输入区 ,改为 ` setExternalizedChatSpotlight('window ') ` 。
36+ 2 . 普通首页模式调用 ` ensureChatVisible() ` ,再用 ` focusAndHighlightChatInput() ` 把 persistent spotlight 放到 React compact 胶囊对话输入框 。
37+ 3 . 气泡锚定 compact 胶囊输入框,手动定位到胶囊正上方 。
38+ 4 . 外置聊天窗模式不高亮首页胶囊输入框 ,改为 ` setExternalizedChatSpotlight('input ') ` ,由独立 ` /chat ` 页高亮自己的 compact 胶囊输入框 。
3939
4040ghost cursor 流程:
4141
42- 1 . 普通首页模式读取输入区 rect。
43- 2 . cursor 出现在输入区中心 。
44- 3 . cursor 先 wobble,等待用户点击输入区完成激活 。
42+ 1 . 普通首页模式读取 compact 胶囊输入框 rect。
43+ 2 . cursor 出现在胶囊输入框中心 。
44+ 3 . cursor 先 wobble,等待用户点击胶囊输入框完成激活 。
45454 . 用户激活后隐藏提示气泡,overlay 进入 taking-over 状态,cursor 再 wobble 一次。
4646
4747注意:
@@ -55,17 +55,17 @@ ghost cursor 流程:
5555
56561 . ` tutorial.yuiGuide.lines.introGreetingReply `
5757 - 中文:“微风、阳光,还有刚刚好出现的你。初次见面,我是林悠怡……”
58- 2 . 文本进入聊天窗口 ,语音 key 为 ` intro_greeting_reply ` 。
58+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` intro_greeting_reply ` 。
5959
6060高亮流程:
6161
62- 1 . 这一段延续上一阶段输入区/聊天区的 spotlight 状态。
62+ 1 . 这一段延续上一阶段 compact 胶囊输入框的 spotlight 状态。
63632 . 不打开新的业务面板。
64643 . 不执行真实 UI 点击。
6565
6666ghost cursor 流程:
6767
68- 1 . 激活后 cursor 保持在输入区附近 。
68+ 1 . 激活后 cursor 保持在 compact 胶囊输入框附近 。
69692 . 这一段主要由 YUI 模型演出承接,ghost cursor 不负责展示新 UI。
7070
7171时间 cue:
@@ -79,17 +79,17 @@ ghost cursor 流程:
7979
80801 . ` tutorial.yuiGuide.lines.introBasic `
8181 - 中文:“这里有一个神奇的小按钮!只要点击它,就可以直接和我聊天啦!……”
82- 2 . 文本进入聊天窗口 ,语音 key 为 ` intro_basic ` 。
82+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` intro_basic ` 。
8383
8484高亮流程:
8585
86861 . ` runIntroVoiceControlButtonShowcase() ` 先调用 ` highlightChatWindow() ` 。
87- 2 . persistent spotlight 放到聊天窗口 ;如果是外置聊天窗,则同步外置窗口 spotlight。
87+ 2 . 普通首页模式下, persistent spotlight 放到 React compact 胶囊对话输入框 ;如果是外置聊天窗,则同步独立 ` /chat ` 页的 compact 胶囊输入框 spotlight。
88883 . action spotlight 放到语音控制按钮,也就是 ` #${p}-btn-mic ` 的圆形按钮 shell。
8989
9090ghost cursor 流程:
9191
92- 1 . 如果 cursor 还没有位置,先从输入区或默认原点出现 。
92+ 1 . 如果 cursor 还没有位置,先从 compact 胶囊输入框或默认原点出现 。
93932 . cursor 在旁白前段移动到语音控制按钮中心。
94943 . 移动时长按语音时长约 16% 估算,限制在 900-2200ms。
95954 . 当前流程只展示按钮,不点击语音按钮。
@@ -98,7 +98,7 @@ ghost cursor 流程:
9898
99991 . 进入语音入口展示时,director 调用 ` YuiGuideAvatarStage.startIntroVoiceCursorLookAt() ` 建立短 session,只锁 ` lookAt ` ,不接管 ` motion ` 或 ` expression ` 。
1001002 . 该 session 期间打开 ` window.nekoYuiGuideIntroVoiceLookAtActive ` ,只让第 2 段绕过新手教程正脸锁的视线归零逻辑。
101- 3 . cursor 从输入区移动到语音控制按钮期间 ,模型面部和视线跟随 ghost cursor 当前坐标;实现上由 director 提供 ` overlay.getCursorPosition() ` ,adapter 每帧把该点喂给 Live2D 的 ` model.focus(x, y) ` ,并以 Live2D 头部/气泡锚点作为 LookAt 原点,在 Yui 专用 temporary pose 中直接写入 ` ParamAngleX/Y/Z ` 、` ParamEyeBallX/Y ` 、` ParamBodyAngleX/Y/Z ` 。
101+ 3 . cursor 从 compact 胶囊输入框移动到语音控制按钮期间 ,模型面部和视线跟随 ghost cursor 当前坐标;实现上由 director 提供 ` overlay.getCursorPosition() ` ,adapter 每帧把该点喂给 Live2D 的 ` model.focus(x, y) ` ,并以 Live2D 头部/气泡锚点作为 LookAt 原点,在 Yui 专用 temporary pose 中直接写入 ` ParamAngleX/Y/Z ` 、` ParamEyeBallX/Y ` 、` ParamBodyAngleX/Y/Z ` 。
1021024 . cursor 到达语音控制按钮并短暂停留时,模型面部和视线也停在按钮方向,强化“她在看这个按钮”的因果关系。
1031035 . Live2D 的 temporary pose override 会在原始 ` coreModel.update() ` 后再应用一次,确保本段 ghost cursor LookAt 不被正脸锁、SDK 原始 update、motion 或 focusController 在同一帧覆盖掉。
1041046 . 语音入口展示结束后,director 在 ` finally ` 中停止 handle;adapter 清理本段 temporary pose、恢复捕获到的参数、清零 Live2D ` focusController ` ,并关闭 ` nekoYuiGuideIntroVoiceLookAtActive ` ,让教程正脸锁继续接管后续阶段。
@@ -114,13 +114,13 @@ ghost cursor 流程:
114114
1151151 . ` tutorial.yuiGuide.lines.takeoverCaptureCursor `
116116 - 中文:“超级魔法开关出现!只要点一下这里,我就可以把小爪子伸到你的键盘和鼠标上啦!……”
117- 2 . 文本进入聊天窗口 ,语音 key 为 ` takeover_capture_cursor ` 。
117+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` takeover_capture_cursor ` 。
1181183 . 旁白和 UI 自动操作并行执行。
119119
120120高亮流程:
121121
1221221 . 场景开始时 overlay 进入 taking-over。
123- 2 . persistent spotlight 先回到聊天窗口,表示台词仍在聊天区输出 。
123+ 2 . persistent spotlight 先回到 compact 胶囊对话输入框,表示台词仍属于聊天上下文 。
1241243 . 猫爪按钮 ` #${p}-btn-agent ` 被作为 retained extra spotlight 保留。
1251254 . 点击猫爪后打开猫爪/Agent 面板。
1261265 . 猫爪总开关 ` agent-master ` 用虚拟 spotlight ` takeover-agent-master-toggle ` 扩大高亮范围。
@@ -155,7 +155,7 @@ ghost cursor 流程:
155155
1561561 . ` tutorial.yuiGuide.lines.takeoverPluginPreviewHome `
157157 - 中文:“还没完呢!你快看快看,这里还有超多好玩的插件呢!”
158- 2 . 文本进入聊天窗口 ,语音 key 为 ` takeover_plugin_preview_home ` 。
158+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` takeover_plugin_preview_home ` 。
159159
160160高亮流程一:
161161
@@ -177,7 +177,7 @@ ghost cursor 流程一:
177177
1781781 . ` tutorial.yuiGuide.lines.takeoverPluginPreviewDashboard `
179179 - 中文:“有了它们,我不光能看 B 站弹幕,还能帮你关灯开空调……”
180- 2 . 插件 dashboard 打开后,文本仍追加到聊天窗口 。
180+ 2 . 插件 dashboard 打开后,文本仍追加到 React chat 教程消息流 。
1811813 . 语音 key 为 ` takeover_plugin_preview_dashboard ` 。
182182
183183高亮流程二:
@@ -205,13 +205,13 @@ ghost cursor 流程二:
205205
2062061 . ` tutorial.yuiGuide.lines.takeoverSettingsPeekIntro `
207207 - 中文:“当然啦,如果你想让本喵多和你聊聊天,也不是不行啦……设置都在这个齿轮里。”
208- 2 . 文本进入聊天窗口 ,语音 key 为 ` takeover_settings_peek_intro ` 。
208+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` takeover_settings_peek_intro ` 。
209209
210210高亮流程一:
211211
2122121 . 场景开始先关闭猫爪/Agent 面板。
2132132 . settings 按钮 ` #${p}-btn-settings ` 被设置为圆形 spotlight,并作为 retained extra spotlight 保留。
214- 3 . persistent spotlight 仍放在聊天窗口 。
214+ 3 . persistent spotlight 仍放在 compact 胶囊对话输入框 。
2152154 . 到 ` openSettingsPanel ` 语音 cue 时,action spotlight 放到 settings 按钮。
216216
217217ghost cursor 流程一:
@@ -227,7 +227,7 @@ ghost cursor 流程一:
2272272 . ` tutorial.yuiGuide.lines.takeoverSettingsPeekDetailPart2 `
228228 - 中文:“等一下!你在干嘛?该不会是想把我换掉吧?啊啊啊不行!快关掉,快关掉!”
2292293 . 语音 key 统一为 ` takeover_settings_peek_detail ` 。
230- 4 . 第一段先以流式消息进入聊天窗口 ,第二段在 ` showSecondLine ` cue 到达时追加。
230+ 4 . 第一段先以流式消息追加到 React chat 教程消息流 ,第二段在 ` showSecondLine ` cue 到达时追加。
231231
232232高亮流程二:
233233
@@ -267,7 +267,7 @@ ghost cursor 流程二:
267267
2682681 . ` tutorial.yuiGuide.lines.takeoverReturnControl `
269269 - 中文:“好啦好啦,不霸占你的电脑啦!控制权还给你了喵!……”
270- 2 . 文本进入聊天窗口 ,语音 key 为 ` takeover_return_control ` 。
270+ 2 . 文本追加到 React chat 教程消息流 ,语音 key 为 ` takeover_return_control ` 。
2712713 . 语音播放到 70% 时触发 ` returnPetalTransition ` cue。
272272
273273高亮流程:
@@ -311,7 +311,7 @@ ghost cursor 流程:
311311 - 中文:“喂!不要拽我啦,现在还没轮到你的回合呢!”
3123122 . 后续可能使用 ` tutorial.yuiGuide.lines.interruptResistLight3 `
313313 - 中文:“等一下啦!还没结束呢,不要这么随便打断我啦!”
314- 3 . 文本进入聊天窗口 ,不等待当前 scene 的流式暂停。
314+ 3 . 文本追加到 React chat 教程消息流 ,不等待当前 scene 的流式暂停。
315315
316316高亮流程:
317317
@@ -338,7 +338,7 @@ ghost cursor 流程:
338338
3393391 . ` tutorial.yuiGuide.lines.interruptAngryExit `
340340 - 中文:“人类!你真的很没礼貌喵!既然你这么想自己操作……”
341- 2 . 文本进入聊天窗口 ,允许 angry exit 期间继续流式输出。
341+ 2 . 文本追加到 React chat 教程消息流 ,允许 angry exit 期间继续流式输出。
342342
343343高亮流程:
344344
@@ -355,7 +355,7 @@ ghost cursor 流程:
355355
356356## 高亮类型速查
357357
358- 1 . persistent spotlight:持续高亮当前讲解上下文,例如聊天窗口、输入区 。
358+ 1 . persistent spotlight:持续高亮当前讲解上下文,例如 compact 胶囊对话输入框或当前业务面板 。
3593592 . action spotlight:当前 cursor 要移动/点击的主要目标,例如猫爪按钮、开关、设置按钮。
3603603 . secondary spotlight:辅助目标,主要由 ` applyGuideHighlights() ` 支持。
3613614 . retained extra spotlight:跨多个动作保留的目标,例如猫爪按钮、settings 按钮。
@@ -365,11 +365,11 @@ ghost cursor 流程:
365365
366366## 维护规则
367367
368- 1 . 新增教程台词时,先确认文本输出位置:聊天窗口 、overlay 气泡,还是外部页面 handoff。
368+ 1 . 新增教程台词时,先确认文本输出位置:React chat 教程消息流 、overlay 气泡,还是外部页面 handoff。聊天上下文高亮优先落到 compact 胶囊对话输入框;外置 ` /chat ` 模式也应同步 ` input ` spotlight,不要回退到旧整窗高亮 。
3693692 . 每段台词最多有一个主 persistent spotlight;多个 UI 目标应使用 action/secondary/extra,而不是反复重设 persistent。
3703703 . ghost cursor 的移动必须跟真实 UI 操作一致:先高亮,再移动,再 click,再调用真实打开/开关 API。
3713714 . 不能只移动 cursor 而不执行真实状态变更,也不能只改状态而没有可见 click 反馈。
3723725 . dashboard、settings 等跨面板流程结束时必须清理 retained、virtual、scene extra 和 action spotlight。
3733736 . 打断分支要暂停并恢复当前 scene,不能把抵抗文本当成新的主线 step。
3743747 . 如果某个目标找不到,当前流程应安全跳过或走 fallback,不能卡死教程。
375- 8 . 外置聊天窗模式没有首页输入框激活 ,但后续台词、高亮和 takeover 主线仍继续。
375+ 8 . 外置聊天窗模式没有首页 compact 胶囊输入框激活 ,但后续台词、高亮和 takeover 主线仍继续。
0 commit comments