dsh-boot-suite 2.15.15 → 2.15.16

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/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [2.15.16] — 2026-11-02
2
+
3
+ - **掉线彩蛋不再硬切配音**:如果掉线正好触发在某句配音播放期间,先等这句播完(含中文字幕)再弹出彩蛋,不会出现「语音没说完、字幕先消失」;有 0.9s 兜底超时与动画结束保护。
4
+ - 版本号 2.15.16,构建号 cw-64。
5
+
1
6
  ## [2.15.15] — 2026-11-02
2
7
 
3
8
  - **重连提示音接入插件配音效果**:`voice-reconnect` 现在与其余配音一样走「配音效果」(AI 机械音/机器人/无线电/老电视/低沉),不再是无效果的原声。
package/lib/client.js CHANGED
@@ -269,7 +269,7 @@ window.__ModuleLoader__.load({
269
269
  —— 桌面端走浏览器半侧自举时没有 1,就靠这一条
270
270
  3) 下面这个常量:两份都没拿到时的兜底,别让面板显示 undefined
271
271
  版本号本身只在 lib/index.js 里读一次,这里不重复维护。 */
272
- var FALLBACK_VERSION = '2.15.15'
272
+ var FALLBACK_VERSION = '2.15.16'
273
273
  /* 手动选包成功后置 true:让还在后台跑的“浏览器下载监听”不要再弹第二次更新器 */
274
274
  var __manualUpdateApplied = false
275
275
  function readInjectedVersion() {
@@ -2022,7 +2022,7 @@ window.__ModuleLoader__.load({
2022
2022
  /* 每次改客户端就把这个号 +1。
2023
2023
  有了它在控制台一眼就能判断"浏览器里跑的是不是最新那份" ——
2024
2024
  排查问题时,分不清是代码问题还是旧包,会白猜一轮。 */
2025
- var BUILD = 'cw-63'
2025
+ var BUILD = 'cw-64'
2026
2026
 
2027
2027
  function log() {
2028
2028
  try {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dsh-boot-suite",
3
- "version": "2.15.15",
3
+ "version": "2.15.16",
4
4
  "description": "两幕启动动画(默认档案暖白 + 鲸鱼娘扫描睁眼,2K/4K 可切),支持导入视频/图片、三段转场、11→6 套配音音色与 5 种声音效果、聊天背景/循环视频、内置 iframe 启动模板(全景大肥鱼-含彩蛋版)与更新前自动回滚。",
5
5
  "keywords": [
6
6
  "dsh",
@@ -179,7 +179,7 @@ $('prevFrame').onclick=()=>{pause();seek(t-1/60)};$('nextFrame').onclick=()=>{pa
179
179
  var st=show?((cfg.voice&&cfg.voice.subs&&cfg.voice.subs.line4)||''):'';
180
180
  renderVoiceRow(eggRow,eggSub,vh,st,show);
181
181
  }
182
- var shown=false,done=false,rolled=false,v3Ended=false,waitStart=0,v4Timer=null,replayTimer=null,eggShownAt=0;
182
+ var shown=false,done=false,rolled=false,v3Ended=false,waitStart=0,v4Timer=null,replayTimer=null,eggShownAt=0,eggWait=false,eggWaitTimer=null;
183
183
  var hit=q.get('egg')==='1'||Math.random()<EGG_CHANCE;
184
184
  function stopVoice(){voiceDuck(false);activeVoice=null;window.__DSH_ACTIVE_VOICE__='';window.__DSH_CUE__='';window.__DSH_CUE_UNTIL__=0;cueGate=false;if(cueFailTimer){clearTimeout(cueFailTimer);cueFailTimer=null}Object.keys(aud).forEach(function(k){var a=aud[k];try{a.pause();a.currentTime=0}catch(e){}});if(v4Timer){clearTimeout(v4Timer);v4Timer=null}if(replayTimer){clearTimeout(replayTimer);replayTimer=null}}
185
185
  function playKey(k,offset){var a=aud[k];if(a&&!played[k]){played[k]=true;attachVoiceFx(k);try{a.currentTime=Math.max(0,offset||0);a.play().catch(function(){});activeVoice=k;window.__DSH_ACTIVE_VOICE__=k}catch(e){}voiceDuck(true);}}
@@ -193,7 +193,7 @@ $('prevFrame').onclick=()=>{pause();seek(t-1/60)};$('nextFrame').onclick=()=>{pa
193
193
  });
194
194
  }
195
195
  function showEgg(){
196
- if(shown||done)return; shown=true; rolled=true; playing=false;
196
+ if(shown||done)return; shown=true; rolled=true; playing=false;eggWait=false;if(eggWaitTimer){clearTimeout(eggWaitTimer);eggWaitTimer=null}
197
197
  stopVoice();
198
198
  bgmSig(false);
199
199
  eggEl.classList.add('on'); eggEl.setAttribute('aria-hidden','false'); try{document.body.classList.add('egg-on')}catch(e){}
@@ -221,7 +221,21 @@ $('prevFrame').onclick=()=>{pause();seek(t-1/60)};$('nextFrame').onclick=()=>{pa
221
221
  (function watch(){
222
222
  if(!done){
223
223
  if(playing&&!cueGate){sched.forEach(function(e){if(t>=e[0])playKey(e[1]);});}
224
- if(!rolled&&playing&&!shown&&t>=eggAt){rolled=true;if(hit)showEgg();}
224
+ /* v2.15.16:掉线彩蛋若正好赶上某句配音,先等这句播完再弹出,避免语音和字幕被硬切断(有兜底超时)。 */
225
+ if(!rolled&&playing&&!shown&&t>=eggAt){
226
+ if(!hit){rolled=true;}
227
+ else if(!eggWait&&activeVoice&&aud[activeVoice]&&!aud[activeVoice].paused&&!aud[activeVoice].ended){
228
+ var eggA=aud[activeVoice], eggLeft=(+eggA.duration||0)-(+eggA.currentTime||0);
229
+ if(isFinite(eggLeft)&&eggLeft>0.05&&t+eggLeft<=cfg.duration-0.25){
230
+ eggWait=true;
231
+ (function(a){
232
+ var fired=false,fin=function(){if(fired)return;fired=true;eggWait=false;eggWaitTimer=null;rolled=true;showEgg();};
233
+ a.addEventListener('ended',fin,{once:true});
234
+ eggWaitTimer=setTimeout(fin,eggLeft*1000+900);
235
+ })(eggA);
236
+ } else {rolled=true;showEgg();}
237
+ } else if(!eggWait){rolled=true;showEgg();}
238
+ }
225
239
  if(shown){var elap=(window.__EGG_T!=null?window.__EGG_T:(performance.now()-eggShownAt)/1000);eggVoice(elap-eggLineAt);}
226
240
  if(!shown&&t>=cfg.duration-0.02){if(!waitStart){waitStart=performance.now();window.__WAIT_START__=waitStart;}var waitVoice=(!mute&&aud.orig3&&!v3Ended&&(performance.now()-waitStart<4000));if(!waitVoice)flashDone();}
227
241
  }
@@ -115,4 +115,7 @@ if (!bigfishApp.includes('cueFailTimer')) throw new Error('重连提示音缺少
115
115
  if (!bigfishApp.includes("attachVoiceFx('reconnect')")) throw new Error('重连提示音未接入配音效果')
116
116
  if (!bigfishApp.includes("[20.0,'line3',3.300]")) throw new Error('app.js 默认时间线未把 line3 顺延到 20.0s')
117
117
  if (!bigfishCfg.includes("[20.0,'line3',3.300]")) throw new Error('config.js 时间线未把 line3 顺延到 20.0s')
118
+ /* v2.15.16:掉线彩蛋等当前配音播完再弹出,不硬切语音/字幕 */
119
+ if (!bigfishApp.includes('掉线彩蛋若正好赶上某句配音')) throw new Error('app.js 缺少彩蛋等待当前配音播完的逻辑')
120
+ if (!bigfishApp.includes('eggWait=true')) throw new Error('app.js 缺少 eggWait 等待状态')
118
121
  console.log('ok package.json version=' + pkg.version + ',无 BOM,关键文件齐全(含更新前回滚 checkpoint)');
@@ -463,7 +463,7 @@ ok(intervals.every((t) => t.cleared) || intervals.length === 0, '旧的 interval
463
463
  intervals.map((t) => (t.cleared ? 'cleared' : 'live')).join(','))
464
464
 
465
465
  console.log('\n=== ⑦ v2.13.0 测试钩子 / BUILD ===')
466
- ok(mod.__BUILD === 'cw-63', '__BUILD = cw-63(排查浏览器跑的是不是新包)', String(mod.__BUILD))
466
+ ok(mod.__BUILD === 'cw-64', '__BUILD = cw-64(排查浏览器跑的是不是新包)', String(mod.__BUILD))
467
467
  ok(mod.__VIDEO_ID === 'dsh-cw-video', '__VIDEO_ID = dsh-cw-video', String(mod.__VIDEO_ID))
468
468
  ok(typeof mod.__startShuffle === 'function', '__startShuffle 导出')
469
469
  ok(typeof mod.__stopShuffle === 'function', '__stopShuffle 导出')