Commit 4e75b2a
feat(soccer-demo): 足球小游戏 demo + 心情/难度/气泡 API (Project-N-E-K-O#927)
* fix(autostart-prompt): 接收 shell 端 autostart CHANGED 事件,托盘切换后立即失效本地缓存
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
* feat(soccer-demo): 足球小游戏 demo,VRM/L2D 双角色 + 心情/难度/气泡 API
- 新页面 /soccer_demo:玩家 VRM sister、AI L2D mao_pro,鼠标走位、蓄力射门、圆形碰撞、球门计分
- AI 状态机(attack/defend/clear)+ 球预判 + 反应延时 + 踢球技能(瞄门角、随机扰动)
- 4 档难度循环(max/lv2/lv3/lv4,前摇 + 冷却 + 速度 + 是否允许进攻),每进球自动切档
- 6 种心情(calm/happy/angry/relaxed/sad/surprised)叠乘速度/冷却/冲量/散射 + startle/zoneout 特殊行为,默认 20s 随机轮换
- 气泡系统 + 事件流:window.SoccerDemo 暴露 setMood/setDifficulty/setAvatar/say/onSpeak/onEvent/setBubbleRenderer 等接口,供 neko 本体集成 LLM 和美术素材
- 球死角脱困:时间窗位移检测 + 幽灵穿模 + 强制撤退,避免 AI 把球顶墙
- static/vrm-core.js: init 加 options.embed 参数,跳过全屏容器样式覆写,支持 200x300 嵌入模式
- main_routers/pages_router.py: 加 /soccer_demo 路由
* fix(soccer-demo): 接 review 反馈(CodeRabbit / Codex / code-quality)
- setAiAvatar: 去掉 50ms setTimeout race,改用 currentModel 就绪轮询(20s 超时),避免 rAF throttle 环境下外部调用者被挂死
- setPlayerAvatar: 换模型时调用 VRMUtils.deepDispose 释放旧 VRM 的 GPU 资源(geometry/material/texture),防止多次切换泄漏
- aiRetreatSec 1.0→1.8,与 unstickCd 对齐,消除撤退提前解锁的 0.8s 空窗
- 删除未使用的 tryKick(玩家已改蓄力系统)、zoneoutSec 变量、speechTick 里未用的 H
- 清理 kickBall / checkGoal / aiMoodTick 里几处 typeof X === 'function' 恒真守卫(同作用域函数声明,被静态分析点出恒为 true)
* fix(soccer-demo): setAiAvatar 用完整路径比对,避免同名不同目录的 L2D 模型误判就绪
---------
Co-authored-by: Hongzhi Wen <cartabio.coder1@gmail.com>
Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>1 parent 95ba77c commit 4e75b2a
3 files changed
Lines changed: 1646 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
61 | 71 | | |
62 | 72 | | |
63 | 73 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
362 | 362 | | |
363 | 363 | | |
364 | 364 | | |
365 | | - | |
| 365 | + | |
366 | 366 | | |
367 | 367 | | |
| 368 | + | |
368 | 369 | | |
369 | 370 | | |
370 | 371 | | |
| |||
383 | 384 | | |
384 | 385 | | |
385 | 386 | | |
386 | | - | |
387 | | - | |
388 | | - | |
389 | | - | |
390 | | - | |
391 | | - | |
392 | | - | |
393 | | - | |
394 | | - | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
395 | 398 | | |
396 | 399 | | |
397 | 400 | | |
| |||
0 commit comments