alter-egoism/js/plugins/CBR_voice.js
2025-11-01 14:17:42 -05:00

228 lines
6.3 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.

/*:
* @target MZ
* @plugindesc ボイスのオートスクロール
* @author
*/
(function () {
// 変数117 → 状態
// 変数118 → duration
// スイッチ142 → オートON
//ボイス再生するとき、'loading'
//ボイスの再生時間が入ったら 'playding'
//ボイスの再生時間終わったら'next'
//遷移したら'end'
//NovelGameUI.jsの競合対策
Window_Message.prototype.update = function () {
if (!$gameMessage.isHideUiMode()) {
this.checkToNotClose();
this.updateControlButtons();
Window_Base.prototype.update.call(this);
this.synchronizeNameBox();
while (!this.isOpening() && !this.isClosing()) {
//開いてる時の独自処理
if (this.isOpen() && $gameSwitches.value(142)) {
var v = $gameVariables.value(117);
var vt = $gameVariables.value(118);
if (v === "loading") {
//ボイスのロード完了してたら
if (AudioManager._voiceBuffer && AudioManager._voiceBuffer._totalTime) {
$gameVariables.setValue(117, "playing");
$gameVariables.setValue(
118,
Math.ceil((AudioManager._voiceBuffer._totalTime - AudioManager._voiceBuffer.seek()) * 60 + 10)
);
} else {
vt--;
//ロード時間切れ
if (vt < 0) {
$gameVariables.setValue(117, "next");
} else {
$gameVariables.setValue(118, vt);
}
}
} else if (v === "playing" || v === "text") {
vt--;
//オート時間終了
if (vt < 0) {
this.CBR_auto_wait = 30;
$gameVariables.setValue(117, "next"); //ここから先はinputの方でやる
} else {
$gameVariables.setValue(118, vt);
}
} else {
$gameVariables.setValue(118, 40);
$gameVariables.setValue(117, "next"); //ここから先はinputの方でやる
}
}
if (this.updateWait()) {
if (this._waitForTerminate && this._waitCount === 0) {
this._waitForTerminate = false;
this.terminateMessage();
}
return;
} else if (this.updateLoading()) {
return;
} else if (this.updateInput()) {
return;
} else if (this.updateMessage()) {
return;
} else if (this.canStart()) {
this.startMessage();
} else {
this.startInput();
return;
}
}
}
};
var Window_Message_newPage = Window_Message.prototype.newPage;
Window_Message.prototype.newPage = function (textState) {
Window_Message_newPage.call(this, textState);
if ($gameSwitches.value(142) && $gameVariables.value(117) != "loading" && $gameVariables.value(117) != "playing") {
//loading出ない場合、新しいテキストを開いたときは文字数を待機時間にする
$gameVariables.setValue(117, "text");
$gameVariables.setValue(118, Math.ceil(textState.text.length * (8 - (7 / 100) * ConfigManager.autoMsSpeedVolume))); // 1文字辺りのフレーム数を1~8
}
};
Window_Message.prototype.updateInput = function () {
if (this.isAnySubWindowActive()) {
return true;
}
//飛ばすとき
if (this.pause) {
if (utakata.MessageSkip.isPressedMsgSkipButton()) {
this.pause = false;
if (!this._textState) {
this.terminateMessage();
}
return true;
}
if (this.isTriggered() || ($gameSwitches.value(142) && $gameVariables.value(117) === "next")) {
if (this.isTriggered()) {
this.CBR_auto_wait = 0;
}
if (0 < this.CBR_auto_wait) {
if (!this.isHidden()) {
this.CBR_auto_wait--;
}
} else {
$gameVariables.setValue(117, "end");
Input.update();
this.pause = false;
if (!this._textState) {
this.terminateMessage();
}
}
}
return true;
}
return false;
};
const _Window_Message_terminateMessage = Window_Message.prototype.terminateMessage;
Window_Message.prototype.terminateMessage = function () {
// ボイスを停止
AudioManager.playVoice({ name: "", volume: 100, pitch: 100, pan: 0 });
if ($gameSwitches.value(146)) {
// BGSを復帰させるボリューム調整した場合のみ
AudioManager.bgsVolume = $gameVariables.value(119);
$gameSwitches.setValue(146, false);
}
// ピクチャ9を消去する
$gameScreen.erasePicture(9);
// 元の処理
_Window_Message_terminateMessage.call(this);
};
})();
AudioManager._voiceVolume = 100;
AudioManager._voiceBuffer = null;
Object.defineProperty(AudioManager, "voiceVolume", {
get: function () {
return this._voiceVolume;
},
set: function (value) {
this._voiceVolume = value;
this.updateVoiceParameters(this._currentVoice);
},
configurable: true
});
AudioManager.playVoice = function (voice) {
var mat = /^Vo_([a-z]+)/g.exec(voice.name);
if (mat) {
var list = {
sir: 503,
yoz: 504,
rei: 505,
kao: 506,
kur: 507,
chi: 508,
aki: 510,
nar: 511,
mir: 509,
kag: 512,
mob: 513
};
var key = list[mat[1]] || 513;
if (key) {
if ($gameVariables.value(key) === 2) {
return;
}
}
} else {
if ($gameVariables.value(key) === 2) {
return;
}
}
this.stopVoice();
if (voice.name) {
//現在のBGVのボリュームを記憶する戦闘中は除外
if (!$gameParty.inBattle()) {
if (SceneManager._scene.constructor.name != "Scene_SplashScreen" && SceneManager._scene.constructor.name != "Scene_Title") {
$gameVariables.setValue(119, AudioManager._bgsVolume);
$gameSwitches.setValue(146, true);
AudioManager.bgsVolume = 0;
}
}
this._voiceBuffer = this.createBuffer("voice/", voice.name);
this.updateVoiceParameters(voice);
this._voiceBuffer.play(false);
this._voiceBuffer.addStopListener(this.stopVoice.bind(this));
}
};
AudioManager.stopVoice = function () {
if (this._voiceBuffer) {
this._voiceBuffer.destroy();
this._voiceBuffer = null;
}
};
AudioManager.updateVoiceParameters = function (voice) {
this.updateBufferParameters(this._voiceBuffer, this._meVolume, voice);
};
AudioManager.fadeOutMe = function (duration) {
if (this._voiceBuffer) {
this._voiceBuffer.fadeOut(duration);
}
};
AudioManager.stopMe = function () {
if (this._voiceBuffer) {
this._voiceBuffer.destroy();
this._voiceBuffer = null;
}
};