magical-girls-runa-and-nanami/js/plugins/ScrollForceCenter.js
2026-02-28 12:33:13 -06:00

268 lines
10 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.

//=============================================================================
// ScrollForceCenter.js
// ----------------------------------------------------------------------------
// (C) 2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 2.0/4 2022/08/10 2.0.3の修正を近景プラグインにも正しく適用
// 2.0.3 2021/08/24 遠景を設定してスクロールしたときに画面端に近づくと遠景が高速でスクロールしてしまう問題を修正
// 2.0.2 2021/04/19 マップがループしているとき画面シフトが機能しない問題を修正
// 2.0.1 2020/11/26 イベントテストでエラーになる問題を修正
// 2.0.0 2020/11/18 MZ向けに全面的にリファクタリング
// 1.1.0 2019/04/28 中心座標を指定したぶんだけずらせる機能を追加
// 1.0.0 2016/09/15 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc ScrollForceCenterPlugin
* @target MZ
* @base PluginCommonBase
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/ScrollForceCenter.js
* @author triacontane
*
* @param adjustX
* @desc The specified number of tiles are displayed with the center shifted in the X direction.
* @default 0
* @type number
* @min -500
* @max 500
*
* @param adjustY
* @desc The specified number of tiles are displayed with the center shifted in the Y direction.
* @default 0
* @type number
* @min -500
* @max 500
*
* @command DISABLE_RESERVE
* @text DISABLE RESERVE
* @desc Forced center-scrolling is prohibited and normal scrolling is used.
*
* @command ENABLE_RESERVE
* @text ENABLE RESERVE
* @desc Again, forced center scrolling will be allowed.
*
* @help In the map screen the player will always be centered on the screen,
* regardless of the map size.
* If the outside of the map goes into the screen,
* it will be displayed in pitch black.
*
* The base plugin "PluginCommonBase.js" is required to use this plugin.
* The "PluginCommonBase.js" is here.
* (MZ install path)dlc/BasicResources/plugins/official/PluginCommonBase.js
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc 強制中央スクロールプラグイン
* @target MZ
* @base PluginCommonBase
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/ScrollForceCenter.js
* @author トリアコンタン
*
* @param adjustX
* @text X補正
* @desc 指定したタイル数だけ中心がX方向にずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @param adjustY
* @text Y補正
* @desc 指定したタイル数だけ中心がY方向にずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @command DISABLE_RESERVE
* @text 強制中央スクロール禁止予約
* @desc 強制中央スクロールが禁止され通常スクロールになります。次回場所移動後から有効になります。
*
* @command ENABLE_RESERVE
* @text 強制中央スクロール許可予約
* @desc 再度、強制中央スクロールが許可されます。次回場所移動後から有効になります。
*
* @help マップ画面でマップサイズにかかわらずプレイヤーが常に画面中央に
* 配置されるようになります。
* マップの外側が画面内に入る場合、真っ黒の状態で表示されます。
*
* マップ設定のメモ欄に以下の通り記述すると、マップ単位で強制中央スクロールの
* 禁止/許可を制御できます。この設定はプラグインコマンドより優先されます。
* <SFC禁止> # 対象マップで強制中央スクロールが禁止されます。
* <SFC_Disable> # 同上
* <SFC許可> # 対象マップで強制中央スクロールが許可されます。
* <SFC_Enable> # 同上
*
* このプラグインの利用にはベースプラグイン『PluginCommonBase.js』が必要です。
* 『PluginCommonBase.js』は、RPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています。
* dlc/BasicResources/plugins/official
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態商用、18禁利用等
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function() {
'use strict';
const script = document.currentScript;
const param = PluginManagerEx.createParameter(script);
PluginManagerEx.registerCommand(script, 'DISABLE_RESERVE', args => {
$gameMap.setDisableForceCenterReserve(true);
});
PluginManagerEx.registerCommand(script, 'ENABLE_RESERVE', args => {
$gameMap.setDisableForceCenterReserve(false);
});
const _Game_Player_updateScroll = Game_Player.prototype.updateScroll;
Game_Player.prototype.updateScroll = function(lastScrolledX, lastScrolledY) {
_Game_Player_updateScroll.apply(this, arguments);
if ($gameMap.isForceCenter()) {
const x1 = lastScrolledX;
const y1 = lastScrolledY;
const x2 = this.scrolledX();
const y2 = this.scrolledY();
if (y2 > y1 && y2 <= this.centerY()) {
$gameMap.scrollDown(y2 - y1);
}
if (x2 < x1 && x2 >= this.centerX()) {
$gameMap.scrollLeft(x1 - x2);
}
if (x2 > x1 && x2 <= this.centerX()) {
$gameMap.scrollRight(x2 - x1);
}
if (y2 < y1 && y2 >= this.centerY()) {
$gameMap.scrollUp(y1 - y2);
}
}
};
const _Game_Map_initialize = Game_Map.prototype.initialize;
Game_Map.prototype.initialize = function() {
_Game_Map_initialize.apply(this, arguments);
this._disableForceCenter = false;
this._disableForceCenterReserve = false;
};
const _Game_Map_setup = Game_Map.prototype.setup;
Game_Map.prototype.setup = function(mapId) {
if (mapId > 0) {
this.refreshDisableForceCenter();
}
_Game_Map_setup.apply(this, arguments);
};
Game_Map.prototype.isForceCenter = function() {
return !this._disableForceCenter;
};
Game_Map.prototype.setDisableForceCenterReserve = function(value) {
this._disableForceCenterReserve = !!value;
};
Game_Map.prototype.refreshDisableForceCenter = function() {
let disableForceCenter;
if (PluginManagerEx.findMetaValue($dataMap, ['SFC禁止', 'SFC_Disable'])) {
disableForceCenter = true;
} else if (PluginManagerEx.findMetaValue($dataMap, ['SFC許可', 'SFC_Enable'])) {
disableForceCenter = false;
} else {
disableForceCenter = this._disableForceCenterReserve;
}
this._disableForceCenter = disableForceCenter;
};
const _Game_Map_setDisplayPos = Game_Map.prototype.setDisplayPos;
Game_Map.prototype.setDisplayPos = function(x, y) {
_Game_Map_setDisplayPos.apply(this, arguments);
if (this.isForceCenterHorizontal()) {
this._displayX = x + (param.adjustX || 0);
this._parallaxX = this._displayX;
} else if (this.isLoopHorizontal()) {
this._displayX += param.adjustX || 0;
}
if (this.isForceCenterVertical()) {
this._displayY = y + (param.adjustY || 0);
this._parallaxY = this._displayY;
}else if (this.isLoopVertical()) {
this._displayY += param.adjustY || 0;
}
};
Game_Map.prototype.isForceCenterVertical = function() {
return !this.isLoopVertical() && this.isForceCenter();
};
Game_Map.prototype.isForceCenterHorizontal = function() {
return !this.isLoopHorizontal() && this.isForceCenter();
};
const _Game_Map_scrollDown = Game_Map.prototype.scrollDown;
Game_Map.prototype.scrollDown = function(distance) {
const forceCenterDisplayY = this._displayY + distance;
const lastY = this._displayY;
const lastPy = this._parallaxY;
const lastFy = this._foregroundY;
_Game_Map_scrollDown.apply(this, arguments);
if (this.isForceCenterVertical()) {
this._displayY = forceCenterDisplayY;
this._parallaxY = lastPy + this._displayY - lastY;
this._foregroundY = lastFy + this._displayY - lastY;
}
};
const _Game_Map_scrollLeft = Game_Map.prototype.scrollLeft;
Game_Map.prototype.scrollLeft = function(distance) {
const forceCenterDisplayX = this._displayX - distance;
const lastX = this._displayX;
const lastPx = this._parallaxX;
const lastFx = this._foregroundX;
_Game_Map_scrollLeft.apply(this, arguments);
if (this.isForceCenterHorizontal()) {
this._displayX = forceCenterDisplayX;
this._parallaxX = lastPx + this._displayX - lastX;
this._foregroundX = lastFx + this._displayX - lastX;
}
};
const _Game_Map_scrollRight = Game_Map.prototype.scrollRight;
Game_Map.prototype.scrollRight = function(distance) {
const forceCenterDisplayX = this._displayX + distance;
const lastX = this._displayX;
const lastPx = this._parallaxX;
const lastFx = this._foregroundX;
_Game_Map_scrollRight.apply(this, arguments);
if (this.isForceCenterHorizontal()) {
this._displayX = forceCenterDisplayX;
this._parallaxX = lastPx + this._displayX - lastX;
this._foregroundX = lastFx + this._displayX - lastX;
}
};
const _Game_Map_scrollUp = Game_Map.prototype.scrollUp;
Game_Map.prototype.scrollUp = function(distance) {
const forceCenterDisplayY = this._displayY - distance;
const lastY = this._displayY;
const lastPy = this._parallaxY;
const lastFy = this._foregroundY;
_Game_Map_scrollUp.apply(this, arguments);
if (this.isForceCenterVertical()) {
this._displayY = forceCenterDisplayY;
this._parallaxY = lastPy + this._displayY - lastY;
this._foregroundY = lastFy + this._displayY - lastY;
}
};
})();