/*=============================================================================
 OverpassTileVehicleAttach.js
----------------------------------------------------------------------------
 (C)2020 Triacontane
 This software is released under the MIT License.
 http://opensource.org/licenses/mit-license.php
----------------------------------------------------------------------------
 Version
 1.0.0 2020/03/08 初版
----------------------------------------------------------------------------
 [Blog]   : https://triacontane.blogspot.jp/
 [Twitter]: https://twitter.com/triacontane/
 [GitHub] : https://github.com/triacontane/
=============================================================================*/

/*:
 * @target MZ
 * @plugindesc Overpass Plugin Vehicle Consideration Attachment
 * @author triacontane
 * @base OverpassTile
 * @orderAfter OverpassTile
 * @url https://raw.githubusercontent.com/triacontane/RPGMakerMZ/master/js/plugins/OverpassTileAttachVehicle.js
 *
 * @help OverpassTileVehicleAttach.js
 * A vehicle consideration attachment for the official "OverpassTile.js" plugin.
 *
 * Small and large boats are only placed on the lower level, and planes are only placed on the top level.
 * Players will be unable to board vehicles from a different height.
 *
 * User Agreement:
 *  You may alter or redistribute the plugin without permission. There are no restrictions on usage format
 *  (such as adult-only use or commercial use).
 *  This plugin is now all yours.
 */

/*:ja
 * @target MZ
 * @plugindesc 立体交差プラグインの乗り物考慮アタッチメント
 * @author トリアコンタン
 * @base OverpassTile
 * @orderAfter OverpassTile
 * @url https://raw.githubusercontent.com/triacontane/RPGMakerMZ/master/js/plugins/OverpassTileAttachVehicle.js
 *
 * @help OverpassTileVehicleAttach.js
 * 公式プラグイン「OverpassTile.js」の乗り物考慮アタッチメントです。
 *
 * 小型船、大型船は下層のみ、飛行船は上層のみに配置され
 * 高さが異なる状態からの乗船ができなくなります。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */

(() => {
    'use strict';

    /**
     * Game_Vehicle
     */
    Game_Vehicle.prototype.updateOverPath = function() {
        Game_Character.prototype.updateOverPath.call(this);
        this._higher = this.isAirship();
    };

    const _Game_Vehicle_pos = Game_Vehicle.prototype.pos;
    Game_Vehicle.prototype.pos = function(x, y) {
        const result = _Game_Vehicle_pos.apply(this, arguments);
        if (!this.isSameHigher($gamePlayer)) {
            return false;
        }
        return result;
    };

    const _Game_Vehicle_isLandOk = Game_Vehicle.prototype.isLandOk;
    Game_Vehicle.prototype.isLandOk = function(x, y, d) {
        const advancedX = $gameMap.roundXWithDirection(x, d);
        const advancedY = $gameMap.roundYWithDirection(y, d);
        if (!this.isAirship() && this.isOnOverPath() &&
            $gameMap.isGatewayOverPath(advancedX, advancedY)) {
            return false;
        }
        return _Game_Vehicle_isLandOk.apply(this, arguments);
    };

    const _Game_Vehicle_getOff = Game_Vehicle.prototype.getOff;
    Game_Vehicle.prototype.getOff = function() {
        _Game_Vehicle_getOff.apply(this, arguments);
        if (this.isAirship()) {
            $gamePlayer.updateOverPathOnLocate();
            $gamePlayer.followers().updateOverPathOnLocate();
        }
    };

    Game_Vehicle.prototype.isHigherPriority = function() {
        return this.isAirship() ? this.isOnOverPath() : Game_Character.prototype.isHigherPriority.call(this);
    };
})();
