paradise-succubus-ac/www/js/plugins/ShakeOnDamage.js
2026-06-24 05:29:56 -05:00

278 lines
9.9 KiB
JavaScript
Raw 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.

//=============================================================================
// ShakeOnDamage.js
// ----------------------------------------------------------------------------
// (C)2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2019/05/02 敵キャラのダメージ時にもシェイクさせる機能、弱点攻撃時にシェイクさせる機能を追加
// 1.1.1 2018/03/04 YEP_BattleEngineCore.jsとの競合を解消
// 1.1.0 2017/08/19 パラメータに計算式を使用できる機能を追加
// 1.0.0 2017/08/13 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc ShakeOnDamagePlugin
* @author triacontane
*
* @param ShakePower
* @desc 通常ダメージを受けたときのシェイク強さです。
* @default 5
* @type number
* @min 1
* @max 9
*
* @param CriticalShakePower
* @desc クリティカルダメージを受けたときのシェイク強さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param EffectiveShakePower
* @desc 弱点ダメージを受けたときのシェイク強さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param ShakeSpeed
* @desc シェイク速さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param ShakeDuration
* @desc シェイク時間(フレーム)です。
* @default 30
* @type number
*
* @param ApplyActor
* @desc アクターのダメージ時にシェイクします。
* @default true
* @type boolean
*
* @param ApplyEnemy
* @desc 敵キャラのダメージ時にシェイクします。
* @default false
* @type boolean
*
* @help ShakeOnDamage.js
*
* 戦闘でアクターがダメージを受けたときに画面を振動させます。
* クリティカル時と通常時とで強さを変えることができます。
*
* 各パラメータには計算式を適用できます。さらにローカル変数として
* 以下が使用可能です。
* a : ダメージを受けた対象のアクターです。
* r : ダメージを受けた対象のアクターの残りHP率(0-100)です。
*
* 計算式を入力する場合はパラメータ設定ダイアログで「テキスト」タブを
* 選択してから入力してください。
*
* このプラグインにはプラグインコマンドはありません。
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc ダメージ時の振動プラグイン
* @author トリアコンタン
*
* @param シェイク強さ
* @desc 通常ダメージを受けたときのシェイク強さです。
* @default 5
* @type number
* @min 1
* @max 9
*
* @param クリティカルシェイク強さ
* @desc クリティカルダメージを受けたときのシェイク強さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param 弱点シェイク強さ
* @desc 弱点ダメージを受けたときのシェイク強さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param シェイク速さ
* @desc シェイク速さです。
* @default 9
* @type number
* @min 1
* @max 9
*
* @param シェイク時間
* @desc シェイク時間(フレーム)です。
* @default 30
* @type number
*
* @param アクターに適用
* @desc アクターのダメージ時にシェイクします。
* @default true
* @type boolean
*
* @param 敵キャラに適用
* @desc 敵キャラのダメージ時にシェイクします。
* @default false
* @type boolean
*
* @help ShakeOnDamage.js
*
* 戦闘でアクターがダメージを受けたときに画面を振動させます。
* クリティカル時と通常時とで強さを変えることができます。
*
* 各パラメータには計算式を適用できます。
* さらにローカル変数として以下が使用可能です。
* a : ダメージを受けた対象のアクターです。
* r : ダメージを受けた対象のアクターの残りHP率(0-100)です。
*
* 計算式を入力する場合はパラメータ設定ダイアログで「テキスト」タブを
* 選択してから入力してください。
*
* このプラグインにはプラグインコマンドはありません。
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態商用、18禁利用等
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function() {
'use strict';
var pluginName = 'ShakeOnDamage';
//=============================================================================
// ローカル関数
// プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
//=============================================================================
var getParamString = 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 '';
};
var getParamBoolean = function(paramNames) {
var value = getParamString(paramNames).toUpperCase();
return value === 'TRUE';
};
var convertEscapeCharacters = function(text) {
if (isNotAString(text)) text = '';
var windowLayer = SceneManager._scene._windowLayer;
return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
};
var isNotAString = function(args) {
return String(args) !== args;
};
//=============================================================================
// パラメータの取得と整形
//=============================================================================
var param = {};
param.shakePower = getParamString(['ShakePower', 'シェイク強さ']);
param.criticalShakePower = getParamString(['CriticalShakePower', 'クリティカルシェイク強さ']);
param.effectiveShakePower = getParamString(['EffectiveShakePower', '弱点シェイク強さ']);
param.shakeSpeed = getParamString(['ShakeSpeed', 'シェイク速さ']);
param.shakeDuration = getParamString(['ShakeDuration', 'シェイク時間']);
param.applyActor = getParamBoolean(['ApplyActor', 'アクターに適用']);
param.applyEnemy = getParamBoolean(['ApplyEnemy', '敵キャラに適用']);
//=============================================================================
// Game_Battler
// クリティカル判定を記憶します。
//=============================================================================
Game_Battler.prototype.setCriticalForShake = function(value) {
this._criticalForShake = value;
};
Game_Battler.prototype.isCriticalForShake = function() {
return this._criticalForShake;
};
Game_Battler.prototype.setEffectiveForShake = function(value) {
this._effectiveForShake = value;
};
Game_Battler.prototype.isEffectiveForShake = function() {
return this._effectiveForShake;
};
var _Game_Battler_performDamage = Game_Battler.prototype.performDamage;
Game_Battler.prototype.performDamage = function() {
_Game_Battler_performDamage.apply(this, arguments);
if (this.isShakeOnDamage()) {
this.shakeOnDamage();
}
};
Game_Battler.prototype.shakeOnDamage = function() {
var power = this.getDamageShakePower();
var speed = this.convertShakeParameter(param.shakeSpeed);
var duration = this.convertShakeParameter(param.shakeDuration);
$gameScreen.startShake(power, speed, duration);
this.setCriticalForShake(false);
};
Game_Battler.prototype.getDamageShakePower = function() {
var power = param.shakePower;
if (param.criticalShakePower && this.isCriticalForShake()) {
power = param.criticalShakePower;
} else if (param.effectiveShakePower && this.isEffectiveForShake()) {
power = param.effectiveShakePower;
}
return this.convertShakeParameter(power);
};
Game_Battler.prototype.convertShakeParameter = function(param) {
var convertParam = convertEscapeCharacters(param);
// use in eval
var a = this;
var r = a.hpRate() * 100;
return isNaN(Number(convertParam)) ? eval(convertParam) : parseInt(convertParam);
};
Game_Battler.prototype.isShakeOnDamage = function() {
return false;
};
Game_Actor.prototype.isShakeOnDamage = function() {
return param.applyActor;
};
Game_Enemy.prototype.isShakeOnDamage = function() {
return param.applyEnemy;
};
//=============================================================================
// Game_Action
// クリティカル判定を記憶します。
//=============================================================================
var _Game_Action_makeDamageValue = Game_Action.prototype.makeDamageValue;
Game_Action.prototype.makeDamageValue = function(target, critical) {
target.setCriticalForShake(critical);
return _Game_Action_makeDamageValue.apply(this, arguments);
};
var _Game_Action_calcElementRate = Game_Action.prototype.calcElementRate;
Game_Action.prototype.calcElementRate = function(target) {
var result = _Game_Action_calcElementRate.apply(this, arguments);
target.setEffectiveForShake(result > 1.0);
return result;
};
})();