pure-full-lily/js/plugins/TorigoyaMZ_NotifyMessage_PatchNaturalScroll.js
2025-09-16 10:12:44 -05:00

137 lines
No EOL
5.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.

/*:
* @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);
}
});
})();