//============================================================================= // NRP_PicturePriority.js //============================================================================= /*: * @target MV MZ * @plugindesc v1.021 Change the display priority for each picture. * @author Takeshi Sunagawa (http://newrpg.seesaa.net/) * @url http://newrpg.seesaa.net/article/485015972.html * * @help You can change the Z coordinate (display priority) * for each picture. * * ◆Features * - Change the Z-coordinate of the picture * for each number by plugin command * - It is possible to change the Z-coordinate of multiple pictures * at the same time. * - Can be used together with * PicturePriorityCustomize.js (by Triacontane) * * ------------------------------------------------------------------- * [Plugin Command MZ] * ------------------------------------------------------------------- * ◆SetZ * All you have to do is specify the picture number and Z-coordinate. * However, it must be after the picture is displayed. * * You can also specify multiple picture numbers or use a formula. * * - Example1: 1,2,3 * - Example2: 1~3 * - Example3: $gameVariables.value(1) * * If you want to cancel the setting, leave the Z-coordinate blank, * or do "Erase Picture" from the event command. * * ------------------------------------------------------------------- * [Plugin Command MV] * ------------------------------------------------------------------- * Since the functions are the same as the MZ version, * the explanation is omitted. * Does not distinguish between individual capital letters. * Also, do not include []. * * ◆SetZ * NRP.PicturePriority.SetZ [Picture No] [Z-coordinate] * * - Example1: NRP.PicturePriority.SetZ 1~5 3 * Change the Z-coordinate of pictures 1 to 5 to 3 * * - Example2: NRP.PicturePriority.SetZ 1,2,3 * Release the Z-coordinates of the pictures numbered 1 to 3. * * ------------------------------------------------------------------- * [Reference] * ------------------------------------------------------------------- * The meaning of the Z-coordinate is as follows. * * 0 : Lower tiles * 1 : Lower characters * 3 : Normal characters * 4 : Upper tiles * 5 : Upper characters * 6 : Airship shadow * 7 : Balloon * 8 : Animation * 9 : Touch Operation Destination * * For example, if you want to display between "Lower tiles" * and "Lower characters", you can set a value such as "z = 0.5". * Z-coordinates can also be specified as a decimal number. * * ------------------------------------------------------------------- * [Terms] * ------------------------------------------------------------------- * There are no restrictions. * Modification, redistribution freedom, commercial availability, * and rights indication are also optional. * The author is not responsible, * but will deal with defects to the extent possible. * * @------------------------------------------------------------------ * @ Plugin Commands * @------------------------------------------------------------------ * * @command SetZ * @desc Set the display priority (Z-coordinate) of the picture. * Leave the Z-coordinate blank to cancel. * * @arg PictureId * @desc The picture number to target. Multiple & formula are allowed. * eg1: 1,2,3 eg2: 1~3 * * @arg Z * @desc Priority. 0:Lower tile, 1:Lower character, 3:Normal character, * 4:Upper tile, 5:Upper character, 7:Balloon, 8:Animation * @type number @min -99999 @max 99999 @decimals 2 * * @------------------------------------------------------------------ * @ Plugin Parameters * @------------------------------------------------------------------ * * @param DefaultZ * @type number @min -99999 @max 99999 @decimals 2 * @desc The display priority initially set for the picture. * If blank, the standard Maker behavior is followed. * * @param ReleaseOnTransfer * @type boolean * @default false * @desc Removes the Z coordinate setting for pictures during player transfer. */ /*:ja * @target MV MZ * @plugindesc v1.021 ピクチャ毎に表示優先度を変更します。 * @author 砂川赳(http://newrpg.seesaa.net/) * @url http://newrpg.seesaa.net/article/485015972.html * * @help ピクチャ毎にZ座標(表示優先度)を変更できます。 * * ◆特徴 * ・プラグインコマンドによって、番号毎にピクチャのZ座標を変更 * ・複数のピクチャのZ座標を同時に変更することも可能 * ・PicturePriorityCustomize.js(トリアコンタン様)との併用も可 * * ------------------------------------------------------------------- * ■プラグインコマンド(MZ) * ------------------------------------------------------------------- * ◆Z座標を設定 * ピクチャ番号とZ座標を指定すればOKです。 * ただし、ピクチャの表示後である必要があります。 * * また、ピクチャ番号には複数指定や数式の使用も可能です。 * * ・例1:1,2,3 * ・例2:1~3 * ・例3:$gameVariables.value(1) * * 設定を解除したい場合はZ座標を空欄にするか、 * イベントコマンドから『ピクチャの消去』をしてください。 * * ------------------------------------------------------------------- * ■プラグインコマンド(MV) * ------------------------------------------------------------------- * 機能はMZ版と同じため、説明は割愛します。 * ※大文字個別は区別しません。また[]は含まないでください。 * * ◆Z座標を設定 * NRP.PicturePriority.SetZ [ピクチャ番号] [Z座標] * * 例1:NRP.PicturePriority.SetZ 1~5 3 * 1~5番のピクチャのZ座標を3に変更 * * 例2:NRP.PicturePriority.SetZ 1,2,3 * 1~3番のピクチャのZ座標を解除 * * ------------------------------------------------------------------- * ■参考 * ------------------------------------------------------------------- * Z座標の意味は以下の通りです。 * * 0 : 下層タイル * 1 : 通常キャラの下 * 3 : 通常キャラ * 4 : 上層タイル * 5 : 通常キャラの上 * 6 : 飛行船の影 * 7 : 吹き出し * 8 : アニメーション * 9 : タッチ操作の移動先 * * 例えば『下層タイル』と『通常キャラの下』の間に表示をしたい場合は * 『z = 0.5』などの値を設定できます。 * ※Z座標は小数も指定可能です。 * * ------------------------------------------------------------------- * ■注意点 * ------------------------------------------------------------------- * ◆戦闘時の使用について * 初期状態では、戦闘中のピクチャーに * Z座標を設定しても表示優先度は変化しません。 * NRP_DynamicMotionMZ.jsなど表示優先度の制御を行うプラグインと * 組み合わせる必要があります。 * * ◆Z座標の解除について * なお、Z座標を一度指定すると解除するまで * 設定が継続することに注意してください。 * ※ピクチャの拡大率や不透明度を0にした場合でも、 *  ピクチャは内部的には存在し続けます。 * * プラグインパラメータの『移動時にZ座標を解除』が * オンの場合のみ場所移動時に自動で解除されます。 * * ------------------------------------------------------------------- * ■利用規約 * ------------------------------------------------------------------- * 特に制約はありません。 * 改変、再配布自由、商用可、権利表示も任意です。 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。 * * ただし、当プラグインではPicturePriorityCustomize.jsより * 一部の処理を流用しています。 * その部分については、MITライセンスに従います。 * * @------------------------------------------------------------------ * @ プラグインコマンド * @------------------------------------------------------------------ * * @command SetZ * @text Z座標を設定 * @desc ピクチャの表示優先度(Z座標)を設定します。 * Z座標を空欄にすると解除します。 * * @arg PictureId * @text ピクチャ番号 * @desc 対象とするピクチャ番号です。複数指定&数式可 * 例1:1,2,3 例2:1~3 * * @arg Z * @text Z座標 * @desc 表示優先度。0:下層, 1:キャラ下, 3:キャラ, 4:上層 * 5:キャラ上, 6:飛行船影, 7:フキダシ, 8:アニメ, 9:目的地 * @type number @min -99999 @max 99999 @decimals 2 * * @------------------------------------------------------------------ * @ プラグインパラメータ * @------------------------------------------------------------------ * * @param DefaultZ * @text 初期Z座標 * @type number @min -99999 @max 99999 @decimals 2 * @desc ピクチャに初期設定する表示優先度です。 * 空白の場合はツクールの標準動作に従います。 * * @param ReleaseOnTransfer * @text 移動時にZ座標を解除 * @type boolean * @default false * @desc 場所移動時、ピクチャに対するZ座標の設定を解除します。 */ (function() { "use strict"; function toBoolean(str, def) { if (str === true || str === "true") { return true; } else if (str === false || str === "false") { return false; } return def; } function toNumber(str, def) { if (str == undefined || str == "") { return def; } return isNaN(str) ? def : +(str || def); } const PLUGIN_NAME = "NRP_PicturePriority"; const parameters = PluginManager.parameters(PLUGIN_NAME); const pDefaultZ = toNumber(parameters["DefaultZ"]); const pReleaseOnTransfer = toBoolean(parameters["ReleaseOnTransfer"], false); // ---------------------------------------------------------------------------- // PicturePriorityCustomize.jsとの併用対策 // ---------------------------------------------------------------------------- const hasPicturePriorityCustomize = PluginManager._scripts.some(scriptName => scriptName == "PicturePriorityCustomize"); const PLUGIN_NAME_PPC = "PicturePriorityCustomize"; // ============================================================================ // (C) 2017 Triacontane // This software is released under the MIT License. // http://opensource.org/licenses/mit-license.php // ---------------------------------------------------------------------------- // // ↓↓↓↓↓PicturePriorityCustomizeの流用部分↓↓↓↓↓ // ============================================================================ const getParamString = function(paramNames) { if (!Array.isArray(paramNames)) paramNames = [paramNames]; for (let i = 0; i < paramNames.length; i++) { const name = PluginManager.parameters(PLUGIN_NAME_PPC)[paramNames[i]]; if (name) return name; } return ''; }; const getParamNumber = function(paramNames, min, max) { const value = getParamString(paramNames); if (arguments.length < 2) min = -Infinity; if (arguments.length < 3) max = Infinity; return (parseInt(value) || 0).clamp(min, max); }; const ppcParam = {}; ppcParam.upperPictureId = getParamNumber(['UpperPictureId', '上層ピクチャ番号']); ppcParam.lowerPictureId = getParamNumber(['LowerPictureId', '下層ピクチャ番号']); ppcParam.lowerPictureZ = getParamNumber(['LowerPictureZ', '下層ピクチャZ座標']); ppcParam.lowerPictureBattleZ = getParamNumber(['LowerPictureBattleZ', '戦闘下層ピクチャZ座標'], 0); // ---------------------------------------------------------------------------- // ↑↑↑↑↑流用終わり↑↑↑↑↑ // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- // プラグインコマンド(MZ) // ---------------------------------------------------------------------------- // MVには存在しないため、空で定義しておかないとエラーになる。 if (!PluginManager.registerCommand) { PluginManager.registerCommand = function() {} } /** * ●ピクチャのZ座標変更 */ PluginManager.registerCommand(PLUGIN_NAME, "SetZ", function(args) { // 引数を分解して配列に変換 const pictureIds = textToArray(args.PictureId); const z = eval(args.Z); const spriteset = getSpriteset(); // 各ピクチャにZ座標を設定 for (const pictureId of pictureIds) { const picture = spriteset.getPictureFromId(pictureId); picture.setZ(z); } }); // ---------------------------------------------------------------------------- // プラグインコマンド(MV) // ---------------------------------------------------------------------------- const _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function(command, args) { _Game_Interpreter_pluginCommand.call(this, command, args); // 小文字化してから判定 const lowerCommand = command.toLowerCase(); /** * ●ピクチャのZ座標変更 */ if (lowerCommand === "nrp.picturepriority.setz") { // 引数を分解して配列に変換 const pictureIds = textToArray(args[0]); const z = eval(args[1]); const spriteset = getSpriteset(); // 各ピクチャにZ座標を設定 for (const pictureId of pictureIds) { const picture = spriteset.getPictureFromId(pictureId); picture.setZ(z); } } }; // ---------------------------------------------------------------------------- // Spriteset_Base // ---------------------------------------------------------------------------- /** * ●ピクチャの作成 */ const _Spriteset_Base_createPictures = Spriteset_Base.prototype.createPictures; Spriteset_Base.prototype.createPictures = function() { _Spriteset_Base_createPictures.apply(this, arguments); // ピクチャスプライト管理用の配列 this._pictures = []; for (const picture of this._pictureContainer.children) { this._pictures.push(picture); } // もう1回ループ // ※ちなみに↑のループ内でまとめてやろうとすると、 //  Container自体を書き換えた結果、処理が飛んでしまうのでNG for (const picture of this._pictures) { // Z座標が設定されているなら、Z座標ソートの対象へ if (picture.z != null) { picture.releaseContainer(this); } } }; /** * 【独自】IDを指定してピクチャを取得 */ Spriteset_Base.prototype.getPictureFromId = function(pictureId) { return this._pictures.find(p => p._pictureId == pictureId); } // ---------------------------------------------------------------------------- // Game_Picture // ---------------------------------------------------------------------------- /** * 【独自】Z座標を取得 */ Game_Picture.prototype.z = function() { return this._z; }; /** * 【独自】Z座標を指定する。 */ Game_Picture.prototype.setZ = function(z) { this._z = z; } // ---------------------------------------------------------------------------- // Sprite_Picture // ---------------------------------------------------------------------------- /** * ●Game_Pictureの座標をSpriteに反映 */ const _Sprite_Picture_updatePosition = Sprite_Picture.prototype.updatePosition; Sprite_Picture.prototype.updatePosition = function() { _Sprite_Picture_updatePosition.apply(this, arguments); // Z座標を反映 const picture = this.picture(); this.z = picture.z(); }; /** * 【独自】Z座標を指定し、さらにピクチャの親を移行する。 */ Sprite_Picture.prototype.setZ = function(z) { const picture = this.picture(); if (!picture) { return; } // Game_Screen側へ反映 picture.setZ(z); const spriteset = getSpriteset(); // Z座標が削除された場合 if (z == null) { // ピクチャの親を元に戻す。 this.restoreContainer(spriteset); return; } // Z座標ソートの対象へ this.releaseContainer(spriteset); } /** * 【独自】ピクチャの親を移行し、Z座標ソートの対象とする。 */ Sprite_Picture.prototype.releaseContainer = function(spriteset) { // ピクチャを現在の親から切り離す。 // ※デフォルトの親(コンテナ)はひとまとめになっているため、 //  そのままではピクチャ毎のZソートができない。 this.parent.removeChild(this); // 新しい親に追加する。 getPictureParent(spriteset).addChild(this); } /** * 【独自】当プラグインによる管理を解除し、ピクチャを元の親へ戻す。 */ Sprite_Picture.prototype.restoreContainer = function(spriteset) { // Z座標をクリア this.z = null; let container; // PicturePriorityCustomize.jsと併用時 if (hasPicturePriorityCustomize) { const pictureId = this.getPictureId(); // PicturePriorityCustomize.js側の設定に従って、各コンテナを取得 if (pictureId <= ppcParam.lowerPictureId) { container = spriteset._pictureContainerLower; } else if (pictureId >= ppcParam.upperPictureId) { container = spriteset._pictureContainerUpper; } else { container = spriteset._pictureContainerMiddle; } // 標準時 } else if (spriteset._pictureContainer) { // 元のコンテナを取得 container = spriteset._pictureContainer; } // コンテナに戻す container.addChild(this); // コンテナ内のピクチャを番号でソート container.children.sort((a, b) => a._pictureId - b._pictureId); } // ---------------------------------------------------------------------------- // Game_Screen // ---------------------------------------------------------------------------- /** * ●ピクチャの表示 */ const _Game_Screen_showPicture = Game_Screen.prototype.showPicture; Game_Screen.prototype.showPicture = function( pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode ) { _Game_Screen_showPicture.apply(this, arguments); // 表示したピクチャを再取得 const realPictureId = this.realPictureId(pictureId); const gamePicture = this._pictures[realPictureId]; // Z座標の初期値がある場合は設定 if (pDefaultZ) { gamePicture.setZ(pDefaultZ); // Sprite_Pictureを取得 const spriteset = getSpriteset(); // Sprite_PictureにZ座標を設定 const spritePicture = spriteset.getPictureFromId(pictureId); if (spritePicture) { spritePicture.setZ(pDefaultZ); } } }; /** * ●ピクチャの消去 */ const _Game_Screen_erasePicture = Game_Screen.prototype.erasePicture; Game_Screen.prototype.erasePicture = function(pictureId) { _Game_Screen_erasePicture.apply(this, arguments); const spriteset = getSpriteset(); const picture = spriteset.getPictureFromId(pictureId); // ピクチャがZ座標管理の対象だった場合 if (picture && picture.z != null) { // ピクチャの親を元に戻す。 picture.restoreContainer(spriteset); } }; // ---------------------------------------------------------------------------- // Game_Player // ---------------------------------------------------------------------------- /** * ●場所移動時 */ const _Game_Player_performTransfer = Game_Player.prototype.performTransfer; Game_Player.prototype.performTransfer = function() { // Z座標を解除 if (this.isTransferring() && pReleaseOnTransfer) { for (let i = 0; i < $gameScreen._pictures.length; i++) { const picture = $gameScreen._pictures[i]; if (picture) { picture.setZ(pDefaultZ); } } } _Game_Player_performTransfer.apply(this, arguments); }; // ---------------------------------------------------------------------------- // 共通関数 // ---------------------------------------------------------------------------- /** * ●文字列を分解して配列に変換する。 * ※例1:"1,2,3" -> [1,2,3] * ※例2:"1~3" -> [1,2,3] */ function textToArray(textArr) { const array = []; // 無効なら処理しない。 if (textArr === undefined || textArr === null || textArr === "") { return array; } // カンマ区切りでループ for (let text of textArr.split(",")) { // 空白除去 text = text.trim(); // 1~5というように範囲指定の場合 // ※~が存在する。 if (text.indexOf("~") >= 0) { const rangeVal = text.split("~"); const rangeStart = eval(rangeVal[0]); const rangeEnd = eval(rangeVal[1]); // IDの指定範囲で実行 // 開始のほうが終了より大きい場合は反対に実行 if (rangeEnd < rangeStart) { for (let i = rangeStart; i >= rangeEnd; i--) { array.push(eval(i)); } } else { for (let i = rangeStart; i <= rangeEnd; i++) { array.push(eval(i)); } } // 通常時 } else { array.push(eval(text)); } } return array; } /** * ●現在の画面のSpritesetを取得する。 */ function getSpriteset() { // 戦闘 if ($gameParty.inBattle()) { return BattleManager._spriteset; // マップ } else { return SceneManager._scene._spriteset; } } /** * ●現在の画面でピクチャの親とする要素を取得する。 */ function getPictureParent(spriteset) { // 戦闘 // ※$gameParty.inBattle()がセットされるより //  早く呼び出されることがあるので、こちらで判定を行う。 if (spriteset._battleField) { return spriteset._battleField; // マップ } else { return spriteset._tilemap; } } })();