70 lines
2.7 KiB
JavaScript
70 lines
2.7 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc ムービー再生開始時にBGMボリュームを適用(Video.playをフック) v1.0.0
|
||
* @author yuz-co-show
|
||
*
|
||
* @command InstallBgmHook
|
||
* @text BGM音量フックをインストール
|
||
* @desc 以後、ムービー再生開始時に BGM 音量(AudioManager.bgmVolume)を適用。
|
||
*
|
||
* @command UninstallBgmHook
|
||
* @text BGM音量フックを解除
|
||
* @desc Video.play の上書きを解除して元に戻します。
|
||
*
|
||
* @help
|
||
* MZではムービーは静的クラス Video が扱います(Video.play / Video.setVolume)。
|
||
* このプラグインはプラグインコマンドで Video.play を一度だけ上書きし、
|
||
* 再生のたびに「開始時点の BGM 音量」を 0..1 に換算して Video.setVolume へ渡します。
|
||
*
|
||
* 仕様:
|
||
* - 反映は「開始時だけ」。再生中にBGM音量を変えても追従しません。
|
||
* - 参照: AudioManager.bgmVolume(0..100)。無ければ ConfigManager.volumeBgm を使用。
|
||
* - 他プラグインが後から Video.play を上書きした場合は、再度「インストール」を実行してください。
|
||
*/
|
||
(() => {
|
||
'use strict';
|
||
|
||
const PLUGIN_NAME = document.currentScript.src.split('/').pop().replace(/\.js$/, '');
|
||
|
||
function getBgmVol01() {
|
||
let v = 100;
|
||
if (typeof AudioManager !== 'undefined' && typeof AudioManager.bgmVolume === 'number') {
|
||
v = AudioManager.bgmVolume;
|
||
} else if (typeof ConfigManager !== 'undefined' && typeof ConfigManager.volumeBgm === 'number') {
|
||
v = ConfigManager.volumeBgm;
|
||
}
|
||
return Math.max(0, Math.min(1, v / 100));
|
||
}
|
||
|
||
function install() {
|
||
if (typeof Video === 'undefined' || typeof Video.play !== 'function' || typeof Video.setVolume !== 'function') {
|
||
console.warn('MovieBgmVolumeMZ: Video API が未準備のためフックできませんでした。');
|
||
return false;
|
||
}
|
||
if (Video.__mbv_hooked) return true;
|
||
|
||
Video.__mbv_originalPlay = Video.play.bind(Video);
|
||
Video.play = function(src) {
|
||
try {
|
||
Video.setVolume(getBgmVol01());
|
||
} catch (_) {}
|
||
return Video.__mbv_originalPlay(src);
|
||
};
|
||
|
||
Video.__mbv_hooked = true;
|
||
return true;
|
||
}
|
||
|
||
function uninstall() {
|
||
if (typeof Video === 'undefined') return false;
|
||
if (!Video.__mbv_hooked) return true;
|
||
if (typeof Video.__mbv_originalPlay === 'function') {
|
||
Video.play = Video.__mbv_originalPlay;
|
||
}
|
||
Video.__mbv_hooked = false;
|
||
return true;
|
||
}
|
||
|
||
PluginManager.registerCommand(PLUGIN_NAME, 'InstallBgmHook', install);
|
||
PluginManager.registerCommand(PLUGIN_NAME, 'UninstallBgmHook', uninstall);
|
||
})();
|