heroine-dark-side/js/plugins/TMMoveEx.js
2025-07-31 14:09:47 -05:00

365 lines
12 KiB
JavaScript

//=============================================================================
// TMPlugin - 移動機能拡張
// バージョン: 1.3.1
// 最終更新日: 2017/06/16
// 配布元 : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2015 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc 壁衝突音やリージョンによる通行設定などの機能を追加します。
*
* @author tomoaky (http://hikimoki.sakura.ne.jp/)
*
* @param passableRegionId
* @type number
* @desc タイルに関係なく通行を可能にするリージョン番号
* 初期値: 251
* @default 251
*
* @param dontPassRegionId
* @type number
* @desc タイルに関係なく通行を不可にするリージョン番号
* 初期値: 252
* @default 252
*
* @param knockWallSe
* @desc 壁衝突時に鳴らす効果音のファイル名
* 初期値: Blow1
* @default Blow1
* @require 1
* @dir audio/se/
* @type file
*
* @param knockWallSeParam
* @type string
* @desc 壁衝突時に鳴らす効果音のパラメータ
* 初期値: {"volume":90, "pitch":100}
* @default {"volume":90, "pitch":100}
*
* @param knockWallPan
* @type number
* @desc 壁衝突効果音の左右バランス
* 初期値: 75
* @default 75
*
* @param knockWallInterval
* @type number
* @desc 壁衝突効果音の再生間隔(フレーム数)
* 初期値: 30
* @default 30
*
* @param turnKeyCode
* @type string
* @desc その場で向き変更に使うキー
* 初期値: S
* @default S
*
* @param movableRegion1
* @type string
* @desc イベントの移動可能リージョンタイプ設定1番
* 設定例: 1,2,3
* @default
*
* @param movableRegion2
* @type string
* @desc イベントの移動可能リージョンタイプ設定2番
* 設定例: 1,2,3
* @default
*
* @param movableRegion3
* @type string
* @desc イベントの移動可能リージョンタイプ設定3番
* 設定例: 1,2,3
* @default
*
* @param movableRegion4
* @type string
* @desc イベントの移動可能リージョンタイプ設定4番
* 設定例: 1,2,3
* @default
*
* @param movableRegion5
* @type string
* @desc イベントの移動可能リージョンタイプ設定5番
* 設定例: 1,2,3
* @default
*
* @param movableRegion6
* @type string
* @desc イベントの移動可能リージョンタイプ設定6番
* 設定例: 1,2,3
* @default
*
* @param movableRegion7
* @type string
* @desc イベントの移動可能リージョンタイプ設定7番
* 設定例: 1,2,3
* @default
*
* @param movableRegion8
* @type string
* @desc イベントの移動可能リージョンタイプ設定8番
* 設定例: 1,2,3
* @default
*
* @param movableRegion9
* @type string
* @desc イベントの移動可能リージョンタイプ設定9番
* 設定例: 1,2,3
* @default
*
* @param movableRegion10
* @type string
* @desc イベントの移動可能リージョンタイプ設定10番
* 設定例: 1,2,3
* @default
*
* @help
* TMPlugin - 移動機能拡張 ver1.3.1
*
* 使い方:
*
* Sキーを押しながら方向キーを押すと、移動せずにプレイヤーの向きだけを
* 変えることができます。マウス(タップ)操作の場合はプレイヤーがいる場所
* をクリックすることで、時計回りに90度回転します。
*
* その場で移動せずに向きを変更する機能で使用するキーは turnKeyCode の値を
* 変更することで設定できます。XやZなど標準機能ですでに使用しているキーは
* 設定しないでください。
*
* メモ欄タグを使って、イベントごとに移動可能なリージョンを変更できます。
* プラグインパラメータで移動可能リージョンタイプをカスタマイズしてから
* 利用してください。
* たとえば movableRegion1 の値を 1,2,3 にして、イベントのメモ欄に
* <movableRegion:1> というタグを書いた場合、そのイベントはリージョンが
* 1~3番の場所のみ移動できるようになります。
*
* このプラグインは RPGツクールMV Version 1.5.0 で動作確認をしています。
*
*
* メモ欄タグ(イベント):
*
* <movableRegion:1>
* 移動可能リージョンタイプを1番に設定する
*
* <stepSwitchOnA:64>
* イベントが移動してリージョン64番を踏むとセルフスイッチAをオン
* A以外のセルフスイッチを使用する場合は stepSwitchOnB のようにして
* ください。
*
* <stepSwitchOffB:65>
* イベントが移動してリージョン65番を踏むとセルフスイッチBをオフ
*
* 上記タグはイベントコマンド『注釈』に書き込むことでも機能します。
* メモ欄と注釈の両方にタグがあった場合、注釈の方が優先されます。
*
*
* プラグインコマンド:
*
* regionLocate 3 20
* 3番のイベントをリージョン20番が設定されている座標のどこかへ場所移動
* させます。
* イベント番号が 0 ならコマンドを実行したイベント自体、-1 ならプレイヤー
* を対象とします。
*/
var Imported = Imported || {};
Imported.TMMoveEx = true;
var TMPlugin = TMPlugin || {};
if (!TMPlugin.EventBase) {
TMPlugin.EventBase = true;
(function() {
var _Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
_Game_Event_setupPage.call(this);
if (this._pageIndex >= 0) this.loadCommentParams();
};
Game_Event.prototype.loadCommentParams = function() {
this._commentParams = {};
var re = /<([^<>:]+)(:?)([^>]*)>/g;
var list = this.list();
for (var i = 0; i < list.length; i++) {
var command = list[i];
if (command && command.code == 108 || command.code == 408) {
for (;;) {
var match = re.exec(command.parameters[0]);
if (match) {
this._commentParams[match[1]] = match[2] === ':' ? match[3] : true;
} else {
break;
}
}
} else {
break;
}
}
};
Game_Event.prototype.loadTagParam = function(paramName) {
return this._commentParams[paramName] || this.event().meta[paramName];
};
})();
} // TMPlugin.EventBase
(function() {
var parameters = PluginManager.parameters('TMMoveEx');
var passableRegionId = +(parameters['passableRegionId'] || 251);
var dontPassRegionId = +(parameters['dontPassRegionId'] || 252);
var knockWallSe = JSON.parse(parameters['knockWallSeParam'] || '{}');
knockWallSe.name = parameters['knockWallSe'] || '';
var knockWallPan = +(parameters['knockWallPan'] || 75);
var knockWallInterval = +(parameters['knockWallInterval'] || 30);
var movableRegionType = [];
for (var i = 1; i <= 10; i++) {
movableRegionType[i] = parameters['movableRegion' + i].split(',');
}
//-----------------------------------------------------------------------------
// Input
//
Input.keyMapper[parameters['turnKeyCode'].charCodeAt()] = 'turn';
//-----------------------------------------------------------------------------
// Game_Map
//
var _Game_Map_checkPassage = Game_Map.prototype.checkPassage;
Game_Map.prototype.checkPassage = function(x, y, bit) {
var regionId = this.regionId(x, y);
if (regionId === passableRegionId) return true;
if (regionId === dontPassRegionId) return false;
return _Game_Map_checkPassage.call(this, x, y, bit);
};
Game_Map.prototype.regionPoints = function(regionId) {
var result = [];
for (var x = 0; x < this.width(); x++) {
for (var y = 0; y < this.height(); y++) {
if (this.regionId(x, y) === regionId && this.eventIdXy(x, y) === 0) {
result.push(new Point(x, y));
}
}
}
return result;
};
Game_Map.prototype.regionPointRandom = function(regionId) {
var regionPoints = this.regionPoints(regionId);
if (regionPoints.length === 0) return null;
return regionPoints[Math.randomInt(regionPoints.length)];
};
//-----------------------------------------------------------------------------
// Game_Player
//
var _Game_Player_moveStraight = Game_Player.prototype.moveStraight;
Game_Player.prototype.moveStraight = function(d) {
_Game_Player_moveStraight.call(this, d);
if (!this.isMovementSucceeded()) {
var x2 = $gameMap.roundXWithDirection(this.x, d);
var y2 = $gameMap.roundYWithDirection(this.y, d);
if (this.isNormal() && ($gameMap.boat().pos(x2, y2) || $gameMap.ship().pos(x2, y2))) return;
if (this.isInVehicle() && this.vehicle().isLandOk(this.x, this.y, this.direction())) return;
var d2 = this.reverseDir(d);
if (!$gameMap.isPassable(this.x, this.y, d) || !$gameMap.isPassable(x2, y2, d2)) {
this._knockWallCount = this._knockWallCount == null ? 0 : this._knockWallCount;
if (this._knockWallCount + knockWallInterval <= Graphics.frameCount ||
this._lastKnockWallDir !== d) {
if (d === 4) {
knockWallSe.pan = -knockWallPan;
} else if (d === 6) {
knockWallSe.pan = knockWallPan;
} else {
knockWallSe.pan = 0;
}
AudioManager.playSe(knockWallSe);
this._knockWallCount = Graphics.frameCount;
this._lastKnockWallDir = d;
}
}
}
};
var _Game_Player_moveByInput = Game_Player.prototype.moveByInput;
Game_Player.prototype.moveByInput = function() {
if (!this.isMoving() && this.canMove()) {
var direction = this.getInputDirection();
if (Input.isPressed('turn') && direction > 0) {
this.setDirection(direction);
return;
}
if (TouchInput.isTriggered() && $gameTemp.isDestinationValid()) {
var x = $gameTemp.destinationX();
var y = $gameTemp.destinationY();
if (this.pos(x, y)) {
this.turnRight90();
return;
}
}
}
_Game_Player_moveByInput.call(this);
};
//-----------------------------------------------------------------------------
// Game_Event
//
var _Game_Event_isMapPassable = Game_Event.prototype.isMapPassable;
Game_Event.prototype.isMapPassable = function(x, y, d) {
var movableRegion = this.loadTagParam('movableRegion');
if (movableRegion) {
var x2 = $gameMap.roundXWithDirection(x, d);
var y2 = $gameMap.roundYWithDirection(y, d);
var region = $gameMap.regionId(x2, y2);
return movableRegionType[+movableRegion].indexOf('' + region) >= 0;
} else {
return _Game_Event_isMapPassable.call(this, x, y, d);
}
};
var _Game_Event_moveStraight = Game_Event.prototype.moveStraight;
Game_Event.prototype.moveStraight = function(d) {
_Game_Event_moveStraight.call(this, d);
['A', 'B', 'C', 'D'].forEach (function(code) {
var regionId = this.loadTagParam('stepSwitchOn' + code);
if (regionId && this.regionId() === +regionId) {
var key = [$gameMap.mapId(), this.eventId(), code];
$gameSelfSwitches.setValue(key, true);
} else {
regionId = this.loadTagParam('stepSwitchOff' + code);
if (regionId && this.regionId() === +regionId) {
var key = [$gameMap.mapId(), this.eventId(), code];
$gameSelfSwitches.setValue(key, false);
}
}
}, this);
};
//-----------------------------------------------------------------------------
// Game_Interpreter
//
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === 'regionLocate') {
var character = this.character(+args[0]);
if (character) {
var point = $gameMap.regionPointRandom(+args[1]);
if (point) character.locate(point.x, point.y);
}
}
};
})();