dsh-wuthering-waves-intro 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +1 -1
- package/README.md +105 -103
- package/assets/SOURCE.json +1 -1
- package/package.json +67 -67
- package/src/client.js +147 -147
package/NOTICE.md
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
插件原创代码采用 Apache License 2.0,条款见 [LICENSE](LICENSE)。`package.json` 的许可证字段指插件代码。
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
动画素材:鸣潮角色声痕动画。鸣潮相关素材归库洛游戏及相关权利人所有,包括本插件使用的视频、预览图、由画面提取的线稿及角色形象等。这些素材不属于上述代码许可证的授权范围。本项目不代表鸣潮、库洛游戏或 DeepSeek 官方。
|
|
6
6
|
|
|
7
7
|
线稿入场与粒子退场的构思参考了 [SoliSpark 的守岸人主题](https://github.com/SoliSpark/deepseek-harness-shorekeeper-theme)。
|
package/README.md
CHANGED
|
@@ -1,103 +1,105 @@
|
|
|
1
|
-
# 鸣潮入场动画
|
|
2
|
-
|
|
3
|
-
为 DeepSeek Harness(DSH)提供 20 个可选角色的静音开场动画,包含线稿入场、完整/快速播放和粒子退场。视频为 **3840×1488、60 fps**:保留 4K 素材的横向像素,裁去上下无效区域,按原比例显示。
|
|
4
|
-
|
|
5
|
-

|
|
6
|
-
|
|
7
|
-
当前版本 **0.4.
|
|
8
|
-
|
|
9
|
-
0.4.3 于 2026-11-12 完成兼容性验证:37 项自动回归通过;两个桌面版本各完成 20 个角色 × 完整/快速两种模式,共 80 次播放,均正常结束且释放 Blob,视频解码尺寸均为 3840×1488,150% 缩放下画布尺寸全部匹配设备像素比。每个桌面版本的 40 次播放累计记录到 8 帧丢帧。两个版本均验证了重启自动开场、刷新不重复播放和偏好保留;rc.1 另通过真实设置界面的角色选择核验。内置浏览器的正常注入、客户端补载及模拟媒体错误回退共 8 次播放通过,未记录到丢帧。版本范围的 9 个边界样例只验证声明解析,不代表未来宿主实测。0.4.4 整理公开发布信息、安装脚本和制作脚本,沿用同一套播放逻辑及 20 个角色素材。
|
|
10
|
-
|
|
11
|
-
完全退出并重新打开 DSH,开场先绘制所选角色的声痕线稿,再按完整画幅居中播放视频,最后采样视频画面生成粒子并淡出到工作台。上下留白足够时,环形光迹、对称波纹和进度亮点沿用各角色的配色;波纹振幅和光环亮度随当前视频画面的运动强度变化。点击画面或按 Esc 可立即跳过。动画静音播放;系统启用减少动态效果时跳过线稿与退场特效,关闭波纹起伏,保留原视频。
|
|
12
|
-
|
|
13
|
-
打开「设置 → 鸣潮入场动画」选择角色。所选角色会在下次启动时生效,也可点击「预览所选角色」立即播放。默认角色是守岸人,可在同一页关闭「启动时播放」。
|
|
14
|
-
|
|
15
|
-
播放模式默认「完整播放」,旧版偏好自动沿用。可切换到「快速开场」,播放人工逐角色挑选的最多 2 秒片段,前后特效各 0.45 秒,总计约 2.1~2.9 秒。设置页显示的预计总时长包含线稿和退场,不含加载等待。
|
|
16
|
-
|
|
17
|
-
两种模式各有一套与播放起点对应的线稿,设置页预览图保持独立。完整模式跳过最多 0.4 秒的片头低细节过渡,从可辨识画面开始播放;MP4 素材文件没有裁改。视频定位和线稿准备并行进行,首帧回调到达后再切换画面;无帧回调支持时按播放事件降级。
|
|
18
|
-
|
|
19
|
-
启动动画开始后隐藏窗口会自动结束。手动预览隐藏时暂停视频、特效和全部超时计时,恢复可见后继续。线稿请求超过 250 毫秒、数据损坏或 Canvas 绘制异常时直接播放视频;粒子采样失败时使用简单淡出。每种媒体载入方式最多等待 4.5 秒,失败或无法定位时可切换另一种方式一次;开始播放后不重新载入,整个流程另有总时限保护。
|
|
20
|
-
|
|
21
|
-
## 安装
|
|
22
|
-
|
|
23
|
-
在 DSH 的「插件 → 添加插件」填写:
|
|
24
|
-
|
|
25
|
-
```text
|
|
26
|
-
dsh-wuthering-waves-intro@0.4.
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
或者使用 CLI 安装到桌面配置:
|
|
30
|
-
|
|
31
|
-
```powershell
|
|
32
|
-
dsh plugin --profile desktop add dsh-wuthering-waves-intro@0.4.
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
也可从 [GitHub Releases](https://github.com/kun111-web/dsh-wuthering-waves-intro/releases/latest) 下载 `dsh-wuthering-waves-intro-0.4.
|
|
36
|
-
|
|
37
|
-
```powershell
|
|
38
|
-
Get-FileHash 'C:\Downloads\dsh-wuthering-waves-intro-0.4.
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
将示例路径替换为实际下载位置。安装后完全退出并重启 DSH,再到「设置 → 鸣潮入场动画」选择角色。卸载可在 DSH 插件列表操作。
|
|
42
|
-
|
|
43
|
-
从源码安装时,先运行 `npm run pack:plugin` 生成主插件及 6 个素材依赖归档,再运行 `./install.ps1`。素材依赖须已发布到 npm,安装脚本会自动拉取。脚本从 PATH 查找 `dsh`;若未配置 PATH,使用 `./install.ps1 -DshCommand '<DSH CLI 完整路径>'`。脚本从本项目 `dist/` 的版本化安装包安装,并核对桌面配置中的依赖来源及版本。
|
|
44
|
-
|
|
45
|
-
## 数据与权限
|
|
46
|
-
|
|
47
|
-
安装时从 npm 下载主插件和素材依赖;安装完成后的播放只读取本地媒体、线稿和样式,通过 DSH 本地资源路由加载。不需要 API Key,播放时不调用外部服务。角色、播放模式和启动偏好保存在 WebView 的本地存储中。不读取或上传聊天内容,不修改 DSH 主程序。单次只载入所选角色视频,结束、跳过和卸载时释放临时 Blob 地址。
|
|
48
|
-
|
|
49
|
-
## 素材与许可
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
## 片段与打包
|
|
54
|
-
|
|
55
|
-
0.4.
|
|
56
|
-
|
|
57
|
-
0.4.
|
|
58
|
-
|
|
59
|
-
0.4.4
|
|
60
|
-
|
|
61
|
-
0.4.
|
|
62
|
-
|
|
63
|
-
0.4.3
|
|
64
|
-
|
|
65
|
-
0.4.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
0.4.
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
0.
|
|
80
|
-
|
|
81
|
-
0.2.
|
|
82
|
-
|
|
83
|
-
0.2.
|
|
84
|
-
|
|
85
|
-
0.2.
|
|
86
|
-
|
|
87
|
-
0.
|
|
88
|
-
|
|
89
|
-
0.1.
|
|
90
|
-
|
|
91
|
-
0.1.
|
|
92
|
-
|
|
93
|
-
0.1.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
npm run
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
1
|
+
# 鸣潮入场动画
|
|
2
|
+
|
|
3
|
+
为 DeepSeek Harness(DSH)提供 20 个可选角色的静音开场动画,包含线稿入场、完整/快速播放和粒子退场。视频为 **3840×1488、60 fps**:保留 4K 素材的横向像素,裁去上下无效区域,按原比例显示。
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
当前版本 **0.4.6**。DSH 版本声明为 **`>=0.2.2-rc.1 <0.3.0-0`**,需要 Node.js 24 或更新版本;DSH 桌面端使用自带运行时。已验证宿主为 **0.2.2-rc.1** 和 **0.2.2-rc.2**。范围内的未来版本仍需验证,0.3 及后续发行系列需重新适配。
|
|
8
|
+
|
|
9
|
+
0.4.3 于 2026-11-12 完成兼容性验证:37 项自动回归通过;两个桌面版本各完成 20 个角色 × 完整/快速两种模式,共 80 次播放,均正常结束且释放 Blob,视频解码尺寸均为 3840×1488,150% 缩放下画布尺寸全部匹配设备像素比。每个桌面版本的 40 次播放累计记录到 8 帧丢帧。两个版本均验证了重启自动开场、刷新不重复播放和偏好保留;rc.1 另通过真实设置界面的角色选择核验。内置浏览器的正常注入、客户端补载及模拟媒体错误回退共 8 次播放通过,未记录到丢帧。版本范围的 9 个边界样例只验证声明解析,不代表未来宿主实测。0.4.4 整理公开发布信息、安装脚本和制作脚本,沿用同一套播放逻辑及 20 个角色素材。
|
|
10
|
+
|
|
11
|
+
完全退出并重新打开 DSH,开场先绘制所选角色的声痕线稿,再按完整画幅居中播放视频,最后采样视频画面生成粒子并淡出到工作台。上下留白足够时,环形光迹、对称波纹和进度亮点沿用各角色的配色;波纹振幅和光环亮度随当前视频画面的运动强度变化。点击画面或按 Esc 可立即跳过。动画静音播放;系统启用减少动态效果时跳过线稿与退场特效,关闭波纹起伏,保留原视频。
|
|
12
|
+
|
|
13
|
+
打开「设置 → 鸣潮入场动画」选择角色。所选角色会在下次启动时生效,也可点击「预览所选角色」立即播放。默认角色是守岸人,可在同一页关闭「启动时播放」。
|
|
14
|
+
|
|
15
|
+
播放模式默认「完整播放」,旧版偏好自动沿用。可切换到「快速开场」,播放人工逐角色挑选的最多 2 秒片段,前后特效各 0.45 秒,总计约 2.1~2.9 秒。设置页显示的预计总时长包含线稿和退场,不含加载等待。
|
|
16
|
+
|
|
17
|
+
两种模式各有一套与播放起点对应的线稿,设置页预览图保持独立。完整模式跳过最多 0.4 秒的片头低细节过渡,从可辨识画面开始播放;MP4 素材文件没有裁改。视频定位和线稿准备并行进行,首帧回调到达后再切换画面;无帧回调支持时按播放事件降级。
|
|
18
|
+
|
|
19
|
+
启动动画开始后隐藏窗口会自动结束。手动预览隐藏时暂停视频、特效和全部超时计时,恢复可见后继续。线稿请求超过 250 毫秒、数据损坏或 Canvas 绘制异常时直接播放视频;粒子采样失败时使用简单淡出。每种媒体载入方式最多等待 4.5 秒,失败或无法定位时可切换另一种方式一次;开始播放后不重新载入,整个流程另有总时限保护。
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
在 DSH 的「插件 → 添加插件」填写:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
dsh-wuthering-waves-intro@0.4.6
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
或者使用 CLI 安装到桌面配置:
|
|
30
|
+
|
|
31
|
+
```powershell
|
|
32
|
+
dsh plugin --profile desktop add dsh-wuthering-waves-intro@0.4.6
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
也可从 [GitHub Releases](https://github.com/kun111-web/dsh-wuthering-waves-intro/releases/latest) 下载 `dsh-wuthering-waves-intro-0.4.6.tgz`,在「添加插件」中填写下载后的完整路径。主插件通过 6 个固定版本的 npm 素材依赖自动安装全部 20 个视频,首次安装需要联网,合计下载约 288 MiB。每个素材包约 46~50 MiB,无需在 DSH 中逐个添加。Release 同时保存主插件和 6 个素材包的发布归档。校验值见 Release 附件 `SHA256SUMS.txt`,可用 PowerShell 核对:
|
|
36
|
+
|
|
37
|
+
```powershell
|
|
38
|
+
Get-FileHash 'C:\Downloads\dsh-wuthering-waves-intro-0.4.6.tgz' -Algorithm SHA256
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
将示例路径替换为实际下载位置。安装后完全退出并重启 DSH,再到「设置 → 鸣潮入场动画」选择角色。卸载可在 DSH 插件列表操作。
|
|
42
|
+
|
|
43
|
+
从源码安装时,先运行 `npm run pack:plugin` 生成主插件及 6 个素材依赖归档,再运行 `./install.ps1`。素材依赖须已发布到 npm,安装脚本会自动拉取。脚本从 PATH 查找 `dsh`;若未配置 PATH,使用 `./install.ps1 -DshCommand '<DSH CLI 完整路径>'`。脚本从本项目 `dist/` 的版本化安装包安装,并核对桌面配置中的依赖来源及版本。
|
|
44
|
+
|
|
45
|
+
## 数据与权限
|
|
46
|
+
|
|
47
|
+
安装时从 npm 下载主插件和素材依赖;安装完成后的播放只读取本地媒体、线稿和样式,通过 DSH 本地资源路由加载。不需要 API Key,播放时不调用外部服务。角色、播放模式和启动偏好保存在 WebView 的本地存储中。不读取或上传聊天内容,不修改 DSH 主程序。单次只载入所选角色视频,结束、跳过和卸载时释放临时 Blob 地址。
|
|
48
|
+
|
|
49
|
+
## 素材与许可
|
|
50
|
+
|
|
51
|
+
动画素材:鸣潮角色声痕动画。鸣潮相关素材归库洛游戏及相关权利人所有,包括本插件使用的视频、预览图、由画面提取的线稿及角色形象等。插件原创代码继续采用 Apache-2.0;上述素材不属于该代码许可证的授权范围,详见 [NOTICE.md](NOTICE.md)。本项目为第三方插件,不代表鸣潮、库洛游戏或 DeepSeek 官方。
|
|
52
|
+
|
|
53
|
+
## 片段与打包
|
|
54
|
+
|
|
55
|
+
0.4.6 明确注明鸣潮相关素材归库洛游戏及相关权利人所有,统一主插件、6 个素材包及素材元数据的版权说明。插件原创代码继续采用 Apache-2.0,素材不属于代码许可证的授权范围。视频、预览图和线稿保持不变,不重新编码素材。
|
|
56
|
+
|
|
57
|
+
0.4.5 将视频拆分为 6 个 npm 素材依赖,主包保留插件代码、线稿和预览图,解决完整包超过 npm 上传体积限制的问题。安装命令仍只需主插件包名。全部视频保持原始字节,不降低分辨率、帧率或码率;播放器从依赖包读取视频,源码目录保留本地素材回退。`src/media-packages.json` 记录唯一分组,`pack:plugin` 同时验证并输出 7 个版本化归档及 SHA-256,不执行安装后下载脚本。
|
|
58
|
+
|
|
59
|
+
0.4.4 补齐独立仓库、npm 元数据、公开安装说明和素材许可说明;安装脚本支持 PATH 中的 DSH CLI 或显式路径,制作脚本支持显式传入源文件。发布包仍包含 20 个正式角色视频及对应预览图,不重新编码素材。
|
|
60
|
+
|
|
61
|
+
0.4.4 发布检查通过 6 项:版本元数据一致性、全部角色的分辨率/帧率/帧数与纯视频轨、媒体分段读取、运行脚本补载及缓存校验、公开素材说明和源文件缺失处理。与 0.4.3 比较,20 个视频及 20 个预览图的 SHA-256 全部一致,播放逻辑保持不变,仅客户端资源版本标记更新。
|
|
62
|
+
|
|
63
|
+
0.4.3 减少对宿主具体版本和启动顺序的依赖:桌面检测优先使用宿主提供的能力,兼容原 `dsh-app:` 协议;设置页只等待插槽服务,不再绑定 `settings-general` 内置包。正常使用早期启动注入,注入缺失时由客户端从同一媒体路由补载运行脚本和样式。DOM 尚未创建时等待页面就绪;重复初始化不重播,替换、卸载及页面离开时清理播放器、计时器、请求和 Blob 地址。普通浏览器先流式播放,桌面及非 HTTP 环境优先完整 Blob;加载、定位或解码失败时有限回退,避免无休止重试。缺少宿主必要接口时跳过动画并保留诊断,不能保证未提供媒体路由或插件模块系统的 DSH 可用。
|
|
64
|
+
|
|
65
|
+
0.4.3 的兼容性修改不重新编码或替换素材,20 个视频和预览图沿用 0.4.2。偏好存储名称保持不变。DSH 跨发行系列升级后,应检查自动开场、完整/快速播放、设置保存、跳过和清晰度后再扩大版本声明,不使用兼容性豁免强行加载。
|
|
66
|
+
|
|
67
|
+
0.4.2 清除夏空片段的中英字幕、露帕结尾与忌炎开头转场带入的字幕残影,以及莫宁画面的小字;预览图、完整和快速线稿同步重新生成。仅修补文字所在区域,保持 3840×1488、60 帧/秒和原片段帧数。20 个视频均只含 H.264 视频轨,无音频、字幕或数据轨。`scripts/media-cleanup.json` 记录修补区域及时间范围;`npm run clean:media` 用于处理现有角色片段,已处理且哈希一致的文件不会重复编码。`npm run split` 已集成相同规则,避免重新分割时带回字幕。
|
|
68
|
+
|
|
69
|
+
从 3840×2160、60 帧/秒素材切出 20 个独立的 MP4,每个片段保留 3840×1488 的有效画面及 60 帧/秒,使用 H.264 编码。设置页预览图为 768×298,未使用 AI 超分辨率。帧区间见 `src/characters.json`;安装包不包含原合集、中间下载文件或 QA 产物。重新分割前需要自行提供与角色时间轴匹配的原始素材;默认路径为 `assets/source-2160p.mp4`,也可通过 `npm run split -- '<完整路径>'` 指定。
|
|
70
|
+
|
|
71
|
+
0.4.1 修复桌面端首次加载时完整模式卡在线稿后超时退出的问题。DSH 自定义协议的流式响应可能将视频可定位范围报告为 0;桌面端现在并行读取当前角色的视频和线稿,用临时 Blob 地址提供完整可定位的原视频。仅持有所选角色的一个片段,不重编码或降低分辨率,结束、跳过、替换和加载失败时取消请求并释放地址。普通浏览器继续使用流式媒体地址。自动测试补充桌面加载、定位、取消竞态和内存地址释放的回归检查。
|
|
72
|
+
|
|
73
|
+
0.4.0 使用 4K/60 帧素材,线稿按 3840×1488 画面提取,画布按实际显示宽度乘设备像素比绘制,最高 3840×1488;窗口大小及 DPI 改变时重新绘制,线宽保持约 1 个 CSS 像素。Canvas 以最高约 60 次/秒绘制,高刷新率屏幕不再重复绘制同一进度。视频首选逐帧回调,超过 500 毫秒无回调时由播放事件接管。
|
|
74
|
+
|
|
75
|
+
同一宿主运行会话只自动播放一次,页面刷新和重连不重播;完全退出并重启宿主后可再次播放。标记在窗口首次可见时写入,隐藏窗口不会提前消耗机会。此去重依赖本地存储;本地存储不可用时只在当前页面内去重。手动预览不受限制。
|
|
76
|
+
|
|
77
|
+
资源 URL 携带版本号,支持 ETag 校验和浏览器持久缓存;不带版本的旧地址仍可用但每次需校验。解析过的线稿使用最多 8 项的 LRU 缓存,失败或已取消的请求不会缓存。`scripts/quick-scenes.json` 保存人工挑选的快速片段及理由,帧号沿用 30 Hz 剪辑时间轴(实际 60 fps 视频中的帧号为其两倍);重新运行 `npm run trace` 保留人工选择,未知角色或越界配置会报错。
|
|
78
|
+
|
|
79
|
+
0.3.0 新增快速开场、起点匹配的两套线稿、随画面变化的波纹、后台暂停与异常降级。自动测试覆盖完整播放、快速边界、首帧衔接、特效故障、视频错误、隐藏与恢复、偏好迁移、减少动态效果和资源清理。
|
|
80
|
+
|
|
81
|
+
0.2.3 播放时只加载所选角色的线稿。线稿载入失败或超过 250 毫秒时直接播放原片。粒子采样使用小画布,避免从整张动画画布读取像素。
|
|
82
|
+
|
|
83
|
+
0.2.2 把留白改为无文字的环形刻度、光迹和动态波纹。波纹形状根据各角色片段的亮度和画面变化生成。
|
|
84
|
+
|
|
85
|
+
0.2.1 在留白中加入启动终端和逐帧进度,面板随窗口空间缩减或隐藏。
|
|
86
|
+
|
|
87
|
+
0.2.0 给 20 个角色加上逐笔线稿、原片淡入和粒子退场。构思参考了 [SoliSpark 的守岸人主题](https://github.com/SoliSpark/deepseek-harness-shorekeeper-theme)。线稿和粒子取材于本插件的角色片段。
|
|
88
|
+
|
|
89
|
+
0.1.4 恢复完整画幅,用角色预览图生成柔光背景,在足够宽的留白区域显示声痕波纹。
|
|
90
|
+
|
|
91
|
+
0.1.3 去掉片段的上下黑边,播放时等比铺满窗口内容区,隐藏跳过提示。
|
|
92
|
+
|
|
93
|
+
0.1.2 裁掉视频画面中原有的左下角标题和角色字幕,重新居中为 1280×720,预览图从处理后的视频生成。
|
|
94
|
+
|
|
95
|
+
0.1.1 按画面修正赞妮和奥古斯塔的分割。赞妮保留金色声痕收尾,奥古斯塔从约 8.47 秒的云层镜头开始。两处相邻角色的叠化帧已从单角色片段中剔除。
|
|
96
|
+
|
|
97
|
+
```powershell
|
|
98
|
+
npm run split
|
|
99
|
+
npm run trace
|
|
100
|
+
npm run pack:plugin
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
分割与媒体核验需要 PATH 中有 FFmpeg 和 FFprobe。重新提取线稿和波纹数据需要 Python、OpenCV 和 NumPy。播放使用包内生成好的数据,通过 DSH 的启动扩展和媒体资源路由加载。兼容性回归在临时验证环境执行;测试脚本、截图和隔离宿主不纳入安装包,`pack:plugin` 会校验版本同步、资源清单及安装包哈希。
|
|
104
|
+
|
|
105
|
+
仓库中的 `dist/*.tgz` 使用 Git LFS 保存。获取仓库中的完整安装包需要 Git LFS;从 Releases 下载的 `.tgz` 可直接安装。普通源码和正式角色资源直接保存在 Git 中。
|
package/assets/SOURCE.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"material": "鸣潮角色声痕动画",
|
|
3
|
-
"rights": "
|
|
3
|
+
"rights": "鸣潮相关素材归库洛游戏及相关权利人所有,包括视频、预览图、由画面提取的线稿及角色形象等;不属于插件代码的 Apache-2.0 授权范围。",
|
|
4
4
|
"verified": "2026-11-12",
|
|
5
5
|
"sha256": "46f6f0e6b80ee59456996c6ee1ffe6d6854b6587094e1a3835323aec9ca1132b",
|
|
6
6
|
"source": {
|
package/package.json
CHANGED
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "dsh-wuthering-waves-intro",
|
|
3
|
-
"version": "0.4.
|
|
4
|
-
"description": "v0.4.
|
|
5
|
-
"type": "module",
|
|
6
|
-
"license": "Apache-2.0",
|
|
7
|
-
"author": "kun111-web",
|
|
8
|
-
"repository": {
|
|
9
|
-
"type": "git",
|
|
10
|
-
"url": "git+https://github.com/kun111-web/dsh-wuthering-waves-intro.git"
|
|
11
|
-
},
|
|
12
|
-
"homepage": "https://github.com/kun111-web/dsh-wuthering-waves-intro#readme",
|
|
13
|
-
"bugs": {
|
|
14
|
-
"url": "https://github.com/kun111-web/dsh-wuthering-waves-intro/issues"
|
|
15
|
-
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"dsh-plugin",
|
|
18
|
-
"deepseek-harness",
|
|
19
|
-
"wuthering-waves",
|
|
20
|
-
"intro",
|
|
21
|
-
"animation"
|
|
22
|
-
],
|
|
23
|
-
"publishConfig": {
|
|
24
|
-
"access": "public",
|
|
25
|
-
"registry": "https://registry.npmjs.org/"
|
|
26
|
-
},
|
|
27
|
-
"engines": {
|
|
28
|
-
"node": ">=24",
|
|
29
|
-
"dsh": ">=0.2.2-rc.1 <0.3.0-0"
|
|
30
|
-
},
|
|
31
|
-
"exports": {
|
|
32
|
-
".": "./src/index.js",
|
|
33
|
-
"./client": "./src/client.js",
|
|
34
|
-
"./package.json": "./package.json"
|
|
35
|
-
},
|
|
36
|
-
"files": [
|
|
37
|
-
"src",
|
|
38
|
-
"assets/characters/*.webp",
|
|
39
|
-
"assets/SOURCE.json",
|
|
40
|
-
"cordis.patch.yml",
|
|
41
|
-
"README.md",
|
|
42
|
-
"LICENSE",
|
|
43
|
-
"NOTICE.md"
|
|
44
|
-
],
|
|
45
|
-
"dsh": {
|
|
46
|
-
"bundle": {
|
|
47
|
-
"patch": "./cordis.patch.yml"
|
|
48
|
-
},
|
|
49
|
-
"client": {
|
|
50
|
-
"platform": "web"
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
"scripts": {
|
|
54
|
-
"split": "node scripts/split.mjs",
|
|
55
|
-
"clean:media": "node scripts/clean-media.mjs",
|
|
56
|
-
"trace": "python scripts/trace.py",
|
|
57
|
-
"pack:plugin": "node scripts/pack.mjs"
|
|
58
|
-
},
|
|
59
|
-
"dependencies": {
|
|
60
|
-
"@kun111-web/dsh-wuwa-media-1": "0.4.
|
|
61
|
-
"@kun111-web/dsh-wuwa-media-2": "0.4.
|
|
62
|
-
"@kun111-web/dsh-wuwa-media-3": "0.4.
|
|
63
|
-
"@kun111-web/dsh-wuwa-media-4": "0.4.
|
|
64
|
-
"@kun111-web/dsh-wuwa-media-5": "0.4.
|
|
65
|
-
"@kun111-web/dsh-wuwa-media-6": "0.4.
|
|
66
|
-
}
|
|
67
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "dsh-wuthering-waves-intro",
|
|
3
|
+
"version": "0.4.6",
|
|
4
|
+
"description": "v0.4.6 · DSH 鸣潮入场动画,20 个角色、4K 60帧静音素材、完整与快速开场",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"author": "kun111-web",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/kun111-web/dsh-wuthering-waves-intro.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/kun111-web/dsh-wuthering-waves-intro#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/kun111-web/dsh-wuthering-waves-intro/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"dsh-plugin",
|
|
18
|
+
"deepseek-harness",
|
|
19
|
+
"wuthering-waves",
|
|
20
|
+
"intro",
|
|
21
|
+
"animation"
|
|
22
|
+
],
|
|
23
|
+
"publishConfig": {
|
|
24
|
+
"access": "public",
|
|
25
|
+
"registry": "https://registry.npmjs.org/"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=24",
|
|
29
|
+
"dsh": ">=0.2.2-rc.1 <0.3.0-0"
|
|
30
|
+
},
|
|
31
|
+
"exports": {
|
|
32
|
+
".": "./src/index.js",
|
|
33
|
+
"./client": "./src/client.js",
|
|
34
|
+
"./package.json": "./package.json"
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"src",
|
|
38
|
+
"assets/characters/*.webp",
|
|
39
|
+
"assets/SOURCE.json",
|
|
40
|
+
"cordis.patch.yml",
|
|
41
|
+
"README.md",
|
|
42
|
+
"LICENSE",
|
|
43
|
+
"NOTICE.md"
|
|
44
|
+
],
|
|
45
|
+
"dsh": {
|
|
46
|
+
"bundle": {
|
|
47
|
+
"patch": "./cordis.patch.yml"
|
|
48
|
+
},
|
|
49
|
+
"client": {
|
|
50
|
+
"platform": "web"
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"split": "node scripts/split.mjs",
|
|
55
|
+
"clean:media": "node scripts/clean-media.mjs",
|
|
56
|
+
"trace": "python scripts/trace.py",
|
|
57
|
+
"pack:plugin": "node scripts/pack.mjs"
|
|
58
|
+
},
|
|
59
|
+
"dependencies": {
|
|
60
|
+
"@kun111-web/dsh-wuwa-media-1": "0.4.6",
|
|
61
|
+
"@kun111-web/dsh-wuwa-media-2": "0.4.6",
|
|
62
|
+
"@kun111-web/dsh-wuwa-media-3": "0.4.6",
|
|
63
|
+
"@kun111-web/dsh-wuwa-media-4": "0.4.6",
|
|
64
|
+
"@kun111-web/dsh-wuwa-media-5": "0.4.6",
|
|
65
|
+
"@kun111-web/dsh-wuwa-media-6": "0.4.6"
|
|
66
|
+
}
|
|
67
|
+
}
|
package/src/client.js
CHANGED
|
@@ -1,147 +1,147 @@
|
|
|
1
|
-
window.__ModuleLoader__?.load?.({
|
|
2
|
-
id: 'dsh-wuthering-waves-intro',
|
|
3
|
-
factory: require => {
|
|
4
|
-
const { createElement: h, useEffect, useRef, useState } = require('react');
|
|
5
|
-
const version = '0.4.
|
|
6
|
-
|
|
7
|
-
async function ensureRuntime(signal, ownedAssets) {
|
|
8
|
-
if (window.__DSH_WUWA_INTRO__?.version === version) return;
|
|
9
|
-
if (window.__DSH_WUWA_INTRO__ && !window.__DSH_WUWA_INTRO__.dispose) {
|
|
10
|
-
throw new Error('请重新打开 DSH 以启用新版动画。');
|
|
11
|
-
}
|
|
12
|
-
const attach = (tag, filename) => new Promise((resolve, reject) => {
|
|
13
|
-
if (signal.aborted) { reject(new Error('Cancelled')); return; }
|
|
14
|
-
const element = document.createElement(tag);
|
|
15
|
-
const url = `/dsh-wuthering-waves-intro/media/${filename}?v=${version}`;
|
|
16
|
-
if (tag === 'link') { element.rel = 'stylesheet'; element.href = url; }
|
|
17
|
-
else element.src = url;
|
|
18
|
-
ownedAssets.add(element);
|
|
19
|
-
const finish = error => {
|
|
20
|
-
clearTimeout(timeout);
|
|
21
|
-
signal.removeEventListener('abort', abort);
|
|
22
|
-
element.onload = element.onerror = null;
|
|
23
|
-
if (error) { element.remove(); ownedAssets.delete(element); reject(error); }
|
|
24
|
-
else resolve();
|
|
25
|
-
};
|
|
26
|
-
const abort = () => finish(new Error('Cancelled'));
|
|
27
|
-
const timeout = setTimeout(() => finish(new Error('动画组件加载超时')), 4500);
|
|
28
|
-
element.onload = () => finish();
|
|
29
|
-
element.onerror = () => finish(new Error('动画组件无法加载'));
|
|
30
|
-
signal.addEventListener('abort', abort, { once: true });
|
|
31
|
-
document.head.append(element);
|
|
32
|
-
});
|
|
33
|
-
// The normal path is the early host injection. This independent path also
|
|
34
|
-
// works when a host changes the injection timing or omits that event.
|
|
35
|
-
await attach('link', 'style.css');
|
|
36
|
-
await attach('script', 'runtime.js');
|
|
37
|
-
if (window.__DSH_WUWA_INTRO__?.version !== version) throw new Error('请重新打开 DSH 以加载动画。');
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function Settings() {
|
|
41
|
-
const [intro, setIntro] = useState(() => window.__DSH_WUWA_INTRO__);
|
|
42
|
-
const [preferences, setPreferences] = useState(() => intro?.read());
|
|
43
|
-
const [notice, setNotice] = useState('');
|
|
44
|
-
const cancelPreview = useRef(null);
|
|
45
|
-
useEffect(() => {
|
|
46
|
-
const refresh = () => {
|
|
47
|
-
const next = window.__DSH_WUWA_INTRO__;
|
|
48
|
-
setIntro(next);
|
|
49
|
-
setPreferences(next?.read());
|
|
50
|
-
};
|
|
51
|
-
window.addEventListener('dsh-wuwa-ready', refresh);
|
|
52
|
-
return () => { window.removeEventListener('dsh-wuwa-ready', refresh); cancelPreview.current?.(); };
|
|
53
|
-
}, []);
|
|
54
|
-
if (!intro || !preferences) {
|
|
55
|
-
return h('p', null, '请完全退出并重新打开 DSH,以加载入场动画。');
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function save(change) {
|
|
59
|
-
const next = { ...preferences, ...change };
|
|
60
|
-
try {
|
|
61
|
-
intro.save(next);
|
|
62
|
-
setPreferences(next);
|
|
63
|
-
setNotice('');
|
|
64
|
-
} catch {
|
|
65
|
-
setNotice('无法保存设置,请检查 DSH 的本地存储是否可用。');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
function preview() {
|
|
70
|
-
setNotice('');
|
|
71
|
-
cancelPreview.current = intro.play(preferences.character, {
|
|
72
|
-
preview: true,
|
|
73
|
-
mode: preferences.mode,
|
|
74
|
-
onClose(reason) {
|
|
75
|
-
cancelPreview.current = null;
|
|
76
|
-
if (reason === 'unavailable' || reason === 'timeout') {
|
|
77
|
-
setNotice(reason === 'timeout' ? '动画加载超时,可以再试一次或切换角色。' : '这段动画暂时无法播放,可以重试或切换角色。');
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return h('div', { className: 'dsh-wuwa-intro-settings' },
|
|
84
|
-
h('div', { className: 'dsh-wuwa-intro-controls' },
|
|
85
|
-
h('label', null, h('input', {
|
|
86
|
-
type: 'checkbox',
|
|
87
|
-
checked: preferences.enabled,
|
|
88
|
-
onChange: event => save({ enabled: event.target.checked })
|
|
89
|
-
}), '启动时播放'),
|
|
90
|
-
h('button', { type: 'button', onClick: preview }, '预览所选角色')),
|
|
91
|
-
h('label', { className: 'dsh-wuwa-intro-mode' }, '播放模式',
|
|
92
|
-
h('select', { value: preferences.mode, onChange: event => save({ mode: event.target.value }) },
|
|
93
|
-
h('option', { value: 'full' }, '完整播放'),
|
|
94
|
-
h('option', { value: 'quick' }, '快速开场(约 3 秒)'))),
|
|
95
|
-
h('p', { className: 'dsh-wuwa-intro-help' }, '时长包含线稿与退场效果,不含加载等待。点击画面或按 Esc 跳过;预览切到后台会暂停。'),
|
|
96
|
-
notice && h('p', { role: 'status' }, notice),
|
|
97
|
-
h('fieldset', null, h('legend', null, '选择角色'),
|
|
98
|
-
h('div', { className: 'dsh-wuwa-intro-grid' }, intro.characters.map(({ id, name }) =>
|
|
99
|
-
h('label', { key: id },
|
|
100
|
-
h('input', {
|
|
101
|
-
type: 'radio',
|
|
102
|
-
name: 'dsh-wuwa-intro-character',
|
|
103
|
-
value: id,
|
|
104
|
-
checked: preferences.character === id,
|
|
105
|
-
onChange: () => save({ character: id })
|
|
106
|
-
}),
|
|
107
|
-
h('span', { className: 'dsh-wuwa-intro-card' },
|
|
108
|
-
h('img', { src: intro.media(id, 'webp'), alt: '', loading: 'lazy' }),
|
|
109
|
-
h('span', null, name, h('small', null, `约 ${intro.plan(id, preferences.mode).totalSeconds.toFixed(1)} 秒`))))))));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
async function apply(ctx) {
|
|
113
|
-
const controller = new AbortController();
|
|
114
|
-
const ownedAssets = new Set();
|
|
115
|
-
let intro;
|
|
116
|
-
ctx.on?.('dispose', () => {
|
|
117
|
-
controller.abort();
|
|
118
|
-
if (intro && window.__DSH_WUWA_INTRO__ === intro) intro.dispose();
|
|
119
|
-
for (const element of ownedAssets) element.remove();
|
|
120
|
-
ownedAssets.clear();
|
|
121
|
-
});
|
|
122
|
-
try {
|
|
123
|
-
await ensureRuntime(controller.signal, ownedAssets);
|
|
124
|
-
intro = window.__DSH_WUWA_INTRO__;
|
|
125
|
-
} catch (error) {
|
|
126
|
-
if (!controller.signal.aborted) console.warn('[鸣潮入场动画]', error);
|
|
127
|
-
}
|
|
128
|
-
if (controller.signal.aborted) return;
|
|
129
|
-
if (typeof ctx.slots?.inject !== 'function' || typeof ctx.slots?.register !== 'function') {
|
|
130
|
-
console.warn('[鸣潮入场动画] 设置入口暂不可用,启动动画仍独立运行。');
|
|
131
|
-
return;
|
|
132
|
-
}
|
|
133
|
-
ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
134
|
-
name: 'settings.section',
|
|
135
|
-
id: 'wuthering-waves-intro',
|
|
136
|
-
order: 30,
|
|
137
|
-
label: () => '鸣潮入场动画'
|
|
138
|
-
}, Settings));
|
|
139
|
-
ctx.slots.inject('settings.section.icon', () => ctx.slots.register({
|
|
140
|
-
name: 'settings.section.icon',
|
|
141
|
-
id: 'wuthering-waves-intro'
|
|
142
|
-
}, ({ size = 16 }) => h('span', { style: { fontSize: size }, 'aria-hidden': 'true' }, '▷')));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
return { inject: ['slots'], apply };
|
|
146
|
-
}
|
|
147
|
-
});
|
|
1
|
+
window.__ModuleLoader__?.load?.({
|
|
2
|
+
id: 'dsh-wuthering-waves-intro',
|
|
3
|
+
factory: require => {
|
|
4
|
+
const { createElement: h, useEffect, useRef, useState } = require('react');
|
|
5
|
+
const version = '0.4.6';
|
|
6
|
+
|
|
7
|
+
async function ensureRuntime(signal, ownedAssets) {
|
|
8
|
+
if (window.__DSH_WUWA_INTRO__?.version === version) return;
|
|
9
|
+
if (window.__DSH_WUWA_INTRO__ && !window.__DSH_WUWA_INTRO__.dispose) {
|
|
10
|
+
throw new Error('请重新打开 DSH 以启用新版动画。');
|
|
11
|
+
}
|
|
12
|
+
const attach = (tag, filename) => new Promise((resolve, reject) => {
|
|
13
|
+
if (signal.aborted) { reject(new Error('Cancelled')); return; }
|
|
14
|
+
const element = document.createElement(tag);
|
|
15
|
+
const url = `/dsh-wuthering-waves-intro/media/${filename}?v=${version}`;
|
|
16
|
+
if (tag === 'link') { element.rel = 'stylesheet'; element.href = url; }
|
|
17
|
+
else element.src = url;
|
|
18
|
+
ownedAssets.add(element);
|
|
19
|
+
const finish = error => {
|
|
20
|
+
clearTimeout(timeout);
|
|
21
|
+
signal.removeEventListener('abort', abort);
|
|
22
|
+
element.onload = element.onerror = null;
|
|
23
|
+
if (error) { element.remove(); ownedAssets.delete(element); reject(error); }
|
|
24
|
+
else resolve();
|
|
25
|
+
};
|
|
26
|
+
const abort = () => finish(new Error('Cancelled'));
|
|
27
|
+
const timeout = setTimeout(() => finish(new Error('动画组件加载超时')), 4500);
|
|
28
|
+
element.onload = () => finish();
|
|
29
|
+
element.onerror = () => finish(new Error('动画组件无法加载'));
|
|
30
|
+
signal.addEventListener('abort', abort, { once: true });
|
|
31
|
+
document.head.append(element);
|
|
32
|
+
});
|
|
33
|
+
// The normal path is the early host injection. This independent path also
|
|
34
|
+
// works when a host changes the injection timing or omits that event.
|
|
35
|
+
await attach('link', 'style.css');
|
|
36
|
+
await attach('script', 'runtime.js');
|
|
37
|
+
if (window.__DSH_WUWA_INTRO__?.version !== version) throw new Error('请重新打开 DSH 以加载动画。');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function Settings() {
|
|
41
|
+
const [intro, setIntro] = useState(() => window.__DSH_WUWA_INTRO__);
|
|
42
|
+
const [preferences, setPreferences] = useState(() => intro?.read());
|
|
43
|
+
const [notice, setNotice] = useState('');
|
|
44
|
+
const cancelPreview = useRef(null);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
const refresh = () => {
|
|
47
|
+
const next = window.__DSH_WUWA_INTRO__;
|
|
48
|
+
setIntro(next);
|
|
49
|
+
setPreferences(next?.read());
|
|
50
|
+
};
|
|
51
|
+
window.addEventListener('dsh-wuwa-ready', refresh);
|
|
52
|
+
return () => { window.removeEventListener('dsh-wuwa-ready', refresh); cancelPreview.current?.(); };
|
|
53
|
+
}, []);
|
|
54
|
+
if (!intro || !preferences) {
|
|
55
|
+
return h('p', null, '请完全退出并重新打开 DSH,以加载入场动画。');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function save(change) {
|
|
59
|
+
const next = { ...preferences, ...change };
|
|
60
|
+
try {
|
|
61
|
+
intro.save(next);
|
|
62
|
+
setPreferences(next);
|
|
63
|
+
setNotice('');
|
|
64
|
+
} catch {
|
|
65
|
+
setNotice('无法保存设置,请检查 DSH 的本地存储是否可用。');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function preview() {
|
|
70
|
+
setNotice('');
|
|
71
|
+
cancelPreview.current = intro.play(preferences.character, {
|
|
72
|
+
preview: true,
|
|
73
|
+
mode: preferences.mode,
|
|
74
|
+
onClose(reason) {
|
|
75
|
+
cancelPreview.current = null;
|
|
76
|
+
if (reason === 'unavailable' || reason === 'timeout') {
|
|
77
|
+
setNotice(reason === 'timeout' ? '动画加载超时,可以再试一次或切换角色。' : '这段动画暂时无法播放,可以重试或切换角色。');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
return h('div', { className: 'dsh-wuwa-intro-settings' },
|
|
84
|
+
h('div', { className: 'dsh-wuwa-intro-controls' },
|
|
85
|
+
h('label', null, h('input', {
|
|
86
|
+
type: 'checkbox',
|
|
87
|
+
checked: preferences.enabled,
|
|
88
|
+
onChange: event => save({ enabled: event.target.checked })
|
|
89
|
+
}), '启动时播放'),
|
|
90
|
+
h('button', { type: 'button', onClick: preview }, '预览所选角色')),
|
|
91
|
+
h('label', { className: 'dsh-wuwa-intro-mode' }, '播放模式',
|
|
92
|
+
h('select', { value: preferences.mode, onChange: event => save({ mode: event.target.value }) },
|
|
93
|
+
h('option', { value: 'full' }, '完整播放'),
|
|
94
|
+
h('option', { value: 'quick' }, '快速开场(约 3 秒)'))),
|
|
95
|
+
h('p', { className: 'dsh-wuwa-intro-help' }, '时长包含线稿与退场效果,不含加载等待。点击画面或按 Esc 跳过;预览切到后台会暂停。'),
|
|
96
|
+
notice && h('p', { role: 'status' }, notice),
|
|
97
|
+
h('fieldset', null, h('legend', null, '选择角色'),
|
|
98
|
+
h('div', { className: 'dsh-wuwa-intro-grid' }, intro.characters.map(({ id, name }) =>
|
|
99
|
+
h('label', { key: id },
|
|
100
|
+
h('input', {
|
|
101
|
+
type: 'radio',
|
|
102
|
+
name: 'dsh-wuwa-intro-character',
|
|
103
|
+
value: id,
|
|
104
|
+
checked: preferences.character === id,
|
|
105
|
+
onChange: () => save({ character: id })
|
|
106
|
+
}),
|
|
107
|
+
h('span', { className: 'dsh-wuwa-intro-card' },
|
|
108
|
+
h('img', { src: intro.media(id, 'webp'), alt: '', loading: 'lazy' }),
|
|
109
|
+
h('span', null, name, h('small', null, `约 ${intro.plan(id, preferences.mode).totalSeconds.toFixed(1)} 秒`))))))));
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function apply(ctx) {
|
|
113
|
+
const controller = new AbortController();
|
|
114
|
+
const ownedAssets = new Set();
|
|
115
|
+
let intro;
|
|
116
|
+
ctx.on?.('dispose', () => {
|
|
117
|
+
controller.abort();
|
|
118
|
+
if (intro && window.__DSH_WUWA_INTRO__ === intro) intro.dispose();
|
|
119
|
+
for (const element of ownedAssets) element.remove();
|
|
120
|
+
ownedAssets.clear();
|
|
121
|
+
});
|
|
122
|
+
try {
|
|
123
|
+
await ensureRuntime(controller.signal, ownedAssets);
|
|
124
|
+
intro = window.__DSH_WUWA_INTRO__;
|
|
125
|
+
} catch (error) {
|
|
126
|
+
if (!controller.signal.aborted) console.warn('[鸣潮入场动画]', error);
|
|
127
|
+
}
|
|
128
|
+
if (controller.signal.aborted) return;
|
|
129
|
+
if (typeof ctx.slots?.inject !== 'function' || typeof ctx.slots?.register !== 'function') {
|
|
130
|
+
console.warn('[鸣潮入场动画] 设置入口暂不可用,启动动画仍独立运行。');
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
ctx.slots.inject('settings.section', () => ctx.slots.register({
|
|
134
|
+
name: 'settings.section',
|
|
135
|
+
id: 'wuthering-waves-intro',
|
|
136
|
+
order: 30,
|
|
137
|
+
label: () => '鸣潮入场动画'
|
|
138
|
+
}, Settings));
|
|
139
|
+
ctx.slots.inject('settings.section.icon', () => ctx.slots.register({
|
|
140
|
+
name: 'settings.section.icon',
|
|
141
|
+
id: 'wuthering-waves-intro'
|
|
142
|
+
}, ({ size = 16 }) => h('span', { style: { fontSize: size }, 'aria-hidden': 'true' }, '▷')));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return { inject: ['slots'], apply };
|
|
146
|
+
}
|
|
147
|
+
});
|