137 lines
No EOL
5.7 KiB
JavaScript
137 lines
No EOL
5.7 KiB
JavaScript
/*:
|
||
* @target MZ
|
||
* @plugindesc 通知メッセージ(中央版)用パッチ: 自然な上スクロール v1.7.0
|
||
* @author IvI (Modified by Gemini)
|
||
* @base TorigoyaMZ_NotifyMessage
|
||
* @base TorigoyaMZ_NotifyMessage_AddonVariableChangeCenter
|
||
* @base TorigoyaMZ_NotifyMessage_AddonSwitchUnlockCenter
|
||
* @base TorigoyaMZ_NotifyMessage_CommandMessage
|
||
* @orderAfter TorigoyaMZ_NotifyMessage
|
||
* @orderAfter TorigoyaMZ_NotifyMessage_AddonVariableChangeCenter
|
||
* @orderAfter TorigoyaMZ_NotifyMessage_AddonSwitchUnlockCenter
|
||
* @orderAfter TorigoyaMZ_NotifyMessage_CommandMessage
|
||
*
|
||
* @help
|
||
* このプラグインは、Torigoya様の通知メッセージプラグイン及び
|
||
* その中央表示アドオン群と併用するためのパッチです。
|
||
*
|
||
* v1.7.0 (最終修正版):
|
||
* 競合の根本原因であった2つのアドオン(コマンドメッセージ、変数変動通知)
|
||
* の位置指定処理を、それぞれ個別の方法で完全に無効化するようにしました。
|
||
* これが、度重なった不具合に対する最終的な解決策となります。
|
||
*/
|
||
|
||
(() => {
|
||
'use strict';
|
||
|
||
const PLUGIN_NAME = 'TorigoyaMZ_NotifyMessage_PatchNaturalScroll';
|
||
|
||
const Torigoya = window.Torigoya || {};
|
||
if (!Torigoya.NotifyMessage || !Torigoya.NotifyMessage.Manager) {
|
||
return;
|
||
}
|
||
|
||
const Manager = Torigoya.NotifyMessage.Manager;
|
||
let activeCenterScrollTweens = [];
|
||
let refreshTimeout = null;
|
||
|
||
// --- 競合する処理の無効化 ---
|
||
// ▼▼▼【v1.7.0での修正点】▼▼▼
|
||
|
||
// 1.「コマンドメッセージアドオン」の競合処理を無効化
|
||
// アドオンのプラグインコマンドを、位置指定処理を削除した上で再登録(上書き)する
|
||
const COMMAND_MESSAGE_PLUGIN_NAME = 'TorigoyaMZ_NotifyMessage_CommandMessage';
|
||
PluginManager.registerCommand(COMMAND_MESSAGE_PLUGIN_NAME, 'Show', (args) => {
|
||
const message = String(args.message || '').trim();
|
||
if (!message) return;
|
||
|
||
const iconId = Number(args.iconId || 0);
|
||
|
||
const notifyItem = new Torigoya.NotifyMessage.NotifyItem({
|
||
message,
|
||
icon: iconId,
|
||
note: '<type:variableChange>',
|
||
});
|
||
notifyItem._fromCommand = true;
|
||
|
||
// 本来ここにあった位置指定関数(refreshCommandStackPositions)を呼び出さない
|
||
Manager.notify(notifyItem);
|
||
});
|
||
console.log(`[${PLUGIN_NAME}] ${COMMAND_MESSAGE_PLUGIN_NAME}の位置指定処理を無効化しました。`);
|
||
|
||
// 2.「変数変動通知アドオン」の競合処理を無効化
|
||
// ゲーム起動時に、アドオンが登録した位置指定リスナーを特定して削除する
|
||
const _Scene_Boot_start = Scene_Boot.prototype.start;
|
||
Scene_Boot.prototype.start = function() {
|
||
_Scene_Boot_start.apply(this, arguments);
|
||
|
||
if (Manager._handlers && Manager._handlers.length > 0) {
|
||
const originalHandlers = [...Manager._handlers];
|
||
const newHandlers = originalHandlers.filter(handler => {
|
||
const handlerString = handler.toString();
|
||
// 'placeAtCenter' という文字列を含む、位置決定を行うリスナーは除外する
|
||
return !handlerString.includes('placeAtCenter');
|
||
});
|
||
|
||
if (originalHandlers.length !== newHandlers.length) {
|
||
Manager._handlers = newHandlers;
|
||
console.log(`[${PLUGIN_NAME}] TorigoyaMZ_NotifyMessage_AddonVariableChangeCenterの位置指定処理を無効化しました。`);
|
||
}
|
||
}
|
||
};
|
||
// ▲▲▲【v1.7.0での修正点】▲▲▲
|
||
|
||
|
||
/**
|
||
* 中央通知スタックの位置を再計算し、上へスライドさせる(このパッチの本体処理)
|
||
*/
|
||
function refreshCenterStackPositionsUpwards() {
|
||
activeCenterScrollTweens.forEach(tween => tween.abort());
|
||
activeCenterScrollTweens = [];
|
||
|
||
const stacks = Manager._stacks.filter(
|
||
(s) => s.notifyItem?.note === '<type:variableChange>' && s.window
|
||
);
|
||
if (stacks.length === 0) return;
|
||
|
||
const addonParams = PluginManager.parameters('TorigoyaMZ_NotifyMessage_AddonVariableChangeCenter');
|
||
const basePluginParams = Torigoya.NotifyMessage.parameter;
|
||
|
||
const BASE_Y = Number(addonParams.centerY || 360);
|
||
const MARGIN = Manager.itemMargin();
|
||
const APPEAR_TIME = basePluginParams.baseAppearTime;
|
||
const TOP_PADDING = basePluginParams.advancedUiPaddingTop;
|
||
|
||
let currentY = BASE_Y;
|
||
|
||
for (let i = stacks.length - 1; i >= 0; --i) {
|
||
const stack = stacks[i];
|
||
const newY = currentY;
|
||
|
||
if (newY + stack.window.height < TOP_PADDING) {
|
||
Manager.forceStartExitAnimation(stack);
|
||
} else {
|
||
stack.y = newY;
|
||
const tween = Torigoya.FrameTween.create(stack.window)
|
||
.group(Manager._group)
|
||
.to({ y: newY }, APPEAR_TIME, Torigoya.FrameTween.Easing.easeInOutQuad)
|
||
.start();
|
||
activeCenterScrollTweens.push(tween);
|
||
}
|
||
currentY -= (stack.window.height + MARGIN);
|
||
}
|
||
}
|
||
|
||
// このパッチの位置決定処理を、マネージャーに登録する
|
||
Manager.on((notifyItem) => {
|
||
if (notifyItem.note === '<type:variableChange>') {
|
||
if (refreshTimeout) {
|
||
clearTimeout(refreshTimeout);
|
||
}
|
||
refreshTimeout = setTimeout(() => {
|
||
refreshCenterStackPositionsUpwards();
|
||
refreshTimeout = null;
|
||
}, 16);
|
||
}
|
||
});
|
||
})(); |