334 lines
15 KiB
JavaScript
334 lines
15 KiB
JavaScript
//=============================================================================
|
||
// 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/
|
||
//=============================================================================
|
||
|
||
/*:
|
||
* @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;
|
||
};
|
||
})();
|
||
|