mysecretsummervacation2/www/js/plugins/VehiclePassable.js
2023-08-14 15:30:44 -05:00

334 lines
15 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// 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;
};
})();