ravaged-prison-city/js/plugins/DirectivityShake.js
2024-12-19 16:13:08 -06:00

184 lines
6.6 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.

//=============================================================================
// DirectivityShake.js
// ----------------------------------------------------------------------------
// (C)2016 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2022/01/08 ランダムシェイクするコマンドを追加
// 1.1.1 2021/07/10 SINカーブで始点が0でなくなる問題を修正
// 1.1.0 2021/01/10 MZで動作するよう修正
// 1.0.0 2016/11/03 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:ja
* @plugindesc 指向性シェイクプラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/DirectivityShake.js
* @base PluginCommonBase
* @orderAfter PluginCommonBase
* @author トリアコンタン
*
* @command SHAKE_SETTING
* @text シェイク指向設定
* @desc 「画面のシェイク」コマンドに方向やSINカーブを設定します。
*
* @arg rotation
* @text 角度
* @desc 指定した角度でシェイクします。(0-360)
* @default 0
* @type number
* @min 0
* @max 360
*
* @arg sinWave
* @text SINカーブ
* @desc 有効にすると振動がSINカーブを描くようになります。
* @default false
* @type boolean
*
* @command RANDOM_SHAKE_SETTING
* @text ランダムシェイク設定
* @desc 「画面のシェイク」コマンドの角度をランダムにします。
*
* @arg sinWave
* @text SINカーブ
* @desc 有効にすると振動がSINカーブを描くようになります。
* @default false
* @type boolean
*
* @arg interval
* @text 更新間隔
* @desc シェイク中に角度が更新される間隔です。0を指定すると更新されなくなります。
* @default 1
* @type number
*
* @help イベントコマンド「画面のシェイク」に指向性を持たせることができます。
* 角度を指定して縦や斜めに振動させることが可能です。
*
* また振動方法を通常の方法以外にsinカーブに設定できます。独特の抑揚がつきます。
*
* 「画面のシェイク」を行う直前に、プラグインコマンドを実行してください。
* シェイクが終了すると設定は自動でリセットされます。
*
* このプラグインの利用にはベースプラグイン『PluginCommonBase.js』が必要です。
* 『PluginCommonBase.js』は、RPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています。
* dlc/BasicResources/plugins/official
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態商用、18禁利用等
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(() => {
"use strict";
const script = document.currentScript;
PluginManagerEx.registerCommand(script, "SHAKE_SETTING", (args) => {
$gameScreen.setShakeRotation(args.rotation, args.sinWave);
});
PluginManagerEx.registerCommand(script, "RANDOM_SHAKE_SETTING", (args) => {
$gameScreen.setShakeRandom(args.interval, args.sinWave);
});
//=============================================================================
// Game_Screen
// シェイクの方向を保持します。
//=============================================================================
Game_Screen.prototype.getShakeRotation = function () {
return this._shakeRotation;
};
Game_Screen.prototype.setShakeRotation = function (value, sin) {
this._shakeRotation = (value * Math.PI) / 180;
this._shakeSinWave = sin;
this._shakeRandomInterval = 0;
};
Game_Screen.prototype.setShakeRandom = function (interval, sin) {
this._shakeRotation = (Math.randomInt(360) * Math.PI) / 180;
this._shakeSinWave = sin;
this._shakeRandomInterval = interval;
};
const _Game_Screen_clearShake = Game_Screen.prototype.clearShake;
Game_Screen.prototype.clearShake = function () {
_Game_Screen_clearShake.apply(this, arguments);
this.clearDirectivityShake();
};
Game_Screen.prototype.clearDirectivityShake = function () {
this._shakeRotation = 0;
this._shakeSinWave = false;
};
const _Game_Screen_updateShake = Game_Screen.prototype.updateShake;
Game_Screen.prototype.updateShake = function () {
const wasShake = this.isNeedShakeUpdate();
if (
this._shakeRandomInterval > 0 &&
Graphics.frameCount % this._shakeRandomInterval === 0
) {
this._shakeRotation = (Math.randomInt(360) * Math.PI) / 180;
}
if (this._shakeSinWave && wasShake) {
this.updateSinShake();
} else {
_Game_Screen_updateShake.apply(this, arguments);
}
if (wasShake && !this.isNeedShakeUpdate()) {
this.clearDirectivityShake();
}
};
const _Game_Screen_startShake = Game_Screen.prototype.startShake;
Game_Screen.prototype.startShake = function (power, speed, duration) {
_Game_Screen_startShake.apply(this, arguments);
this._shakeDurationTarget = duration;
};
Game_Screen.prototype.updateSinShake = function () {
const pos = this._shakeDurationTarget - this._shakeDuration;
this._shake =
Math.sin((3 * pos * this._shakeSpeed * Math.PI) / 180) *
this._shakePower *
3;
this._shakeDuration--;
if (this._shakeDuration === 0) {
this._lastShake = this._shake;
}
if (this._lastShake * this._shake < 0) {
this._shake = 0;
this._lastShake = 0;
}
};
Game_Screen.prototype.isNeedShakeUpdate = function () {
return this._shakeDuration > 0 || this._shake !== 0;
};
//=============================================================================
// Spriteset_Base
// シェイクの方向を反映します。
//=============================================================================
const _Spriteset_Base_updatePosition =
Spriteset_Base.prototype.updatePosition;
Spriteset_Base.prototype.updatePosition = function () {
_Spriteset_Base_updatePosition.apply(this, arguments);
const shakeRotation = $gameScreen.getShakeRotation();
if (shakeRotation) {
const shakeDistance = Math.round($gameScreen.shake());
this.x -= shakeDistance;
this.x += Math.cos(shakeRotation) * shakeDistance;
this.y += Math.sin(shakeRotation) * shakeDistance;
}
};
})();