20 lines
4.0 KiB
HTML
20 lines
4.0 KiB
HTML
<!doctype html><html lang="zh-CN"><meta charset="utf-8"><title>律动与接力验证</title>
|
|
<style>body{margin:0;font:13px system-ui;background:#e8e5df}header{padding:8px;display:flex;gap:8px;flex-wrap:wrap}button{padding:6px}iframe{width:100%;height:calc(100vh - 92px);border:0}output{padding:5px}</style>
|
|
<header><button data-audio="music">模拟音乐频谱</button><button data-audio="silent">模拟静音</button><button data-style="original">保持原样</button><button data-style="music-flat">律动时归齐</button><button data-style="flat">始终归齐</button><button id="hide">隐藏游戏入口</button><button id="show">显示游戏入口</button><button id="pause">暂停/恢复宿主</button><button data-boot="auto">工作台短入场</button><button data-boot="show">完整入场</button><button id="archiveboot">展示模式短入场</button><button id="autotest">验证三次接力与恢复</button><button data-breath="on">开启呼吸</button><button data-breath="off">关闭呼吸</button><button data-rhythm="legacy">原版律动</button><button data-rhythm="wave">A · 左低中中右高</button><button data-rhythm="lift">B · 连续流波</button><output></output><strong id="result"></strong></header>
|
|
<iframe src="/?scene=archive" title="音乐律动和小游戏"></iframe>
|
|
<script>
|
|
const frame=document.querySelector('iframe');let music=false,paused=false;
|
|
document.querySelector('#autotest').onclick=()=>{const w=frame.contentWindow,d=w.document;document.querySelector('#result').textContent='验证中';(d.querySelector('.relay-retry:not([hidden])')||d.querySelector('.relay-entry'))?.click();let count=0;const poll=setInterval(()=>{const target=d.querySelector('.relay-target:not([hidden])');if(!target)return;target.click();count++;if(count===3){clearInterval(poll);setTimeout(()=>{const score=d.querySelector('#stage').dataset.relayScore;d.querySelector('.relay-exit').click();setTimeout(()=>document.querySelector('#result').textContent='接力得分 '+score+';退出状态 '+d.querySelector('#stage').dataset.relayStatus,500)},200)}},500)};
|
|
const props=p=>frame.contentWindow.wallpaperPropertyListener?.applyUserProperties(Object.fromEntries(Object.entries(p).map(([k,v])=>[k,{value:v}])));
|
|
document.querySelectorAll('[data-breath]').forEach(b=>b.onclick=()=>props({idlebreathing:b.dataset.breath==='on'}));
|
|
document.querySelectorAll('[data-rhythm]').forEach(b=>b.onclick=()=>props({rhythmstyle:b.dataset.rhythm}));
|
|
frame.addEventListener('load',()=>props({desktopmode:'workbench',sound:false,music:false,reduced:false,audioreactive:true,gamepace:'gentle'}));
|
|
document.querySelectorAll('[data-audio]').forEach(b=>b.onclick=()=>music=b.dataset.audio==='music');
|
|
document.querySelectorAll('[data-style]').forEach(b=>b.onclick=()=>props({selectionstyle:b.dataset.style}));
|
|
document.querySelector('#hide').onclick=()=>props({showgame:false});document.querySelector('#show').onclick=()=>props({showgame:true});
|
|
document.querySelector('#pause').onclick=()=>frame.contentWindow.wallpaperPropertyListener.setPaused(paused=!paused);
|
|
document.querySelectorAll('[data-boot]').forEach(b=>b.onclick=()=>{paused=false;frame.contentWindow.wallpaperPropertyListener.setPaused(false);props({desktopmode:'workbench',openingdetail:b.dataset.boot});frame.contentWindow.rhine.seek(24.8)});
|
|
document.querySelector('#archiveboot').onclick=()=>{paused=false;frame.contentWindow.wallpaperPropertyListener.setPaused(false);props({desktopmode:'archive',openingdetail:'skip'});frame.contentWindow.rhine.seek(24.8)};
|
|
setInterval(()=>{const w=frame.contentWindow,t=w.performance.now()/1000;w.rhineWallpaperSpectrum={samples:Array.from({length:128},(_,i)=>music?(.3+.24*Math.sin(t*4))*(i%64<8?1:i%64<32?.7:.4):0),time:t};const s=w.document.querySelector('#stage');document.querySelector('output').textContent=s?`呼吸 ${w.rhine?.stats().idleGain?.toFixed(3)} · 状态 ${s.dataset.relayStatus} · 得分 ${s.dataset.relayScore} · 音乐 ${s.dataset.spectrumLevel} · 模式 ${s.dataset.mode} · 暂停 ${w.rhineWallpaperHost?.paused} · 时间 ${w.rhine?.stats().bootTime?.toFixed(2)}`:''},33);
|
|
</script></html>
|