divagate/www/js/plugins/ScrollForceCenter.js
2023-08-31 14:59:34 -05:00

296 lines
11 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
// 1.1.1 2020/11/26 イベントテストでエラーになる問題を修正
// 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
* @author triacontane
*
* @param adjustX
* @desc 指定した分だけ中心がずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @param adjustY
* @desc 指定した分だけ中心がずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @help マップ画面でマップサイズにかかわらずプレイヤーが常に画面中央に
* 配置されるようになります。
* マップの外側が画面内に入る場合、真っ黒の状態で表示されます。
*
* プラグインコマンド詳細
* イベントコマンド「プラグインコマンド」から実行。
* (パラメータの間は半角スペースで区切る)
*
* SFC禁止予約 # 強制中央スクロールが禁止され通常スクロールになります。
* SFC_DISABLE_RESERVE # 同上
* SFC許可予約 # 再度、強制中央スクロールが許可されます。
* SFC_ENABLE_RESERVE # 同上
*
* 上記の設定はすぐには反映されず、次回場所移動後から有効になります。
*
* またマップ設定のメモ欄に以下の通り記述すると、マップ単位で強制中央スクロールの
* 禁止/許可を制御できます。この設定はプラグインコマンドより優先されます。
* <SFC禁止> # 対象マップで強制中央スクロールが禁止されます。
* <SFC_Disable> # 同上
* <SFC許可> # 対象マップで強制中央スクロールが許可されます。
* <SFC_Enable> # 同上
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc 強制中央スクロールプラグイン
* @author トリアコンタン
*
* @param adjustX
* @text X補正
* @desc 指定した分だけ中心がずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @param adjustY
* @text Y補正
* @desc 指定した分だけ中心がずれて表示されます。
* @default 0
* @type number
* @min -500
* @max 500
*
* @help マップ画面でマップサイズにかかわらずプレイヤーが常に画面中央に
* 配置されるようになります。
* マップの外側が画面内に入る場合、真っ黒の状態で表示されます。
*
* プラグインコマンド詳細
* イベントコマンド「プラグインコマンド」から実行。
* (パラメータの間は半角スペースで区切る)
*
* SFC禁止予約 # 強制中央スクロールが禁止され通常スクロールになります。
* SFC_DISABLE_RESERVE # 同上
* SFC許可予約 # 再度、強制中央スクロールが許可されます。
* SFC_ENABLE_RESERVE # 同上
*
* 上記の設定はすぐには反映されず、次回場所移動後から有効になります。
*
* またマップ設定のメモ欄に以下の通り記述すると、マップ単位で強制中央スクロールの
* 禁止/許可を制御できます。この設定はプラグインコマンドより優先されます。
* <SFC禁止> # 対象マップで強制中央スクロールが禁止されます。
* <SFC_Disable> # 同上
* <SFC許可> # 対象マップで強制中央スクロールが許可されます。
* <SFC_Enable> # 同上
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態商用、18禁利用等
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function() {
'use strict';
var metaTagPrefix = 'SFC';
var getCommandName = function(command) {
return (command || '').toUpperCase();
};
var getMetaValue = function(object, name) {
var metaTagName = metaTagPrefix + (name ? name : '');
return object.meta.hasOwnProperty(metaTagName) ? object.meta[metaTagName] : undefined;
};
var getMetaValues = function(object, names) {
if (!Array.isArray(names)) return getMetaValue(object, names);
for (var i = 0, n = names.length; i < n; i++) {
var value = getMetaValue(object, names[i]);
if (value !== undefined) return value;
}
return undefined;
};
/**
* Create plugin parameter. param[paramName] ex. param.commandPrefix
* @param pluginName plugin name(EncounterSwitchConditions)
* @returns {Object} Created parameter
*/
var createPluginParameter = function(pluginName) {
var paramReplacer = function(key, value) {
if (value === 'null') {
return value;
}
if (value[0] === '"' && value[value.length - 1] === '"') {
return value;
}
try {
return JSON.parse(value);
} catch (e) {
return value;
}
};
var parameter = JSON.parse(JSON.stringify(PluginManager.parameters(pluginName), paramReplacer));
PluginManager.setParameters(pluginName, parameter);
return parameter;
};
var param = createPluginParameter('ScrollForceCenter');
//=============================================================================
// Game_Interpreter
// プラグインコマンドを追加定義します。
//=============================================================================
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);
if (!command.match(new RegExp('^' + metaTagPrefix))) return;
this.pluginCommandScrollForceCenter(command.replace(metaTagPrefix, ''), args);
};
Game_Interpreter.prototype.pluginCommandScrollForceCenter = function(command) {
switch (getCommandName(command)) {
case '禁止予約' :
case '_DISABLE_RESERVE':
$gameMap.setDisableForceCenterReserve(true);
break;
case '許可予約' :
case '_ENABLE_RESERVE':
$gameMap.setDisableForceCenterReserve(false);
break;
}
};
var _Game_Player_updateScroll = Game_Player.prototype.updateScroll;
Game_Player.prototype.updateScroll = function(lastScrolledX, lastScrolledY) {
_Game_Player_updateScroll.apply(this, arguments);
if ($gameMap.isForceCenter()) {
var x1 = lastScrolledX;
var y1 = lastScrolledY;
var x2 = this.scrolledX();
var 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);
}
}
};
var _Game_Map_initialize = Game_Map.prototype.initialize;
Game_Map.prototype.initialize = function() {
_Game_Map_initialize.apply(this, arguments);
this._disableForceCenter = false;
this._disableForceCenterReserve = false;
};
var _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() {
var disableForceCenter;
if (getMetaValues($dataMap, ['禁止', '_Disable'])) {
disableForceCenter = true;
} else if (getMetaValues($dataMap, ['許可', '_Enable'])) {
disableForceCenter = false;
} else {
disableForceCenter = this._disableForceCenterReserve;
}
this._disableForceCenter = disableForceCenter;
};
var _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;
}
if (this.isForceCenterVertical()) {
this._displayY = y + (param.adjustY || 0);
this._parallaxY = this._displayY;
}
};
Game_Map.prototype.isForceCenterVertical = function() {
return !this.isLoopVertical() && this.isForceCenter();
};
Game_Map.prototype.isForceCenterHorizontal = function() {
return !this.isLoopHorizontal() && this.isForceCenter();
};
var _Game_Map_scrollDown = Game_Map.prototype.scrollDown;
Game_Map.prototype.scrollDown = function(distance) {
var forceCenterDisplayY = this._displayY + distance;
_Game_Map_scrollDown.apply(this, arguments);
if (this.isForceCenterVertical()) {
this._displayY = forceCenterDisplayY;
}
};
var _Game_Map_scrollLeft = Game_Map.prototype.scrollLeft;
Game_Map.prototype.scrollLeft = function(distance) {
var forceCenterDisplayX = this._displayX - distance;
_Game_Map_scrollLeft.apply(this, arguments);
if (this.isForceCenterHorizontal()) {
this._displayX = forceCenterDisplayX;
}
};
var _Game_Map_scrollRight = Game_Map.prototype.scrollRight;
Game_Map.prototype.scrollRight = function(distance) {
var forceCenterDisplayX = this._displayX + distance;
_Game_Map_scrollRight.apply(this, arguments);
if (this.isForceCenterHorizontal()) {
this._displayX = forceCenterDisplayX;
}
};
var _Game_Map_scrollUp = Game_Map.prototype.scrollUp;
Game_Map.prototype.scrollUp = function(distance) {
var forceCenterDisplayY = this._displayY - distance;
_Game_Map_scrollUp.apply(this, arguments);
if (this.isForceCenterVertical()) {
this._displayY = forceCenterDisplayY;
}
};
})();