217 lines
7 KiB
JavaScript
217 lines
7 KiB
JavaScript
// 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;
|
||
})();
|