//=========================================================================== // MPI_MapPicture.js //=========================================================================== /*: * @plugindesc マップ座標基準でピクチャを表示します。 * @author 奏ねこま(おとぶき ねこま) * * @param 重なり判定-A * @desc 重なり判定-Aを有効にする場合は true を、無効にする場合は false を指定してください。 * @default true * * @param 重なり判定-B * @desc 重なり判定-Bを有効にする場合は true を、無効にする場合は false を指定してください。 * @default true * * @param 重なり判定-C * @desc 重なり判定-Cを有効にする場合は true を、無効にする場合は false を指定してください。 * @default true * * @param 判定周期 * @desc 重なり判定を何フレーム毎に行うかを指定してください。 * @default 4 * * @param 不透明度 * @desc プレイヤーと重なったときの不透明度を指定してください。[0-255] * @default 64 * * @param 変化量 * @desc 半透明になる際の不透明度の変化量を指定してください。値が大きいほど早く半透明になります。 * @default 16 * * @help * [ 概要 ] ... * ピクチャを画面座標ではなくマップ座標基準で表示します。 * * [ 使い方 ] ... * イベントコマンド「ピクチャの表示...」を実行する直前に、プラグインコマンドを * 実行してください。 * * [ プラグインコマンド ] ... * MAP_PICTURE_S * 「ピクチャの表示」で指定した座標をマップ座標として表示します。 * * MAP_PICTURE_SM * 「ピクチャの表示」で指定した座標をマップ座標として表示します。 * また、プレイヤーがピクチャに重なった場合、ピクチャを半透明にします。 * * MAP_PICTURE_E * 「ピクチャの表示」を実行したイベントの座標にピクチャを表示します。 * 「ピクチャの表示」で指定した座標は無視されます。 * * MAP_PICTURE_EM * 「ピクチャの表示」を実行したイベントの座標にピクチャを表示します。 * 「ピクチャの表示」で指定した座標は無視されます。 * また、プレイヤーがピクチャに重なった場合、ピクチャを半透明にします。 * * [ 重なり判定 ] ... * 重なり判定ーA:プレイヤー画像の四隅の座標を判定します。 * 重なり判定ーB:プレイヤー画像の上下左右の座標を判定します。 * 重なり判定ーC:プレイヤー画像の中心の座標を判定します。 * * ■重なり判定ーA ■重なり判定-B ■重なり判定-C * ●○○○○○● ○○○●○○○ ○○○○○○○ * ○○○○○○○ ○○○○○○○ ○○○○○○○ * ○○○○○○○ ●○○○○○● ○○○●○○○ * ○○○○○○○ ○○○○○○○ ○○○○○○○ * ●○○○○○● ○○○●○○○ ○○○○○○○ * * [ 利用規約 ] ................................................................ * ・本プラグインの利用は、RPGツクールMV/RPGMakerMVの正規ユーザーに限られます。 * ・商用、非商用、有償、無償、一般向け、成人向けを問わず、利用可能です。 * ・利用の際、連絡や報告は必要ありません。また、製作者名の記載等も不要です。 * ・プラグインを導入した作品に同梱する形以外での再配布、転載はご遠慮ください。 * ・不具合対応以外のサポートやリクエストは、基本的に受け付けておりません。 * ・本プラグインにより生じたいかなる問題についても、一切の責任を負いかねます。 * [ 改訂履歴 ] ................................................................ * Version 1.03 2019/02/26 $gameScreen.showPictureを直接実行した場合でも * プラグインの効果が適用されるように修正しました。 * Version 1.02 2018/10/17 ゲームデータ更新後にセーブデータをロードすると * セーブ時に表示していたピクチャが消える問題を修正。 * Version 1.01 2017/01/29 マップの編集内容次第では、データロード時にエラー * になる可能性がある問題を修正。 * マップ座標基準で表示しているピクチャは、マップ移 * 動時に消去するように仕様を変更。 * Version 1.00 2017/01/20 First edition. * -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- * Web Site: http://makonet.sakura.ne.jp/rpg_tkool/ * Twitter : https://twitter.com/koma_neko * Copylight (c) 2018 Nekoma Otobuki */ var Imported = Imported || {}; Imported.MPI_MapPicture = true; var Makonet = Makonet || {}; Makonet.MPP = {}; (function () { "use strict"; var MPD = Makonet.MPP; MPD.product = "MPI_MapPicture"; MPD.parameters = PluginManager.parameters(MPD.product); MPD.check1 = MPD.parameters["重なり判定-A"].trim().toLowerCase() === "true"; MPD.check2 = MPD.parameters["重なり判定-B"].trim().toLowerCase() === "true"; MPD.check3 = MPD.parameters["重なり判定-C"].trim().toLowerCase() === "true"; MPD.cycle = +MPD.parameters["判定周期"]; MPD.opacity = +MPD.parameters["不透明度"]; MPD.step = +MPD.parameters["変化量"]; var _ = MPD.product; //============================================================================== // Game_System //============================================================================== Object.defineProperty(Game_System.prototype, _, { get: function () { return (this[`$${_}`] = this[`$${_}`] || { coordinate_type: "", modesty: false, event_id: 0, }); }, set: function (value) { this[`$${_}`] = value; }, configurable: true, }); //============================================================================== // Game_Picture //============================================================================== Object.defineProperty(Game_Picture.prototype, _, { get: function () { return (this[`$${_}`] = this[`$${_}`] || { coordinate_type: "", modesty: false, event_id: 0, }); }, set: function (value) { this[`$${_}`] = value; }, configurable: true, }); //============================================================================== // Game_Map //============================================================================== (function (o, p) { var f = o[p]; o[p] = function (mapId) { if (mapId !== this.mapId()) { $gameScreen._pictures.forEach(function (picture, index) { if (picture && picture[_].coordinate_type !== "") { $gameScreen._pictures[index] = null; } }); } f.apply(this, arguments); }; })(Game_Map.prototype, "setup"); //============================================================================== // Game_Screen //============================================================================== { let __showPicture = Game_Screen.prototype.showPicture; Game_Screen.prototype.showPicture = function ( pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode ) { __showPicture.apply(this, arguments); var picture = this.picture(pictureId); picture[_].coordinate_type = $gameSystem[_].coordinate_type; picture[_].modesty = $gameSystem[_].modesty; picture[_].event_id = $gameSystem[_].event_id; $gameSystem[_] = { coordinate_type: "", modesty: false, event_id: 0 }; }; } //============================================================================== // Game_Interpreter //============================================================================== (function (o, p) { var f = o[p]; o[p] = function (command, args) { f.apply(this, arguments); switch (command.toUpperCase()) { case "MAP_PICTURE_SM": $gameSystem[_].modesty = true; case "MAP_PICTURE_S": $gameSystem[_].coordinate_type = "standard"; $gameSystem[_].event_id = this._eventId; break; case "MAP_PICTURE_EM": $gameSystem[_].modesty = true; case "MAP_PICTURE_E": $gameSystem[_].coordinate_type = "event"; $gameSystem[_].event_id = this._eventId; break; } }; })(Game_Interpreter.prototype, "pluginCommand"); //============================================================================== // Sprite_Picture //============================================================================== (function (o, p) { var f = o[p]; o[p] = function () { f.apply(this, arguments); var picture = this.picture(); if (picture[_].coordinate_type) { switch (picture[_].coordinate_type) { case "standard": this.x = Math.floor( (picture.x() - $gameMap._displayX) * $gameMap.tileWidth() ); this.y = Math.floor( (picture.y() - $gameMap._displayY) * $gameMap.tileHeight() ); break; case "event": var event = $gameMap.event(picture[_].event_id); if (event && event.event()) { this.x = Math.floor( (event._realX - $gameMap._displayX) * $gameMap.tileWidth() ); this.y = Math.floor( (event._realY - $gameMap._displayY) * $gameMap.tileHeight() ); } else { picture[_] = { coordinate_type: "", modesty: false, event_id: 0 }; } break; } } }; })(Sprite_Picture.prototype, "updatePosition"); //============================================================================== // Game_Player //============================================================================== Object.defineProperty(Game_Player.prototype, _, { get: function () { return (this[`$${_}`] = this[`$${_}`] || { left: 0, top: 0, right: 0, bottom: 0, }); }, set: function (value) { this[`$${_}`] = value; }, configurable: true, }); //============================================================================== // Sprite_Character //============================================================================== (function (o, p) { var f = o[p]; o[p] = function () { f.apply(this, arguments); if (this._character === $gamePlayer) { var gp = $gamePlayer[_]; gp.left = parseInt(this.x - this.anchor.x * this.patternWidth()); gp.top = parseInt(this.y - this.anchor.y * this.patternHeight()); gp.right = gp.left + this.patternWidth(); gp.bottom = gp.top + this.patternHeight(); } }; })(Sprite_Character.prototype, "updateCharacterFrame"); //============================================================================== // Sprite_Picture //============================================================================== Object.defineProperty(Sprite_Picture.prototype, _, { get: function () { return (this[`$${_}`] = this[`$${_}`] || { opacity: 255, overlap: false, }); }, set: function (value) { this[`$${_}`] = value; }, configurable: true, }); (function (o, p) { var f = o[p]; o[p] = function () { f.apply(this, arguments); var this_ = this[_]; if (this.picture()[_].modesty && !!this.bitmap) { if (Graphics.frameCount % MPD.cycle === 0) { var pl = parseInt(this.x - this.anchor.x * this._realFrame.width); var pt = parseInt(this.y - this.anchor.y * this._realFrame.height); var pr = pl + this._realFrame.width; var pb = pt + this._realFrame.height; var gp = $gamePlayer[_]; var bl = gp.left === gp.left.clamp(pl, pr); var bt = gp.top === gp.top.clamp(pt, pb); var br = gp.right === gp.right.clamp(pl, pr); var bb = gp.bottom === gp.bottom.clamp(pt, pb); this_.overlap = false; if ((bl && bt) || (bl && bb) || (br && bt) || (br && bb)) { var cl = gp.left - pl; var ct = gp.top - pt; var cr = gp.right - pl; var cb = gp.bottom - pt; var cx = parseInt((cl + cr) / 2); var cy = parseInt((ct + cb) / 2); if ( (MPD.check1 && (this.bitmap.getAlphaPixel(cl, ct) > 0 || this.bitmap.getAlphaPixel(cl, cb) > 0 || this.bitmap.getAlphaPixel(cr, ct) > 0 || this.bitmap.getAlphaPixel(cr, cb) > 0)) || (MPD.check2 && (this.bitmap.getAlphaPixel(cx, ct) > 0 || this.bitmap.getAlphaPixel(cx, cb) > 0 || this.bitmap.getAlphaPixel(cl, cy) > 0 || this.bitmap.getAlphaPixel(cr, cy) > 0)) || (MPD.check3 && this.bitmap.getAlphaPixel(cx, cy) > 0) ) { this_.overlap = true; } } } this_.opacity += MPD.step * (this_.overlap ? -1 : 1); this_.opacity = this_.opacity.clamp( MPD.opacity, this.picture().opacity() ); this.opacity = this_.opacity; } }; })(Sprite_Picture.prototype, "updateOther"); })();