/*: * @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: '', }); 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 === '' && 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 === '') { if (refreshTimeout) { clearTimeout(refreshTimeout); } refreshTimeout = setTimeout(() => { refreshCenterStackPositionsUpwards(); refreshTimeout = null; }, 16); } }); })();