white-thirst/www/js/plugins/OverpassTile.js
2024-11-28 12:18:46 -06:00

118 lines
4 KiB
JavaScript

//=============================================================================
// OverpassTile.js
//=============================================================================
/*:
* @plugindesc Settings for bridges which characters can pass through.
* @author Yoji Ojima
*
* @param Overpass Region ID
* @desc The region ID for "overpass" such as bridges.
* @default 255
*
* @param Gateway Region ID
* @desc The region ID for "gateway" such as bridge ends.
* @default 254
*
* @help
*
* This plugin uses region ID to determine a floor level.
* In default, set 255 to bridge tiles and 254 to ends of them.
*
* Note: This plugin does not support the collision judgment modification
* between characters who are in different floors.
*/
/*:ja
* @plugindesc キャラクターが下をくぐり抜けられる橋の設定です。
* @author Yoji Ojima
*
* @param Overpass Region ID
* @desc 橋などの立体交差部分に設定するリージョンIDです。
* @default 255
*
* @param Gateway Region ID
* @desc 橋の両端など、立体交差の入り口部分に設定するリージョンIDです。
* @default 254
*
* @help
*
* このプラグインは、床の高さを決定するのにリージョンIDを使用します。
* デフォルトでは橋の部分に255、その両端に254を設定してください。
*
* 注意:このプラグインは、異なる階層にいるキャラクター間の衝突判定修正は
* サポートしていません。
*/
(function () {
var parameters = PluginManager.parameters("OverpassTile");
var overpassRegionId = Number(parameters["Overpass Region ID"] || 255);
var gatewayRegionId = Number(parameters["Gateway Region ID"] || 254);
var _Tilemap_isOverpassPosition = Tilemap.prototype._isOverpassPosition;
Tilemap.prototype._isOverpassPosition = function (mx, my) {
var regionId = this._readMapData(mx, my, 5);
if (regionId === overpassRegionId) {
return true;
} else {
return _Tilemap_isOverpassPosition.call(this, mx, my);
}
};
var _Game_CharacterBase_screenZ = Game_CharacterBase.prototype.screenZ;
Game_CharacterBase.prototype.screenZ = function () {
if (this._higherLevel) {
return 5;
} else {
return _Game_CharacterBase_screenZ.call(this);
}
};
var _Game_CharacterBase_isMapPassable =
Game_CharacterBase.prototype.isMapPassable;
Game_CharacterBase.prototype.isMapPassable = function (x, y, d) {
if (_Game_CharacterBase_isMapPassable.call(this, x, y, d)) {
var x2 = $gameMap.roundXWithDirection(x, d);
var y2 = $gameMap.roundYWithDirection(y, d);
var d2 = this.reverseDir(d);
var regionId1 = $gameMap.regionId(x, y);
var regionId2 = $gameMap.regionId(x2, y2);
if (this._higherLevel && regionId1 !== gatewayRegionId) {
return regionId2 === gatewayRegionId || regionId2 === overpassRegionId;
}
if (!this._higherLevel && regionId1 === overpassRegionId) {
if (regionId2 === overpassRegionId) {
var bit1 = (1 << (d / 2 - 1)) & 0x0f;
var bit2 = (1 << (d2 / 2 - 1)) & 0x0f;
var flags = $gameMap.tilesetFlags();
var tileId1 = $gameMap.tileId(x, y, 0);
var tileId2 = $gameMap.tileId(x, y, 1);
var tileId3 = $gameMap.tileId(x2, y2, 0);
var tileId4 = $gameMap.tileId(x2, y2, 1);
if ((flags[tileId1] | flags[tileId2]) & bit1) {
return false;
}
if ((flags[tileId3] | flags[tileId4]) & bit2) {
return false;
}
}
return regionId2 !== gatewayRegionId;
}
return true;
} else {
return false;
}
};
var _Game_CharacterBase_refreshBushDepth =
Game_CharacterBase.prototype.refreshBushDepth;
Game_CharacterBase.prototype.refreshBushDepth = function () {
_Game_CharacterBase_refreshBushDepth.call(this);
var regionId = this.regionId();
if (regionId === gatewayRegionId) {
this._higherLevel = true;
} else if (regionId !== overpassRegionId) {
this._higherLevel = false;
}
};
})();