//============================================================================= // VehiclePassable.js // ---------------------------------------------------------------------------- // Copyright (c) 2015 Triacontane // This software is released under the MIT License. // http://opensource.org/licenses/mit-license.php // ---------------------------------------------------------------------------- // Version // 1.2.0 2016/07/31 乗降可能な地形タグ、リージョンを設定できる機能を追加 // 1.1.0 2016/07/09 飛行船の通行不可、通行可能に対応 // 1.0.0 2016/06/17 初版 // ---------------------------------------------------------------------------- // [Blog] : http://triacontane.blogspot.jp/ // [Twitter]: https://twitter.com/triacontane/ // [GitHub] : https://github.com/triacontane/ //============================================================================= /*: @url https://triacontane.blogspot.com/ @plugindesc Vehicle Passage Detection Extension Plugin @author Triacontane @license MIT License @help English Help Translator: munokura This is an unofficial English translation of the plugin help, created to support global RPG Maker users. Feedback is welcome to improve translation quality (see: https://github.com/munokura/triacontane-MV-plugins ). Original plugin by Triacontane. Please check the latest official version at: https://triacontane.blogspot.com ----- This plugin extends vehicle passability. You can flexibly configure passability by setting region and terrain tags. Priority is region > terrain tag. You can also set terrain tags and regions where boarding and disembarking is permitted. For example, you can allow small and Ship to board and disembark only at piers, or allow Airship to take off and land only at specific landing sites. *In reality, this only checks when disembarking. This plugin does not have plugin commands. Terms of Use: You may modify and redistribute this plugin without permission from the author, and there are no restrictions on its use (commercial, 18+, etc.). This plugin is now yours. @param 小型船通行リージョン @text Boat Traffic Region @desc Regions that can be passed by Boat. Please specify them separated by commas (,). Example: "1,2,3" @default 1,2,3 @param 小型船通行地形タグ @text Small vessel traffic terrain tag @desc Terrain tags that allow Boat to pass through. Separate them with commas (,). Example: "1,2,3" @default 1,2,3 @param 小型船不可リージョン @text Regions where Boat are not permitted @desc Regions that are impassable to Boat. Separate them with commas (,). Example: "1,2,3" @default 4,5,6 @param 小型船不可地形タグ @text Boat unsuitable terrain tag @desc Terrain tags that are impassable to Boat. Please specify them separated by commas (,). Example: "1,2,3" @default 4,5,6 @param 小型船乗降地形タグ @text Boat embarkation and disembarkation terrain tag @desc This is a terrain tag that allows Boat to board and disembark. If left blank, you can board and disembark anywhere. @param 小型船乗降リージョン @text Boat embarkation region @desc The region where you can board and disembark by Boat. If left blank, you can board and disembark anywhere. @param 大型船通行リージョン @text Ship traffic region @desc Regions that Ship can pass through. Please specify them separated by commas (,). Example: "1,2,3" @default 1,2,3 @param 大型船通行地形タグ @text Ship traffic terrain tag @desc Terrain tags that allow Ship to pass through. Separate them with commas (,). Example: "1,2,3" @default 1,2,3 @param 大型船不可リージョン @text Regions where Ship are not permitted @desc Regions that are impassable to Ship. Separate them with commas (,). Example: "1,2,3" @default 4,5,6 @param 大型船不可地形タグ @text Terrain tag for Ship @desc Terrain tags that are impassable to Ship. Please specify them separated by commas (,). Example: "1,2,3" @default 4,5,6 @param 大型船乗降地形タグ @text Ship embarkation and disembarkation terrain tag @desc This is the terrain tag where you can board and disembark on Ship. If left blank, you can board and disembark anywhere. @param 大型船乗降リージョン @text Ship embarkation and disembarkation region @desc Region where Ship can board and disembark. If left blank, you can board and disembark anywhere. @param 飛行船不可リージョン @text Airship-free regions @desc Regions that are not passable by Airship. Separate them with commas (,). Example: "1,2,3" @default 4,5,6 @param 飛行船不可地形タグ @text Airship-prohibited terrain tag @desc Terrain tags that are impassable by Airship. Separate them with commas (,). Example: "1,2,3" @default 4,5,6 @param 飛行船乗降地形タグ @text Airship boarding and disembarking terrain tag @desc This is the terrain tag where you can board and disembark with the airship. If left blank, you can board and disembark anywhere. @param 飛行船乗降リージョン @text Airship embarkation region @desc The region where you can board and disembark by airship. If left blank, you can board and disembark anywhere. */ /*:ja @plugindesc 乗り物通行判定拡張プラグイン @author トリアコンタン @param 小型船通行リージョン @desc 小型船で通行可能になるリージョンです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 1,2,3 @param 小型船通行地形タグ @desc 小型船で通行可能になる地形タグです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 1,2,3 @param 小型船不可リージョン @desc 小型船で通行不可になるリージョンです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 小型船不可地形タグ @desc 小型船で通行不可になる地形タグです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 小型船乗降地形タグ @desc 小型船で乗降可能になる地形タグです。未入力にするとどこでも乗降可能になります。 @default @param 小型船乗降リージョン @desc 小型船で乗降可能になるリージョンです。未入力にするとどこでも乗降可能になります。 @default @param 大型船通行リージョン @desc 大型船で通行可能になるリージョンです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 1,2,3 @param 大型船通行地形タグ @desc 大型船で通行可能になる地形タグです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 1,2,3 @param 大型船不可リージョン @desc 大型船で通行不可になるリージョンです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 大型船不可地形タグ @desc 大型船で通行不可になる地形タグです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 大型船乗降地形タグ @desc 大型船で乗降可能になる地形タグです。未入力にするとどこでも乗降可能になります。 @default @param 大型船乗降リージョン @desc 大型船で乗降可能になるリージョンです。未入力にするとどこでも乗降可能になります。 @default @param 飛行船不可リージョン @desc 飛行船で通行不可になるリージョンです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 飛行船不可地形タグ @desc 飛行船で通行不可になる地形タグです。カンマ(,)区切りで指定してください。例「1,2,3」 @default 4,5,6 @param 飛行船乗降地形タグ @desc 飛行船で乗降可能になる地形タグです。未入力にするとどこでも乗降可能になります。 @default @param 飛行船乗降リージョン @desc 飛行船で乗降可能になるリージョンです。未入力にするとどこでも乗降可能になります。 @default @help 乗り物の通行判定を拡張します。 リージョンおよび地形タグを設定して柔軟な通行可能設定が可能です。 優先度はリージョン > 地形タグとなります。 また、乗降可能な地形タグおよびリージョンを設定することができます。 たとえば小型船や大型船で桟橋のみ乗降可能にしたり、特定の発着場のみ 飛行船の離着陸が可能にできます。 ※実際には降船時のみ判定しています。 このプラグインにはプラグインコマンドはありません。 利用規約: 作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等) についても制限はありません。 このプラグインはもうあなたのものです。 */ (function () { 'use strict'; var pluginName = 'VehiclePassable'; var getParamOther = function (paramNames) { if (!Array.isArray(paramNames)) paramNames = [paramNames]; for (var i = 0; i < paramNames.length; i++) { var name = PluginManager.parameters(pluginName)[paramNames[i]]; if (name) return name; } return null; }; var getParamString = function (paramNames) { var value = getParamOther(paramNames); return value === null ? '' : value; }; var getParamArrayString = function (paramNames) { var values = getParamString(paramNames).split(','); for (var i = 0; i < values.length; i++) values[i] = values[i].trim(); return values; }; var getParamArrayNumber = function (paramNames, min, max) { var values = getParamArrayString(paramNames); if (arguments.length < 2) min = -Infinity; if (arguments.length < 3) max = Infinity; for (var i = 0; i < values.length; i++) { if (!isNaN(parseInt(values[i], 10))) { values[i] = (parseInt(values[i], 10) || 0).clamp(min, max); } else { values.splice(i--, 1); } } return values; }; //============================================================================= // パラメータの取得と整形 //============================================================================= var paramBoatPassableRegions = getParamArrayNumber(['BoatPassableRegions', '小型船通行リージョン'], 0); var paramBoatPassableTerrainTags = getParamArrayNumber(['BoatPassableTerrainTags', '小型船通行地形タグ'], 0); var paramBoatNonPassableRegions = getParamArrayNumber(['BoatNonPassableRegions', '小型船不可リージョン'], 0); var paramBoatNonPassableTerrainTags = getParamArrayNumber(['BoatNonPassableTerrainTags', '小型船不可地形タグ'], 0); var paramShipPassableRegions = getParamArrayNumber(['ShipPassableRegions', '大型船通行リージョン'], 0); var paramShipPassableTerrainTags = getParamArrayNumber(['ShipPassableTerrainTags', '大型船通行地形タグ'], 0); var paramShipNonPassableRegions = getParamArrayNumber(['ShipNonPassableRegions', '大型船不可リージョン'], 0); var paramShipNonPassableTerrainTags = getParamArrayNumber(['ShipNonPassableTerrainTags', '大型船不可地形タグ'], 0); var paramAirShipNonPassableRegions = getParamArrayNumber(['AirShipNonPassableRegions', '飛行船不可リージョン'], 0); var paramAirShipNonPassableTerrainTags = getParamArrayNumber(['AirShipNonPassableTerrainTags', '飛行船不可地形タグ'], 0); var paramBoatRidingTerrainTags = getParamArrayNumber(['BoatRidingTerrainTags', '小型船乗降地形タグ'], 0); var paramBoatRidingRegions = getParamArrayNumber(['BoatRidingRegions', '小型船乗降リージョン'], 0); var paramShipRidingTerrainTags = getParamArrayNumber(['ShipRidingTerrainTags', '大型船乗降地形タグ'], 0); var paramShipRidingRegions = getParamArrayNumber(['ShipRidingRegions', '大型船乗降リージョン'], 0); var paramAirShipRidingTerrainTags = getParamArrayNumber(['AirShipRidingTerrainTags', '飛行船乗降地形タグ'], 0); var paramAirShipRidingRegions = getParamArrayNumber(['AirShipRidingRegions', '飛行船乗降リージョン'], 0); //============================================================================= // Game_CharacterBase // 飛行専用の通行可能判定を事前に定義します。 //============================================================================= var _Game_CharacterBase_canPass = Game_CharacterBase.prototype.canPass; Game_CharacterBase.prototype.canPass = function (x, y, d) { if (this instanceof Game_Player && this.isInAirship()) { var x2 = $gameMap.roundXWithDirection(this.x, d); var y2 = $gameMap.roundYWithDirection(this.y, d); if (!$gameMap.isAirShipPassable(x2, y2) && !this.isDebugThrough()) { return false; } } return _Game_CharacterBase_canPass.apply(this, arguments); }; //============================================================================= // Game_Map // 乗り物用の通行可能判定を独自に定義します。 //============================================================================= var _Game_Map_isBoatPassable = Game_Map.prototype.isBoatPassable; Game_Map.prototype.isBoatPassable = function (x, y) { var result = _Game_Map_isBoatPassable.apply(this, arguments); var resultRegion = this.isBoatPassableRegion(x, y); var resultTerrainTags = this.isBoatPassableTerrainTags(x, y); if (resultRegion !== null) { return resultRegion; } else if (resultTerrainTags !== null) { return resultTerrainTags; } return result; }; Game_Map.prototype.isBoatPassableRegion = function (x, y) { var regionId = this.regionId(x, y); if (regionId === 0) return null; if (paramBoatPassableRegions.contains(regionId)) { return true; } else if (paramBoatNonPassableRegions.contains(regionId)) { return false; } return null; }; Game_Map.prototype.isBoatPassableTerrainTags = function (x, y) { var terrainTag = this.terrainTag(x, y); if (terrainTag === 0) return null; if (paramBoatPassableTerrainTags.contains(terrainTag)) { return true; } else if (paramBoatNonPassableTerrainTags.contains(terrainTag)) { return false; } return null; }; var _Game_Map_isShipPassable = Game_Map.prototype.isShipPassable; Game_Map.prototype.isShipPassable = function (x, y) { var result = _Game_Map_isShipPassable.apply(this, arguments); var resultRegion = this.isShipPassableRegion(x, y); var resultTerrainTags = this.isShipPassableTerrainTags(x, y); if (resultRegion !== null) { return resultRegion; } else if (resultTerrainTags !== null) { return resultTerrainTags; } return result; }; Game_Map.prototype.isShipPassableRegion = function (x, y) { var regionId = this.regionId(x, y); if (regionId === 0) return null; if (paramShipPassableRegions.contains(regionId)) { return true; } else if (paramShipNonPassableRegions.contains(regionId)) { return false; } return null; }; Game_Map.prototype.isShipPassableTerrainTags = function (x, y) { var terrainTag = this.terrainTag(x, y); if (terrainTag === 0) return null; if (paramShipPassableTerrainTags.contains(terrainTag)) { return true; } else if (paramShipNonPassableTerrainTags.contains(terrainTag)) { return false; } return null; }; Game_Map.prototype.isAirShipPassable = function (x, y) { var resultRegion = this.isAirShipPassableRegion(x, y); var resultTerrainTags = this.isAirShipPassableTerrainTags(x, y); if (resultRegion !== null) { return resultRegion; } else if (resultTerrainTags !== null) { return resultTerrainTags; } return true; }; Game_Map.prototype.isAirShipPassableRegion = function (x, y) { var regionId = this.regionId(x, y); if (regionId === 0) return null; if (paramAirShipNonPassableRegions.contains(regionId)) { return false; } return null; }; Game_Map.prototype.isAirShipPassableTerrainTags = function (x, y) { var terrainTag = this.terrainTag(x, y); if (terrainTag === 0) return null; if (paramAirShipNonPassableTerrainTags.contains(terrainTag)) { return false; } return null; }; var _Game_Map_isAirshipLandOk = Game_Map.prototype.isAirshipLandOk; Game_Map.prototype.isAirshipLandOk = function (x, y) { if (paramAirShipRidingRegions.length > 0 || paramAirShipRidingTerrainTags.length > 0) { return true; } else { return _Game_Map_isAirshipLandOk.apply(this, arguments); } }; //============================================================================= // Game_Vehicle // 乗降可能な地形タグおよびリージョンを制限します。 //============================================================================= var _Game_Vehicle_isLandOk = Game_Vehicle.prototype.isLandOk; Game_Vehicle.prototype.isLandOk = function (x, y, d) { var result = _Game_Vehicle_isLandOk.apply(this, arguments); if (result) { var x2, y2, terrainTags, regionIds; if (this.isBoat()) { x2 = $gameMap.roundXWithDirection(x, d); y2 = $gameMap.roundYWithDirection(y, d); terrainTags = paramBoatRidingTerrainTags; regionIds = paramBoatRidingRegions; } else if (this.isShip()) { x2 = $gameMap.roundXWithDirection(x, d); y2 = $gameMap.roundYWithDirection(y, d); terrainTags = paramShipRidingTerrainTags; regionIds = paramShipRidingRegions; } else if (this.isAirship()) { x2 = x; y2 = y; terrainTags = paramAirShipRidingTerrainTags; regionIds = paramAirShipRidingRegions; } else { return true; } result = this.isLandOkTerrainTagAndRegion(x2, y2, terrainTags, regionIds); } return result; }; Game_Vehicle.prototype.isLandOkTerrainTagAndRegion = function (x, y, terrainTags, regionIds) { var result = null; if (terrainTags.length > 0) { result = result || terrainTags.contains($gameMap.terrainTag(x, y)); } if (regionIds.length > 0) { result = result || regionIds.contains($gameMap.regionId(x, y)); } return result !== null ? result : true; }; })();