code:
//=============================================================================
// PictureVariableSetting.js
// ----------------------------------------------------------------------------
// (C) 2015 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.5.4 2023/06/14 ピクチャのシェイクでシェイク終了後にピクチャがシェイク前の位置まで戻るよう修正
// 1.5.3 2021/08/29 DirectivityShake.jsと併用したとき、角度を付けたシェイクにもP_OUT_OF_SCREEN_SHAKE_ONが対応できるよう修正
// 1.5.2 2019/06/02 P_OUT_OF_SCREEN_SHAKE_ON設定時、シェイクの強さ次第で僅かに揺れていた問題を修正
// 1.5.1 2019/05/02 P_OUT_OF_SCREEN_SHAKE_ONのヘルプを追記
// 1.5.0 2016/08/06 ピクチャを画面のシェイクと連動しないようにするコマンドを追加
// 1.4.0 2016/06/23 ピクチャをシェイクさせるコマンドを追加
// 1.3.0 2016/04/29 ピクチャを指定した角度まで回転させるコマンドを追加
// 1.2.1 2016/04/14 処理を適用するピクチャを範囲指定もしくは複数指定する機能を追加
// 1.2.0 2016/03/19 表示中のすべてのピクチャに処理を適用するコマンドを追加
// 1.1.2 2016/01/24 ピクチャの最大表示数を設定できる機能を追加
// 1.1.1 2015/12/20 番号の変数指定の初期値を有効/無効で設定できるよう修正
// 1.1.0 2015/11/27 ピクチャのファイル名に変数を組み込むことが出来る機能を追加
// 1.0.0 2015/11/24 初版
// ----------------------------------------------------------------------------
// [Blog]   : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc ピクチャ関連のイベント機能拡張プラグイン
 * @author トリアコンタン
 *
 * @param 初期値
 * @desc 初期状態での有効/無効の設定値(ON/OFF)
 * @default OFF
 *
 * @param ピクチャ表示最大数
 * @desc ピクチャ表示最大数（デフォルト100個）を設定します。
 * 変えない場合は何も入力しないでください。
 * @default
 *
 * @help ピクチャ関連のイベント命令の機能を拡張します。
 * プラグインコマンドから機能を有効にしてください。
 *
 * １．ピクチャ関連のイベント命令で番号が「指定された変数の値」になるよう
 * 仕様を変更します。
 * 例えば番号に「1」を設定すると「1」番の変数の値をピクチャ番号として設定します。
 * プラグインコマンドから「P_VARIABLE_VALID」「P_VARIABLE_INVALID」で
 * 有効/無効を切り替えてください。（初期状態では無効です）
 *
 * ２．ピクチャのファイル名に変数を組み込むことが出来るようになります。
 * 連番を含むファイル名などの柔軟な指定に有効です。
 * プラグインコマンド「P_D_FILENAME」を実行してから
 * 「画像」を指定せず「ピクチャの表示」を行ってください。
 *
 * 要注意！　ピクチャのファイル名を動的指定した場合、デプロイメント時に
 * 未使用ファイルとして除外される可能性があります。
 * その場合、削除されたファイルを入れ直す等の対応が必要です。
 *
 * ３．以下のイベントコマンドの対象が「複数のピクチャ」になります。
 * 　　詳細は各プラグインコマンドの説明を確認してください。
 *  ・ピクチャの移動
 *  ・ピクチャの色調変更
 *  ・ピクチャの回転
 *  ・ピクチャの消去
 *
 * プラグインコマンド詳細
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （引数の間は半角スペースで区切る）
 *
 *  P_VARIABLE_VALID : ピクチャ番号の変数設定が有効になります。
 *  P_VARIABLE_INVALID : ピクチャ番号の変数設定が無効になります。
 *  ※ 一度有効に設定したら、無効にするまでずっとそのままです。
 *  例 P_VARIABLE_VALID
 *
 *  P_D_FILENAME [ファイル名]
 *  次に表示するピクチャのファイル名に変数を含めることができます。
 *  変数は「文章の表示」と同様の書式\V[n]で組み込んでください。
 *  拡張子は指定しないでください。
 *  例 P_D_FILENAME file\V[1]
 *
 *  P_TARGET_ALL
 *  ピクチャ関連のイベントコマンドの対象を
 *  「表示している全てのピクチャ」に変更します。
 *  1回実行すると設定はもとに戻ります。
 *  例 P_TARGET_ALL
 *
 *  P_TARGET_RANGE [開始番号] [終了番号]
 *  ピクチャ関連のイベントコマンドの対象を
 *  「開始番号から終了番号までのピクチャ」に変更します。
 *  1回実行すると設定はもとに戻ります。
 *  例 P_TARGET_RANGE 3 5 // 3番から5番までの表示しているピクチャが対象
 *
 *  P_TARGET_MULTI [ピクチャ番号]
 *  ピクチャ関連のイベントコマンドの対象を
 *  「指定したすべてのピクチャ」に変更します。カンマで区切ってください。
 *  1回実行すると設定はもとに戻ります。
 *  例 P_TARGET_MULTI 3,5,6,\v[1] // 3番、5番、6番、変数「1」番のピクチャが対象
 *
 *  P_SPIN [ピクチャ番号] [角度] [時間(フレーム)] [完了までウェイト]
 *  対象のピクチャを指定した角度(degree)まで回転させます。正の値が時計回りです。
 *  時間を0にすると即座に指定した角度に設定されます。
 *  このコマンドには「P_TARGET_ALL」等が適用されます。
 *  一番後ろに「WAIT」と付けると、回転が完了するまでウェイトします。
 *  例 P_SPIN 1 90 60 WAIT
 *  -> ピクチャ番号「1」を60フレーム掛けて90度回転させる。
 *
 *  P_SPIN_RELATIVE [ピクチャ番号] [角度] [時間(フレーム)] [完了までウェイト]
 *  対象のピクチャを現在の角度を基準に、指定した角度のぶんだけ回転させます。
 *  それ以外は「P_SPIN」と同様です。
 *  例 P_SPIN_RELATIVE \v[1] -90 0
 *  -> 変数「1」の値のピクチャを、現在の角度から-90度まで即座に回転させる。
 *
 *  P_SHAKE [ピクチャ番号] [強さ] [速さ] [角度] [時間(フレーム)] [完了までウェイト]
 *  対象のピクチャをシェイクさせます。強さと速さはイベント「画面のシェイク」と
 *  同様の9段階の数値で指定します。角度(degree)はシェイク方向を0から360までの
 *  値で指定します。(90で縦方向にシェイクします)
 *  時間を指定しないと、停止するまでシェイクし続けます。
 *  一番後ろに「WAIT」と付けると、回転が完了するまでウェイトします。
 *  このコマンドには「P_TARGET_ALL」等が適用されます。
 *  例 P_SHAKE 1 3 9 0 60 WAIT
 *  -> ピクチャ番号「1」を60フレームのあいだ、強さ3、速さ9で横方向にシェイクします。
 *
 *  P_STOP_SHAKE [ピクチャ番号]
 *  対象のピクチャをシェイクを止めます。P_SHAKEで時間を指定しないと
 *  ずっとシェイクし続けるので当コマンドで無効にします。
 *  このコマンドには「P_TARGET_ALL」等が適用されます。
 *　例 P_STOP_SHAKE \v[1]
 *  -> 変数「1」の値のピクチャのシェイクを止めます。
 *
 *  P_OUT_OF_SCREEN_SHAKE_ON [ピクチャ番号]
 *  対象のピクチャが画面のシェイクと連動しないようになります。
 *  メッセージウィンドウ等と同じ扱いになります。
 *  このコマンドはピクチャの表示後に実行する必要があります。
 *  また、このコマンド実行後に同一番号でピクチャを再表示すると無効になります。
 *
 *  例 P_OUT_OF_SCREEN_SHAKE_ON 1
 *  -> ピクチャ番号「1」が画面のシェイクと連動しないようになります。
 *
 *  P_OUT_OF_SCREEN_SHAKE_OFF [ピクチャ番号]
 *  対象のピクチャが画面のシェイクと再度、連動するようになります。
 *  例 P_OUT_OF_SCREEN_SHAKE_OFF 1
 *  -> ピクチャ番号「1」が画面のシェイクと再度、連動するようになります。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
(function() {
    'use strict';
    var pluginName = 'PictureVariableSetting';

    //=============================================================================
    // ローカル関数
    //  プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
    //=============================================================================
    var getParamBoolean = function(paramNames) {
        var value = getParamOther(paramNames);
        return (value || '').toUpperCase() === 'ON';
    };

    var getParamNumber = function(paramNames, min, max) {
        var value = getParamOther(paramNames);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(value, 10) || 0).clamp(min, max);
    };

    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 getCommandName = function(command) {
        return (command || '').toUpperCase();
    };

    var getArgString = function(arg, upperFlg) {
        arg = convertEscapeCharactersAndEval(arg, false);
        return upperFlg ? arg.toUpperCase() : arg;
    };

    var getArgNumber = function(arg, min, max) {
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        return (parseInt(convertEscapeCharactersAndEval(arg, true), 10) || 0).clamp(min, max);
    };

    var getArgArrayString = function(args, upperFlg) {
        var values = getArgString(args, upperFlg).split(',');
        for (var i = 0; i < values.length; i++) values[i] = values[i].trim();
        return values;
    };

    var getArgArrayNumber = function(args, min, max) {
        var values = getArgArrayString(args, false);
        if (arguments.length < 2) min = -Infinity;
        if (arguments.length < 3) max = Infinity;
        for (var i = 0; i < values.length; i++) values[i] = (parseInt(values[i], 10) || 0).clamp(min, max);
        return values;
    };

    var convertEscapeCharactersAndEval = function(text, evalFlg) {
        if (text === null || text === undefined) text = '';
        var window = SceneManager._scene._windowLayer.children[0];
        if (window) {
            var result = window.convertEscapeCharacters(text);
            return evalFlg ? eval(result) : result;
        } else {
            return text;
        }
    };

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンド[P_VARIABLE_VALID]などを追加定義します。
    //  ピクチャ番号を変数で指定するよう変更します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand      = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        switch (getCommandName(command)) {
            case 'P_VARIABLE_VALID':
                $gameSystem.pictureNumVariable = true;
                break;
            case 'P_VARIABLE_INVALID':
                $gameSystem.pictureNumVariable = false;
                break;
            case 'P_D_FILENAME':
                $gameScreen.dPictureFileName = getArgString(args[0]);
                break;
            case 'P_TARGET_ALL':
                $gameScreen.setPictureTargetAll();
                break;
            case 'P_TARGET_RANGE':
                $gameScreen.setPictureTargetRange(getArgNumber(args[0], 1), getArgNumber(args[1], 1));
                break;
            case 'P_TARGET_MULTI':
                $gameScreen.setPictureTargetMulti(getArgArrayNumber(args[0], 1));
                break;
            case 'P_SPIN':
                var spinDuration = getArgNumber(args[2], 0);
                $gameScreen.spinPicture(getArgNumber(args[0], 1), getArgNumber(args[1]), spinDuration);
                if (args[3]) this.wait(spinDuration);
                break;
            case 'P_SPIN_RELATIVE':
                var spinRelativeDuration = getArgNumber(args[2], 0);
                $gameScreen.spinPictureRelative(getArgNumber(args[0], 1), getArgNumber(args[1]), spinRelativeDuration);
                if (args[3]) this.wait(spinRelativeDuration);
                break;
            case 'P_SHAKE':
                var shakeDuration = getArgNumber(args[4], 0) || Infinity;
                var power         = getArgNumber(args[1], 1, 9);
                var speed         = getArgNumber(args[2], 1, 9);
                var rotation      = getArgNumber(args[3], 0, 360);
                $gameScreen.shakePicture(getArgNumber(args[0], 1), power, speed, rotation, shakeDuration);
                if (args[5] && shakeDuration !== Infinity) this.wait(shakeDuration);
                break;
            case 'P_STOP_SHAKE':
                $gameScreen.shakePicture(getArgNumber(args[0], 1), 0, 0, 0, 0);
                break;
            case 'P_OUT_OF_SCREEN_SHAKE_ON':
                $gameScreen.setOutOfScreenShakePicture(getArgNumber(args[0], 1), true);
                break;
            case 'P_OUT_OF_SCREEN_SHAKE_OFF':
                $gameScreen.setOutOfScreenShakePicture(getArgNumber(args[0], 1), false);
                break;
        }
    };

    var _Game_Interpreter_command231      = Game_Interpreter.prototype.command231;
    Game_Interpreter.prototype.command231 = function() {
        return this.transPictureNumber(_Game_Interpreter_command231.bind(this));
    };

    var _Game_Interpreter_command232      = Game_Interpreter.prototype.command232;
    Game_Interpreter.prototype.command232 = function() {
        return this.transPictureNumber(_Game_Interpreter_command232.bind(this));
    };

    var _Game_Interpreter_command233      = Game_Interpreter.prototype.command233;
    Game_Interpreter.prototype.command233 = function() {
        return this.transPictureNumber(_Game_Interpreter_command233.bind(this));
    };

    var _Game_Interpreter_command234      = Game_Interpreter.prototype.command234;
    Game_Interpreter.prototype.command234 = function() {
        return this.transPictureNumber(_Game_Interpreter_command234.bind(this));
    };

    var _Game_Interpreter_command235      = Game_Interpreter.prototype.command235;
    Game_Interpreter.prototype.command235 = function() {
        return this.transPictureNumber(_Game_Interpreter_command235.bind(this));
    };

    Game_Interpreter.prototype.transPictureNumber = function(handler) {
        var result;
        if ($gameSystem.pictureNumVariable) {
            var oldValue    = this._params[0];
            this._params[0] = $gameVariables.value(this._params[0]).clamp(1, $gameScreen.maxPictures());
            result          = handler();
            this._params[0] = oldValue;
        } else {
            result = handler();
        }
        return result;
    };

    //=============================================================================
    // Game_System
    //  ピクチャ番号の変数指定フラグを追加定義します。
    //=============================================================================
    var _Game_System_initialize      = Game_System.prototype.initialize;
    Game_System.prototype.initialize = function() {
        _Game_System_initialize.call(this);
        this.pictureNumVariable = getParamBoolean('初期値');
    };

    //=============================================================================
    // Game_Screen
    //  動的ファイル名指定用のプロパティを追加定義します。
    //=============================================================================
    var _Game_Screen_clear      = Game_Screen.prototype.clear;
    Game_Screen.prototype.clear = function() {
        _Game_Screen_clear.call(this);
        this.dPictureFileName      = null;
        this._pictureTargetStart   = null;
        this._pictureTargetEnd     = null;
        this._pictureTargetNumbers = null;
    };

    Game_Screen.prototype.setPictureTargetAll = function() {
        this._pictureTargetAll = 1;
    };

    Game_Screen.prototype.setPictureTargetRange = function(start, end) {
        this._pictureTargetAll   = 2;
        this._pictureTargetStart = start;
        this._pictureTargetEnd   = end;
    };

    Game_Screen.prototype.setPictureTargetMulti = function(args) {
        this._pictureTargetAll     = 3;
        this._pictureTargetNumbers = args;
    };

    var _Game_Screen_movePicture      = Game_Screen.prototype.movePicture;
    Game_Screen.prototype.movePicture = function(pictureId, origin, x, y, scaleX,
                                                 scaleY, opacity, blendMode, duration) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.move(origin, x, y, scaleX, scaleY, opacity, blendMode, duration);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            _Game_Screen_movePicture.apply(this, arguments);
        }
    };

    var _Game_Screen_rotatePicture      = Game_Screen.prototype.rotatePicture;
    Game_Screen.prototype.rotatePicture = function(pictureId, speed) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.rotate(speed);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            _Game_Screen_rotatePicture.apply(this, arguments);
        }
    };

    var _Game_Screen_tintPicture      = Game_Screen.prototype.tintPicture;
    Game_Screen.prototype.tintPicture = function(pictureId, tone, duration) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.tint(tone, duration);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            _Game_Screen_tintPicture.apply(this, arguments);
        }
    };

    var _Game_Screen_erasePicture      = Game_Screen.prototype.erasePicture;
    Game_Screen.prototype.erasePicture = function(pictureId) {
        if (this._pictureTargetAll) {
            this.iteratePictures(function(picture, pictureId) {
                var realPictureId             = this.realPictureId(pictureId);
                this._pictures[realPictureId] = null;
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            _Game_Screen_erasePicture.apply(this, arguments);
        }
    };

    Game_Screen.prototype.spinPicture = function(pictureId, rotation, duration) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.spin(rotation, duration);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            var picture = this.picture(pictureId);
            if (picture) {
                picture.spin(rotation, duration);
            }
        }
    };

    Game_Screen.prototype.spinPictureRelative = function(pictureId, relativeRotation, duration) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.spinRelative(relativeRotation, duration);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            var picture = this.picture(pictureId);
            if (picture) {
                picture.spinRelative(relativeRotation, duration);
            }
        }
    };

    Game_Screen.prototype.shakePicture = function(pictureId, power, speed, rotation, duration) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.shake(power, speed, rotation, duration);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            var picture = this.picture(pictureId);
            if (picture) {
                picture.shake(power, speed, rotation, duration);
            }
        }
    };

    Game_Screen.prototype.setOutOfScreenShakePicture = function(pictureId, value) {
        if (this._pictureTargetAll > 0) {
            this.iteratePictures(function(picture) {
                picture.setOutOfScreenShake(value);
            }.bind(this));
            this._pictureTargetAll = 0;
        } else {
            var picture = this.picture(pictureId);
            if (picture) {
                picture.setOutOfScreenShake(value);
            }
        }
    };

    Game_Screen.prototype.iteratePictures = function(callBack) {
        for (var i = 1, n = this.maxPictures(); i <= n; i++) {
            var picture = this.picture(i);
            if (picture && this.isTargetPicture(i)) {
                callBack.call(this, picture, i);
            }
        }
    };

    Game_Screen.prototype.isTargetPicture = function(number) {
        switch (this._pictureTargetAll) {
            case 2:
                return this._pictureTargetStart <= number && this._pictureTargetEnd >= number;
            case 3:
                return this._pictureTargetNumbers.contains(number);
            default:
                return true;
        }
    };

    var _Game_Screen_maxPictures      = Game_Screen.prototype.maxPictures;
    Game_Screen.prototype.maxPictures = function() {
        var max = getParamNumber('ピクチャ表示最大数', 0);
        return max > 0 ? max : _Game_Screen_maxPictures.apply(this, arguments);
    };

    //=============================================================================
    // Game_Picture
    //  ファイル名の動的生成処理を追加定義します。
    //=============================================================================
    var _Game_Picture_show      = Game_Picture.prototype.show;
    Game_Picture.prototype.show = function(name, origin, x, y, scaleX,
                                           scaleY, opacity, blendMode) {
        if ($gameScreen.dPictureFileName != null) {
            arguments[0]                 = $gameScreen.dPictureFileName;
            $gameScreen.dPictureFileName = null;
        }
        _Game_Picture_show.apply(this, arguments);
    };

    var _Game_Picture_x      = Game_Picture.prototype.x;
    Game_Picture.prototype.x = function() {
        return _Game_Picture_x.apply(this, arguments) + this.getShakeX() +
            (this._outOfScreenShake ? this.antiShakeX() : 0);
    };

    Game_Picture.prototype.antiShakeX = function() {
        if (!this._outOfScreenShake) {
            return 0;
        }
        var shakeDistance = Math.round($gameScreen.shake());
        if ($gameScreen.getShakeRotation) {
            var shakeRotation  = $gameScreen.getShakeRotation();
            return -Math.round(Math.cos(shakeRotation) * shakeDistance);
        } else {
            return -shakeDistance;
        }
    };

    var _Game_Picture_y      = Game_Picture.prototype.y;
    Game_Picture.prototype.y = function() {
        return _Game_Picture_y.apply(this, arguments) + this.getShakeY() +
            (this._outOfScreenShake ? this.antiShakeY() : 0);
    };

    Game_Picture.prototype.antiShakeY = function() {
        if (!this._outOfScreenShake) {
            return 0;
        }
        var shakeDistance = Math.round($gameScreen.shake());
        if ($gameScreen.getShakeRotation) {
            var shakeRotation  = $gameScreen.getShakeRotation();
            return -Math.sin(shakeRotation) * shakeDistance;
        } else {
            return 0;
        }
    };

    Game_Picture.prototype.setOutOfScreenShake = function(value) {
        this._outOfScreenShake = !!value;
    };

    Game_Picture.prototype.spin = function(targetRotation, duration) {
        this._targetRotation = targetRotation;
        this._angle          = (this._angle % 360);
        if (duration === 0) {
            this._angle = this._targetRotation;
        } else {
            this._spinDuration = duration;
        }
    };

    Game_Picture.prototype.spinRelative = function(targetRelativeRotation, duration) {
        this._angle = (this._angle % 360);
        this.spin(this._angle + targetRelativeRotation, duration);
    };

    Game_Picture.prototype.shake = function(power, speed, rotation, duration) {
        this.stopShake();
        this._shakePower     = power;
        this._shakeSpeed     = speed;
        this._shakeDuration  = duration;
        this._shakeRotation  = rotation * Math.PI / 180;
    };

    Game_Picture.prototype.stopShake = function() {
        this._shakeDirection = 1;
        this._shake          = 0;
    };

    var _Game_Picture_update      = Game_Picture.prototype.update;
    Game_Picture.prototype.update = function() {
        _Game_Picture_update.apply(this, arguments);
        this.updateSpin();
        this.updateShake();
    };

    Game_Picture.prototype.updateSpin = function() {
        if (this._spinDuration > 0) {
            var d       = this._spinDuration;
            this._angle = (this._angle * (d - 1) + this._targetRotation) / d;
            this._spinDuration--;
        }
    };

    Game_Picture.prototype.updateShake = function() {
        if (this._shakeDuration > 0 || this._shake !== 0) {
            const delta = (this._shakePower * this._shakeSpeed * this._shakeDirection) / 10;
            if (this._shakeDuration <= 1 && this._shake * (this._shake + delta) < 0) {
                this._shake = 0;
            } else {
                this._shake += delta;
            }
            if (this._shake > this._shakePower * 2) {
                this._shakeDirection = -1;
            }
            if (this._shake < -this._shakePower * 2) {
                this._shakeDirection = 1;
            }
            this._shakeDuration--;
        } else {
            this._shakeDuration = 0;
        }
    };

    Game_Picture.prototype.getShakeX = function() {
        return this._shake ? this._shake * Math.cos(this._shakeRotation) : 0;
    };

    Game_Picture.prototype.getShakeY = function() {
        return this._shake ? this._shake * Math.sin(this._shakeRotation) : 0;
    };
})();


code:
//=============================================================================
// Plugin_Name : Guts State
// File_Name   : RX_T_GutsState.js
// Version     : 1.01
// Copylight   : 2020 TYPE74RX-T
//=============================================================================

//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc You can create a state where your HP remains even if you take heavy, life-threatening damage.
 * @author TYPE74RX-T
 * @url https://w.atwiki.jp/type74rx-t/pages/221.html
 *
 * @param SystemWord in Notes1
 * @text System word
 * @desc System word to fill in the notes field
 * @default Guts
 *
 * @param SystemWord in Notes2
 * @text System word
 * @desc System word to fill in the notes field
 * @default SuperGuts
 *
 * @param SystemWord in Notes3
 * @text System word
 * @desc System word to fill in the notes field
 * @default RemoveGutsAtEndOfTurn
 *
 * @help Guts State
 *
 * This plugin is compatible with RPG Maker MV and RPG Maker MZ.
 *
 * ◆Summary
 * You can create a state where your HP remains even if you take damage
 * so large that your HP drops to 0.
 * It also allows you to keep a certain amount of HP even if you take a lot of
 * damage.
 * Applying this effect to an enemy's setting could make the enemy's behavior
 * even more varied.
 * Of course, you can also set up the actors, so try to find different ways to
 * use it.
 *
 * ◆Usage
 * Fill in the notes section of the states.
 * Example 1: If you want to create a state where your HP is at least 5% of
 * your maximum and you want to hold on at 1 HP even if you get hit by an
 * attack that reduces your HP to 0
 *
 * <Guts:5>
 *
 * Example 2: If you want to create a state where you can maintain HP at 70% of
 * maximum value even if you receive attack that reduces HP to less than 70% of
 * maximum value
 *
 * <SuperGuts:70>
 *
 * All numbers are percentages.
 * You can also put multiple guts states on it, so use it to your advantage.
 *
 * The state also has a once you have withstood an attack that reduces your
 * HP to 0, or an attack that reduces your HP to a specified value or less,
 * the state is immediately canceled, regardless of the condition for
 * canceling the state.
 * But, you can add the following setting to the guts state so that the state is
 * removed at the end of a turn that you hold on to(In TPB mode, when it's that
 * battler's turn after hold on).
 *
 * <RemoveGutsAtEndOfTurn>
 *
 * Guts (except for Super guts) is automatically removed when you reach a
 * lower HP than the value of guts you set, even if you don't hold on at 1 HP.
 * Removed states in any setting will not be revival even if HP is healed.
 *
 * ◆Caution
 * If you want to create more than one guts state, you must set them all to
 * different values.
 * If you set more than one state with the same number, it will not behave
 * correctly when you receive more than one of those states.
 *
 * ◆Notes
 * You don't need to worry about the plugin parameters.
 * It's just that the way you set up the notes field is different depending
 * on whether you are using the English or Japanese version.
 *
 * ◆License
 * This plugin is released under MIT license.
 * http://opensource.org/licenses/mit-license.php
*/
/*:ja
 * @target MV MZ
 * @plugindesc HPが0になるほどの大ダメージを受けてもHPが1残るステートを作成できます。
 * @author TYPE74RX-T
 * @url https://mdc-light.jpn.org/TYPE74RX-T/
 *
 * @param SystemWord in Notes1
 * @text システムワード
 * @desc メモ欄に記入するシステムワード
 * @default 根性
 *
 * @param SystemWord in Notes2
 * @text システムワード
 * @desc メモ欄に記入するシステムワード
 * @default 超根性
 *
 * @param SystemWord in Notes3
 * @text システムワード
 * @desc メモ欄に記入するシステムワード
 * @default 根性ターン解除
 *
 * @help 根性ステート
 *
 * このプラグインはRPGツクールMV、RPGツクールMZに対応しています。
 *
 * ◆概要
 * HPが0になるほどの大ダメージを受けてもHPが1残るステートを作成できます。
 * また、ある程度のダメージを受けても一定のHPをキープさせることもできます。
 * この効果を利用した敵キャラを作ると、敵キャラの行動に更なる変化を
 * 持たせられるでしょう。
 * もちろん、アクター側にも設定できるので使い方をいろいろ模索してみてください。
 *
 * ◆使い方
 * ステートのメモ欄に記入します。
 * 例１：HPが最大値の5%以上ある時、HPが0になる攻撃を受けても
 * HP1で踏ん張るステートを作る場合
 *
 * <根性:5>
 *
 * 例２：HPが最大値の70%以上ある時、HPが70%を下回る攻撃を受けても
 * HPが最大値の70%で踏ん張るステートを作る場合
 *
 * <超根性:70>
 *
 * 数値は全てパーセンテージです。
 * 複数の根性ステートを付けることもできるので、上手く利用しましょう。
 *
 * また、このステートは一度でも踏ん張った場合、ステートの解除条件に関係なく
 * 即座にステートが解除されますが、根性ステートに以下の設定を加えることで
 * 踏ん張ったターンの終了後に（TPBモード時は踏ん張った後、その踏ん張った
 * バトラーの順番が来た時）ステートが解除されるようになります。
 *
 * <根性ターン解除>
 *
 * 根性（超根性は除く）は、HP1で踏ん張らなくても設定した根性の値未満の
 * HPに達した時点で自動解除されます。
 * いずれの設定であっても解除されたステートは、HPが回復しても復活しません。
 *
 * 【ご注意】
 * 複数の根性ステートを作る場合は数値はすべて違うものにしてください。
 * 同じ数値のステートを複数設定すると、それらのステートを複数受けたときに
 * 正常な動作をしなくなります。
 *
 * 【備考】
 * プラグインのパラメータを気にする必要はありません。
 * ただ、日本語版か英語版かでメモ欄の設定方法が違うだけです。
 *
 * ◆ライセンス
 * このプラグインはMITライセンスで公開されています。
 * http://opensource.org/licenses/mit-license.php
*/
(() => {
    'use strict';
	//RX-T plugin parameters
	const parameters = PluginManager.parameters('RX_T_GutsState');
	const rx_guts = parameters['SystemWord in Notes1'];
	const rx_superGuts = parameters['SystemWord in Notes2'];
	const rx_turnRemGuts = parameters['SystemWord in Notes3'];

	//Game_Action

	const rx_t_gaehd200831_executeHpDamage = Game_Action.prototype.executeHpDamage;
	Game_Action.prototype.executeHpDamage = function(target, value) {
		target._rx_gutsHP = target.hp;
		target._rx_guts = target.rx_getGutsState();
		target._rx_damageGuts = value <= 0 ? 0 : value;
		rx_t_gaehd200831_executeHpDamage.call(this, target, value);
	};

	//Game_BattlerBase

	Game_BattlerBase.prototype.rx_getPsntHp = function(gutsId) {
		if (this._rx_guts === undefined) return 0;
		if (this._rx_guts[gutsId] === 0) return 0;
		return this._rx_guts[gutsId] * this.mhp / 100 | 0;
	}

	const rx_t_gbbsh200831_setHp = Game_BattlerBase.prototype.setHp;
	Game_BattlerBase.prototype.setHp = function(hp) {
		let rx_gutsPsntHP = this.rx_getPsntHp(0);
		let rx_spGutsPsntHP = this.rx_getPsntHp(1);
		const rx_gutsStateId = this._rx_gutsStates === undefined ? 0 : this._rx_gutsStates[String(this._rx_guts[0])];
		const rx_spGutsStateId = this._rx_spGutsStates === undefined ? 0 : this._rx_spGutsStates[String(this._rx_guts[1])];
		this._rx_turnRemoveGutsStateId = 0;
		//hpがrx_gutsPsntHP(HP最大値のthis._rx_guts[0]%以上)なら
		//ダメージ後HP0時、1残してステート解除
		if (this._rx_gutsHP >= rx_gutsPsntHP && hp <= 0 && this._rx_guts[0] > 0){
			hp = 1;
			if ($dataStates[rx_gutsStateId].meta[rx_turnRemGuts] === undefined){
				this.removeState(rx_gutsStateId);
			}else{
				this._rx_turnRemoveGutsStateId = rx_gutsStateId;
			}
		}
		//hpがrx_spGutsPsntHP(HP最大値のthis._rx_guts[1]%以上)なら
		//ダメージ後HPrx_spGutsPsntHP以下時、rx_spGutsPsntHP分残してステート解除
		if (this._rx_gutsHP >= rx_spGutsPsntHP && hp <= rx_spGutsPsntHP && this._rx_guts[1] > 0){
			hp = rx_spGutsPsntHP;
			if ($dataStates[rx_spGutsStateId].meta[rx_turnRemGuts] === undefined){
				this.removeState(rx_spGutsStateId);
			}else{
				this._rx_turnRemoveGutsStateId = rx_spGutsStateId;
			}
		}
		rx_t_gbbsh200831_setHp.call(this, hp);
	};

	//Game_Battler

	Game_Battler.prototype.rx_getGutsState = function() {
	    let rx_gutsPsnt = 0;
	    let rx_spGutsPsnt = 0;
	    let gutsPsnt = [];
	    let spGutsPsnt = [];
	    this._rx_gutsStates = {};
	    this._rx_spGutsStates = {};
	    this.states().forEach(function(state) {
	        if (state.meta[rx_guts] !== undefined){
	        	gutsPsnt.push(state.meta[rx_guts]);
	        	this._rx_gutsStates[String(state.meta[rx_guts])] = state.id;
	        }
	        if (state.meta[rx_superGuts] !== undefined){
	        	spGutsPsnt.push(state.meta[rx_superGuts]);
	        	this._rx_spGutsStates[String(state.meta[rx_superGuts])] = state.id;
	        }
	    }, this);
	    if (gutsPsnt.length > 0) rx_gutsPsnt = Math.max.apply(null, gutsPsnt);
	    if (spGutsPsnt.length > 0) rx_spGutsPsnt = Math.max.apply(null, spGutsPsnt);
	    return [rx_gutsPsnt, rx_spGutsPsnt];
	};

	const rx_t_gbrsa200901_removeStatesAuto = Game_Battler.prototype.removeStatesAuto;
	Game_Battler.prototype.removeStatesAuto = function(timing) {
	    rx_t_gbrsa200901_removeStatesAuto.call(this, timing);
	    for (const state of this.states()) {
			if(state.id === this._rx_turnRemoveGutsStateId && timing === 2) this.removeState(state.id);
	    }
	};

	//Window_BattleLog

	const rx_t_wbldhd200902_removeStatesAuto = Window_BattleLog.prototype.displayHpDamage;
	Window_BattleLog.prototype.displayHpDamage = function(target) {
	    rx_t_wbldhd200902_removeStatesAuto.call(this, target);
		let rx_gutsPsntHP = target.rx_getPsntHp(0);
		let rx_spGutsPsntHP = target.rx_getPsntHp(1);
		const rx_gutsStateId = target._rx_gutsStates === undefined ? 0 : target._rx_gutsStates[String(target._rx_guts[0])];
	    if (target.result().hpAffected) {
	    	if (target.hp < rx_gutsPsntHP && target.hp > 0 && target._rx_guts[0] > 0) {
	    		if ($dataStates[rx_gutsStateId].meta[rx_turnRemGuts] !== undefined) target.removeState(rx_gutsStateId);
	    	}
	    }
	};

})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// RewardPlusChange.js
//=============================================================================

/*:ja
 * @plugindesc ver1.00 戦闘終了時の取得経験値とお金を
 * 変数の値によって増減します。
 * @author まっつＵＰ
 *
 * @param expvar
 * @desc 取得経験値増減値(変数の値)
 * @type variable
 * @default 16
 *
 * @param goldvar
 * @desc 取得金増減値(変数の値)
 * @type variable
 * @default 16
 *
 * @help
 *
 * RPGで笑顔を・・・
 *
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 *
 * 戦闘終了時の取得経験値等を変数で増減することができます。
 * (元の取得経験値等に直接加算します。)
 *
 * なお、上記の計算は戦闘終了時のシステムが
 * このプラグインを除いたデフォルトのままであれば
 * 戦闘終了時に行われるのでそれまでに変数に値を設定してください。
 *
 * このプラグインは単体で動作しますが
 * 拙作のRewardRateChange.jsと併用することができます。
 * （変数を「比率」として取得経験値等を増減するものです。）
 * この場合、エディタのプラグインリスト上の適用順で
 * 経験値等の加算のタイミングを変えることができます。
 *
 * このプラグインよりも下にRewardRateChange.jsを
 * 適用した場合の取得経験値
 *
 * (元の経験値 + 加算) * 比率
 *
 * このプラグインよりも上にRewardRateChange.jsを
 * 適用した場合の取得経験値
 *
 * 元の経験値 * 比率 + 加算
 *
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 *
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 *
 */

(function() {

var parameters = PluginManager.parameters('RewardPlusChange');
var RPCexpvar = Number(parameters['expvar'] || 16);
var RPCgoldvar = Number(parameters['goldvar'] || 16);

var _Game_Troop_expTotal = Game_Troop.prototype.expTotal;
Game_Troop.prototype.expTotal = function() {
    return _Game_Troop_expTotal.call(this) + $gameVariables.value(RPCexpvar);
};

var _Game_Troop_goldTotal = Game_Troop.prototype.goldTotal;
Game_Troop.prototype.goldTotal = function() {
    return _Game_Troop_goldTotal.call(this) + $gameVariables.value(RPCgoldvar);
};

})();


code:
//=============================================================================
// RewardRateChange.js
//=============================================================================

/*:ja
 * @plugindesc ver1.01 戦闘終了時の取得経験値とお金を
 * 変数の値によって増減します。
 * @author まっつＵＰ
 *
 * @param expvar
 * @desc 取得経験値増減率(変数の値は百分率)
 * @type variable
 * @default 15
 *
 * @param goldvar
 * @desc 取得金増減率(変数の値は百分率)
 * @type variable
 * @default 15
 *
 * @param dropvar
 * @desc 拾得物増減率(変数の値は百分率)
 * @type variable
 * @default 15
 *
 * @help
 *
 * RPGで笑顔を・・・
 *
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 *
 * 戦闘終了時の取得経験値等の取得比率を変数で増減することができます。
 * ただし、変数の値が0の時は比率を100%として扱います。
 * 実際に比率を0として扱いたいときは変数の値を負の数にしてください。
 *
 * なお、上記の計算は戦闘終了時のシステムが
 * このプラグインを除いたデフォルトのままであれば
 * 戦闘終了時に行われるのでそれまでに変数に値を設定してください。
 *
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 *
 * ver1.01 他プラグインと共存処理
 *
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 *
 */

(function() {

var parameters = PluginManager.parameters('RewardRateChange');
var RRCexpvar = Number(parameters['expvar'] || 15);
var RRCgoldvar = Number(parameters['goldvar'] || 15);
var RRCdropvar = Number(parameters['dropvar'] || 15);

DataManager.RRCrate = function(id) {
    var rate = $gameVariables.value(id);
    if(rate > 0){
        return rate / 100;
    }else if(rate === 0){
        return 1;
    }else{
        return 0;
    }
};

var _Game_Enemy_dropItemRate = Game_Enemy.prototype.dropItemRate;
Game_Enemy.prototype.dropItemRate = function() {
    return _Game_Enemy_dropItemRate.call(this) * DataManager.RRCrate(RRCdropvar);
};

var _Game_Troop_expTotal = Game_Troop.prototype.expTotal;
Game_Troop.prototype.expTotal = function() {
    return Math.floor(_Game_Troop_expTotal.call(this) * DataManager.RRCrate(RRCexpvar));
};

var _Game_Troop_goldTotal = Game_Troop.prototype.goldTotal;
Game_Troop.prototype.goldTotal = function() {
    return Math.floor(_Game_Troop_goldTotal.call(this) * DataManager.RRCrate(RRCgoldvar));
};

})();