unholy-maiden/js/plugins/MPP_HiddenPassage.js
2025-12-18 09:44:14 -06:00

290 lines
11 KiB
JavaScript
Raw 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.

//=============================================================================
// MPP_HiddenPassage.js
//=============================================================================
// Copyright (c) 2018 - 2022 Mokusei Penguin
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @target MV MZ
* @plugindesc Displays the tile with the specified region ID above the player.
* @author Mokusei Penguin
* @url
*
* @help [version 3.0.2]
* - This plugin is for RPG Maker MV and MZ.
* - Displays the tile with the specified region ID above the player.
*
* ▼ Plugin command
* - In MV, the variable N is referred to by writing v[N] in the item for
* inputting a numerical value.
* - In MZ, in the item to enter a numerical value, select the text and
* write v[N] to refer to the variable N.
*
* MV / MZ
*
* SetPlayerZ z / setPlayerZ
* z : Z coordinate
* - Set the Z coordinate of the player.
* - Of the region IDs set in the plug-in parameters,
* the regions below this number are displayed below the player.
* - Actually, we are not changing the Z coordinate of the character,
* we are just changing the method of determining whether to display
* it above the character.
* - Only the player can specify the Z coordinate.
*
* ▼ Plugin parameters
* Passable Region Ids / Impassable Region Ids
* - Tiles with the set region ID and higher than the player's Z coordinate are
* displayed above the character.
* - If it is displayed below the character, it will be a normal tile.
* - Range specification is available for these plug-in parameters.
* - You can specify a number from N to M by writing N-M.
* Example: 1-4,8,10 => 1 to 4 and 8 and 10
*
* ▼ Note
* - The upper part of the A4 (wall) of the tile set is passable due
* to the specifications on the Maker side.
* - When creating secret passages, it is recommended to make both sides accessible
* and impassable.
*
* ================================
* Mail : wood_penguinyahoo.co.jp ( is half-width)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command setPlayerZ
* @desc
* @arg z
* @desc
* @type number
* @min 0
* @max 255
* @default 0
*
*
* @param Passable Region Ids
* @desc An array of region IDs displayed above and passable.(Range can be specified)
* @default 32
*
* @param Impassable Region Ids
* @desc An array of region IDs that are displayed above and cannot be passed.(Range can be specified)
* @default 33
*
*/
/*:ja
* @target MV MZ
* @plugindesc 指定したリージョンIDのタイルをプレイヤーより上に表示させます。
* @author 木星ペンギン
* @url
*
* @help [version 3.0.2]
* - このプラグインはRPGツクールMVおよびMZ用です。
* - 指定したリージョンIDのタイルをプレイヤーより上に表示させます。
*
* ▼ プラグインコマンド
* - MVでは数値を入力する項目で v[N] と記述することで変数N番を参照します。
* - MZでは数値を入力する項目で、テキストを選択して v[N] と記述することで
* 変数N番を参照します。
*
* MV / MZ
*
* SetPlayerZ z / プレイヤーZ座標設定
* z : Z座標
* - プレイヤーのZ座標を設定します。
* - プラグインパラメータで設定したリージョンIDのうち、
* この数値以下のリージョンはプレイヤーより下に表示されます。
* - 実際にはキャラクターのZ座標を変更しているのではなく、
* キャラクターより上に表示させるかどうかの判定方法を変えているだけです。
* - Z座標を指定できるのはプレイヤーのみです。
*
* ▼ プラグインパラメータ
* 通行可能リージョン / 通行不可リージョン
* - 設定したリージョンIDで、かつプレイヤーのZ座標より高いタイルは、
* キャラクターより上に表示されます。
* - キャラクターより下に表示された場合は通常のタイルとなります。
* - これらのプラグインパラメータでは範囲指定が使用できます。
* - n-m と表記することで、nからmまでの数値を指定できます。
* 例: 1-4,8,10 => 1から4と8と10
*
* ▼ 注意点
* - ツクール側の仕様でタイルセットのA4(壁)は上部が通行可能となっています。
* - 隠し通路等を作る際は、通行可能にした両側面を通行不可にすることをお勧めします。
*
* ================================
* Mail : wood_penguinyahoo.co.jp (@は半角)
* Blog : http://woodpenguin.blog.fc2.com/
* License : MIT license
*
* @command setPlayerZ
* @text プレイヤーZ座標設定
* @desc
* @arg z
* @desc
* @type number
* @min 0
* @max 255
* @default 0
*
*
* @param Passable Region Ids
* @text 通行可能リージョン
* @desc 上に表示し通行可能なリージョンIDの配列
* (範囲指定可)
* @default 32
*
* @param Impassable Region Ids
* @text 通行不可リージョン
* @desc 上に表示し通行できないリージョンIDの配列
* (範囲指定可)
* @default 33
*
*/
(() => {
'use strict';
const pluginName = 'MPP_HiddenPassage';
const parameters = PluginManager.parameters(pluginName);
const convertToArray = (param) => {
return param.split(',').reduce((r, item) => {
const match = /(\d+)-(\d+)/.exec(item);
if (match) {
const start = Number(match[1]);
const end = Number(match[2]);
return r.concat([...Array(end + 1).keys()].slice(start));
} else {
return item ? r.concat(Number(item)) : r;
}
}, []);
};
const param_PassableRegionIds = convertToArray(parameters['Passable Region Ids']);
const param_ImpassableRegionIds = convertToArray(parameters['Impassable Region Ids']);
//-------------------------------------------------------------------------
// Tilemap
// MV
const _Tilemap__paintTiles = Tilemap.prototype._paintTiles;
Tilemap.prototype._paintTiles = function(startX, startY, x, y) {
const regionId = this._readMapData(startX + x, startY + y, 5);
this._forceHigher = $gamePlayer.isUpperRegion(regionId);
_Tilemap__paintTiles.apply(this, arguments);
};
//MZ
const _Tilemap__addSpot = Tilemap.prototype._addSpot;
Tilemap.prototype._addSpot = function(startX, startY, x, y) {
const regionId = this._readMapData(startX + x, startY + y, 5);
this._forceHigher = $gamePlayer.isUpperRegion(regionId);
_Tilemap__addSpot.apply(this, arguments);
};
const _Tilemap__isHigherTile = Tilemap.prototype._isHigherTile;
Tilemap.prototype._isHigherTile = function(tileId) {
return (
this._forceHigher ||
_Tilemap__isHigherTile.apply(this, arguments)
);
};
//-------------------------------------------------------------------------
// ShaderTilemap
if (Utils.RPGMAKER_NAME === 'MV') {
const _ShaderTilemap__paintTiles = ShaderTilemap.prototype._paintTiles;
ShaderTilemap.prototype._paintTiles = function(startX, startY, x, y) {
const regionId = this._readMapData(startX + x, startY + y, 5);
this._forceHigher = $gamePlayer.isUpperRegion(regionId);
_ShaderTilemap__paintTiles.apply(this, arguments);
};
}
//-------------------------------------------------------------------------
// Game_Map
const _Game_Map_checkPassage = Game_Map.prototype.checkPassage;
Game_Map.prototype.checkPassage = function(x, y, bit) {
const regionId = this.regionId(x, y);
if ($gamePlayer.isUpperRegion(regionId)) {
return param_PassableRegionIds.includes(regionId);
}
return _Game_Map_checkPassage.apply(this, arguments);
};
//-------------------------------------------------------------------------
// Game_Player
Game_Player.prototype.isUpperRegion = function(regionId) {
const z = this.mppHidPasZ || 0;
return z < regionId && (
param_PassableRegionIds.includes(regionId) ||
param_ImpassableRegionIds.includes(regionId)
);
};
//-------------------------------------------------------------------------
// Game_Interpreter
const _mzCommands = {
SetPlayerZ: { name:'setPlayerZ', keys:['z'] }
};
Object.assign(_mzCommands, {
'エフェクトタイプ変更': _mzCommands.SetPlayerZ
});
const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.apply(this, arguments);
const mzCommand = _mzCommands[command];
if (mzCommand) {
const args2 = Object.assign(
...mzCommand.keys.map((k, i) => ({[k]: args[i]}))
);
PluginManager.callCommandMV(this, pluginName, mzCommand.name, args2);
}
};
//-------------------------------------------------------------------------
// PluginManager
if (!PluginManager.registerCommand) {
PluginManager._commandsMV = PluginManager._commandsMV || {};
PluginManager.registerCommandMV = function(pluginName, commandName, func) {
const key = pluginName + ':' + commandName;
this._commandsMV[key] = func;
};
PluginManager.callCommandMV = function(self, pluginName, commandName, args) {
const key = pluginName + ':' + commandName;
const func = this._commandsMV[key];
if (typeof func === 'function') {
func.bind(self)(args);
}
};
}
{
const _registerCommand = PluginManager.registerCommand || PluginManager.registerCommandMV;
_registerCommand.call(PluginManager, pluginName, 'setPlayerZ', args => {
$gamePlayer.mppHidPasZ = PluginManager.mppValue(args.z);
if (!$gameParty.inBattle()) {
SceneManager._scene._spriteset._tilemap.refresh();
}
});
}
PluginManager.mppValue = function(value) {
const match = /^V\[(\d+)\]$/i.exec(value);
return match ? $gameVariables.value(+match[1]) : +value;
};
})();