/*: * @plugindesc Fixes an issue with large sprites appearing under ☆ passability tiles. * @author Neon Black - Version 1.0 * * @help Large Sprite ☆ Fix v1.0 * * V1.0 - 8.11.2015 * * This plugin was created to fix an issue similar to the fix applied in Ace * where large sprites would display under ☆ passability tiles when they should * appear above them. This plugin is for the most part non-intrusive but does * require a little bit of input from the user. * * By default, only the player is affected by this plugin. To apply this fix to * an event, add the tag to a comment box in the page of the * event you would like to appear above ☆ tiles properly. * * This work by Neon Black is licensed under a Creative Commons Attribution 4.0 * International License. To view a copy of this license, visit * http://creativecommons.org/licenses/by/4.0/. Permissions beyond the scope of * this license may be available at neonblack.moe/terms. * * @param Terrain ID * @desc This is the ID of the terrain to fix with ☆ tiles. Terrain ID is set in the database. * @default 7 * * @param Large Followers * @desc Enable this option to perform large sprite checking on followers. Disabled by default. * @default No * * @param Large Vehicles * @desc Enable this option to perform large sprite checking on vehicles. Enabled by default. * @default Yes */ /*:ja * @plugindesc すり抜け可能タイル(★タイル)の下側に * 大きなスプライトが出現する際の問題点を解決します。 * @author Neon Black - Version 1.0 * * @help Large Sprite ☆ Fix v1.0 * * V1.0 - 8.11.2015 * * このプラグインは、すり抜け可能タイル(★タイル)の上に表示されるべき * スプライトが、背面に表示されてしまうバグの修正を行います。 * ほとんどが自動的な修正となりますが、多少のカスタムが必要となります。 * * デフォルト状態では、このプラグインが有効になるのはプレイヤーに対してだけです。 * イベントに対してもこのプラグインを有効にしたい場合は、 * 対象のイベントのコメントボックス内にタグを挿入してください。 * これによって、★タイルの上にイベントを表示することができます。 * * ■ライセンスポリシー * This work by Neon Black is licensed under a Creative Commons Attribution 4.0 * International License. To view a copy of this license, visit * http://creativecommons.org/licenses/by/4.0/. Permissions beyond the scope of * this license may be available at neonblack.moe/terms. * * @param Terrain ID * @desc ★タイルによって固定される地形IDです。 * @default 7 * * @param Large Followers * @desc YESにすることで、フォロワーキャラクターにも適用されます。 * デフォルトではOFFになっています。 * @default No * * @param Large Vehicles * @desc YESにすることで、乗り物にも適用されます。 * デフォルトではONになっています。 * @default Yes */ //------ // The following lines are the actual core code of the plugin. While you are // certainly invited to look, modifying it may result in undesirable results. // Modify at your own risk! //------ //------ // Imported and namespace //------ var Imported = Imported || {}; Imported.CP_LargeSpriteFix = 1.0; var cpp = cpp || {}; cpp.yyt = ["yes", "y", "true"]; cpp.lsdf = cpp.lsdf || {}; cpp.lsdf.params = PluginManager.parameters("CP_Large_Sprite_Fix"); cpp.lsdf.terrain = cpp.lsdf.params["Terrain ID"]; cpp.lsdf.followers = cpp.yyt.indexOf(cpp.lsdf.params["Large Followers"].toLowerCase()) >= 0; cpp.lsdf.vehicles = cpp.yyt.indexOf(cpp.lsdf.params["Large Vehicles"].toLowerCase()) >= 0; //------ // Alias functions //------ var aliasUpdateBitmap081115a = Sprite_Character.prototype.updateBitmap; var aliasUpdatePosition081115a = Sprite_Character.prototype.updatePosition; var aliasSetupPage081115a = Game_Event.prototype.setupPage; //------ // Destructive functions list /* */ //------ // Sprite_Character //------ Sprite_Character.prototype.setUpperAreaSprite = false; Sprite_Character.prototype.forceGfxChange = false; Sprite_Character.prototype.oldBitmap = null; Sprite_Character.prototype.upperAreaSprite = null; // Checks if the sprite has been changed. Sprite_Character.prototype.updateBitmap = function () { if (this.isImageChanged() && this.setUpperAreaSprite) this.forceGfxChange = true; else this.forceGfxChange = false; aliasUpdateBitmap081115a.apply(this, arguments); }; Sprite_Character.prototype.updatePosition = function () { aliasUpdatePosition081115a.apply(this, arguments); if (this.spriteIsOnscreen()) this.checkEncompassedArea(); }; // 5 would be highest priority level for characters Sprite_Character.prototype.spriteIsOnscreen = function () { if (this._character.largeSprite() && this._character.screenZ() < 5) { var rectArray = this.getEdgeRect(); if ( rectArray[0] < Graphics._width && rectArray[1] < Graphics._height && rectArray[2] > 0 && rectArray[3] > 0 ) return true; } return false; }; Sprite_Character.prototype.getEdgeRect = function () { var x = this.x - Math.round(this._frame.width * this.anchor.x); var y = this.y - Math.round(this._frame.height * this.anchor.y); var w = x + this._frame.width; var h = y + this._frame.height; return [x, y, w, h]; }; Sprite_Character.prototype.checkEncompassedArea = function () { var tw = $gameMap.tileWidth(); var th = $gameMap.tileHeight(); if (this.setUpperAreaSprite && this.forceGfxChange) this.oldBitmap = this.bitmap; this.setUpperAreaSprite = false; var boxArray = this.getEdgeRect(); var lastX = null; var lastY = null; var copyR = 0; var mapXD = $gameMap.displayX() * $gameMap.tileWidth(); var mapYD = $gameMap.displayY() * $gameMap.tileHeight(); var totalH = this._frame.height + this._character.jumpHeight(); var _bx = [false, 0, 0, 0]; for (var x = 0; x < this._frame.width; x++) { var xp = Math.round(mapXD) + boxArray[0] + x; if (Math.floor(xp / tw) != lastX) { lastX = Math.floor(xp / tw); lastY = null; copyR = 0; for (var y = 0; y < totalH; y++) { var yp = Math.round(mapYD) + boxArray[3] + this._character.jumpHeight() - y; while (Math.floor(yp / th) == lastY) { y++; yp--; } lastY = Math.floor(yp / th); if ( lastY == Math.round( (this._character.screenY + this._character.jumpHeight() + mapYD) / th ) ) { if ($gameMap.terrainTag(lastX, lastY) == Number(cpp.lsdf.terrain)) break; continue; } if ($gameMap.terrainTag(lastX, lastY) != Number(cpp.lsdf.terrain)) continue; var copyR = Math.min(this._frame.height, Math.round(totalH - y + 1)); this.setUpperSprite(); break; } } _bx = this.upperSpriteCopy(x, copyR, _bx); } _bx = this.upperSpriteCopy(x, 0, _bx); if (!this.setUpperAreaSprite && this.upperAreaSprite) { this.parent.removeChild(this.upperAreaSprite); this.upperAreaSprite = null; this.cpResetBitmapFrame(); } }; Sprite_Character.prototype.upperSpriteCopy = function (x, copyR, _bx) { if (_bx[3] == copyR) { _bx[2]++; return _bx; } if ( _bx[0] && this.upperAreaSprite && _bx[3] > 0 && _bx[3] < this._frame.height ) { var rect = new Rectangle(); rect.x = this._frame.x + _bx[1]; rect.y = this._frame.y; rect.width = _bx[2]; rect.height = _bx[3]; this.upperAreaSprite.bitmap.blt( this.bitmap, rect.x, rect.y, rect.width, rect.height, _bx[1], 0, rect.width, rect.height ); this.bitmap.clearRect(rect.x, rect.y, rect.width, rect.height); } return [true, x, 1, copyR]; }; Sprite_Character.prototype.setUpperSprite = function () { if (this.setUpperAreaSprite) { return; } if (this.upperAreaSprite) { this.upperAreaSprite.visible = true; } else { this.upperAreaSprite = new Sprite(); this.parent.addChild(this.upperAreaSprite); this.oldBitmap = this.bitmap; } this.upperAreaSprite.bitmap = new Bitmap( this._frame.width, this._frame.height ); this.upperAreaSprite.x = this.x; this.upperAreaSprite.y = this.y; this.upperAreaSprite.anchor.x = this.anchor.x; this.upperAreaSprite.anchor.y = this.anchor.y; this.upperAreaSprite.opacity = this.opacity; this.upperAreaSprite.visible = this.visible; this.upperAreaSprite.z = 8; this.setUpperAreaSprite = true; var _oldFrame = new Rectangle(); _oldFrame.x = this._frame.x; _oldFrame.y = this._frame.y; _oldFrame.width = this._frame.width; _oldFrame.height = this._frame.height; this.bitmap = new Bitmap(this.oldBitmap.width, this.oldBitmap.height); this.bitmap.blt( this.oldBitmap, 0, 0, this.oldBitmap.width, this.oldBitmap.height, 0, 0, this.bitmap.width, this.bitmap.height ); this.setFrame(_oldFrame.x, _oldFrame.y, _oldFrame.width, _oldFrame.height); }; Sprite_Character.prototype.cpResetBitmapFrame = function () { var _oldFrame = new Rectangle(); _oldFrame.x = this._frame.x; _oldFrame.y = this._frame.y; _oldFrame.width = this._frame.width; _oldFrame.height = this._frame.height; this.bitmap = this.oldBitmap; this.setFrame(_oldFrame.x, _oldFrame.y, _oldFrame.width, _oldFrame.height); }; //------ // Game_CharacterBase //------ Game_CharacterBase.prototype.largeSprite = function () { return false; }; Game_Player.prototype.largeSprite = function () { return true; }; Game_Follower.prototype.largeSprite = function () { return cpp.lsdf.followers; }; Game_Vehicle.prototype.largeSprite = function () { return cpp.lsdf.vehicles; }; Game_Event.prototype.largeSprite = function () { return this._largeSprite; }; Game_Event.prototype.setupPage = function () { aliasSetupPage081115a.apply(this, arguments); this._largeSprite = false; if (this._pageIndex >= 0) { for (var i = 0; i < this.list().length; i++) { if ([108, 408].indexOf(this.list()[i]["code"]) >= 0) { var note = this.list()[i]["parameters"][0]; if (note.match(//i)) this._largeSprite = true; } } } }; //------ // End of plugin //------