sol-rui-after-mini/www/js/plugins/JsScript4Set.js
2024-01-30 18:01:34 -06:00

217 lines
7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 2016/12/04 セーブ・ロードに対応、BGS並行演奏プラグイン(ParallelBgs.js)との連携
/*:
* @plugindesc
* @author くらむぼん
*
* @param listener
* @desc 音の「聞き手」をscreenかplayerから選ぶ
* @default screen
*
* @param decay
* @desc 音源と聞き手の距離が一歩広がった時の音量変化倍率(%)
* @default 85
*
* @param pan
* @desc 音源が聞き手の一歩右に居る時の変化位相
* @default 10
*
* @param cutoff
* @desc 音を鳴らすことを許可する最小の音量(%)
* @default 1
*
* @help
*/
(function() {
'use strict';
var parameters = PluginManager.parameters('JsScript4Set');
var listener = parameters['listener'];
var decay = toNumber(parameters['decay'], 85).clamp(0, Infinity);
var pan = toNumber(parameters['pan'], 10);
var cutoff = toNumber(parameters['cutoff'], 1).clamp(0, 100);
var _Game_Character_processMoveCommand = Game_Character.prototype.processMoveCommand;
Game_Character.prototype.processMoveCommand = function(command) {
if (command.code === Game_Character.ROUTE_PLAY_SE) playAdjustSe(command.parameters[0], this);
else _Game_Character_processMoveCommand.apply(this, arguments);
};
Sprite_Animation.prototype.processTimingData = function(timing) {
var duration = timing.flashDuration * this._rate;
switch (timing.flashScope) {
case 1:
this.startFlash(timing.flashColor, duration);
break;
case 2:
this.startScreenFlash(timing.flashColor, duration);
break;
case 3:
this.startHiding(duration);
break;
}
if (!this._duplicated && timing.se) {
playAdjustSe(timing.se, this._target && this._target._character);
}
};
var _BattleManager_replayBgmAndBgs = BattleManager.replayBgmAndBgs;
BattleManager.replayBgmAndBgs = function() {
_BattleManager_replayBgmAndBgs.apply(this, arguments);
AudioManager.updateAudioSource();
};
AudioManager.updateAudioSource = function() {
updateParameters(this._currentBgm, $gameMap.event($gameSystem._bgmSource), true);
if ($gameSystem._bgsSources) {
if (!this.iterateAllBgs) return delete $gameSystem._bgsSources;
this.iterateAllBgs(function() {
updateParameters(this._currentBgs, $gameMap.event($gameSystem._bgsSources[this.getBgsLineIndex()]));
}.bind(this));
}
else updateParameters(this._currentBgs, $gameMap.event($gameSystem._bgsSource));
};
var _AudioManager_updateBgmParameters = AudioManager.updateBgmParameters;
AudioManager.updateBgmParameters = function(bgm) {
if ($gameMap && $gameMap.event($gameSystem._bgmSource)) return;
_AudioManager_updateBgmParameters.apply(this, arguments);
};
var _AudioManager_updateBgsParameters = AudioManager.updateBgsParameters;
AudioManager.updateBgsParameters = function(bgs) {
if ($gameMap && $gameSystem) {
if ($gameSystem._bgsSources && this.getBgsLineIndex) {
if ($gameMap.event($gameSystem._bgsSources[this.getBgsLineIndex()])) return;
} else {
if ($gameMap.event($gameSystem._bgsSource)) return;
}
}
_AudioManager_updateBgsParameters.apply(this, arguments);
};
var _AudioManager_bgmVolume = Object.getOwnPropertyDescriptor(AudioManager, 'bgmVolume');
Object.defineProperty(AudioManager, 'bgmVolume', {
get: function() {
return _AudioManager_bgmVolume.get.call(this);
},
set: function(value) {
_AudioManager_bgmVolume.set.call(this, value);
if ($gameMap && $gameSystem) this.updateAudioSource();
},
configurable: true
});
var _AudioManager_bgsVolume = Object.getOwnPropertyDescriptor(AudioManager, 'bgsVolume');
Object.defineProperty(AudioManager, 'bgsVolume', {
get: function() {
return _AudioManager_bgsVolume.get.call(this);
},
set: function(value) {
_AudioManager_bgsVolume.set.call(this, value);
if ($gameMap && $gameSystem) this.updateAudioSource();
},
configurable: true
});
var bgmOnSave = null;
var bgsOnSave = null;
var _Scene_Map_onMapLoaded = Scene_Map.prototype.onMapLoaded;
Scene_Map.prototype.onMapLoaded = function() {
_Scene_Map_onMapLoaded.apply(this, arguments);
if (bgmOnSave) {
AudioManager.playBgm(bgmOnSave);
bgmOnSave = null;
}
if (bgsOnSave) {
AudioManager.playBgs(bgsOnSave);
bgsOnSave = null;
}
AudioManager.updateAudioSource();
};
var _Game_System_onAfterLoad = Game_System.prototype.onAfterLoad;
Game_System.prototype.onAfterLoad = function() {
bgmOnSave = this._bgmOnSave;
bgsOnSave = this._bgsOnSave;
this._bgmOnSave = this._bgsOnSave = {};
_Game_System_onAfterLoad.apply(this, arguments);
this._bgmOnSave = bgmOnSave;
this._bgsOnSave = bgsOnSave;
};
var _Game_Map_update = Game_Map.prototype.update;
Game_Map.prototype.update = function(sceneActive) {
_Game_Map_update.apply(this, arguments);
AudioManager.updateAudioSource();
};
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);
if (command.toLowerCase() === 'JsScript4Set') {
var eventId = +args[1] === 0 ? this._eventId : +args[1];
switch (args[0].toLowerCase()) {
case 'listener':
$gameSystem._listenerEvent = eventId;
break;
case 'bgm':
$gameSystem._bgmSource = eventId;
break;
case 'bgs':
if ($gameSystem.getBgsLine) {
$gameSystem._bgsSources = $gameSystem._bgsSources || [];
$gameSystem._bgsSources[$gameSystem.getBgsLine()] = eventId;
}
else $gameSystem._bgsSource = eventId;
break;
case 'se':
$gameSystem._seSourceOff = args[1].toLowerCase() === 'off';
break;
default:
break;
}
}
};
function toNumber(str, def) {
return isNaN(str) ? def : +(str || def);
}
function updateParameters(audio, source, isBgm) {
if (audio && source) {
var lastVolume = audio.volume;
var lastPan = audio.pan;
adjust(audio, source);
if (audio.volume < cutoff) audio.volume = 0;
var buffer = AudioManager[isBgm ? '_bgmBuffer' : '_bgsBuffer'];
if (buffer && buffer._gainNode) buffer._gainNode.gain.cancelScheduledValues(0);
AudioManager.updateBufferParameters(buffer, AudioManager[isBgm ? '_bgmVolume' : '_bgsVolume'], audio);
audio.volume = lastVolume;
audio.pan = lastPan;
}
}
function playAdjustSe(se, source) {
if (source && !$gameSystem._seSourceOff) {
var lastVolume = se.volume;
var lastPan = se.pan;
adjust(se, source);
if (se.volume >= cutoff) AudioManager.playSe(se);
se.volume = lastVolume;
se.pan = lastPan;
}
else AudioManager.playSe(se);
}
function adjust(audio, source) {
if (!source) throw new Error('audiosourceエラー音源となるイベントが存在しません');
var listenerX, listenerY, listenerEvent = $gameMap.event($gameSystem._listenerEvent);
if (listenerEvent) {
listenerX = listenerEvent._realX;
listenerY = listenerEvent._realY;
} else {
switch (listener.toLowerCase()) {
case 'screen':
listenerX = $gameMap.displayX() + $gamePlayer.centerX();
listenerY = $gameMap.displayY() + $gamePlayer.centerY();
break;
case 'player':
listenerX = $gamePlayer._realX;
listenerY = $gamePlayer._realY;
break;
default:
throw new Error('audiosourceエラーlistenerパラメータはscreenかplayerにしてください');
break;
}
}
var dx = $gameMap.deltaX(source._realX, listenerX);
var dy = $gameMap.deltaY(source._realY, listenerY);
var d = Math.sqrt(dx * dx + dy * dy);
if (d > 1) audio.volume *= Math.pow(decay / 100, d - 1);
audio.pan = (dx * pan).clamp(-100, 100);
}
AudioManager.playAdjustSe = playAdjustSe;
})();