code:
//==============================================================================
// MpiGetMapImage
//==============================================================================

/*:
 * @plugindesc マップ全体を画像として出力します。
 * @author 奏ねこま（おとぶき ねこま）
 *
 * @param GetImageTrigger1
 * @desc マップを画像出力するトリガーを指定してください。
 * @default Input.isPressed('control') && Input.isTriggered('pageup')
 *
 * @param GetImageTrigger2
 * @desc マップを画像出力するトリガーを指定してください。（キャラクター表示OFF）
 * @default Input.isPressed('control') && Input.isTriggered('pagedown')
 *
 * @param OutputFolder
 * @desc 画像を出力するフォルダを指定してください。
 * @default output
 *
 * @param TestModeOnly
 * @desc テスト時のみ有効にする場合は true を指定してください。
 * @default true
 *
 * @help
 * [説明]
 * マップ全体をPNG画像として出力します。
 *
 * [使用方法]
 * プラグインパラメータのGetImageTrigger1またはGetImageTrigger2で指定した条件が
 * 成立した瞬間のマップ全体の画像を、PNG画像に出力します。
 * GetImageTrigger1とGetImageTrigger2のデフォルト設定は、以下のような意味です。
 *
 * GetImageTrigger1
 *  Input.isPressed('control') && Input.isTriggered('pageup')
 *  Ctrlキー（またはAltキー）を押しながら、PageUpキーが押された瞬間。
 *
 * GetImageTrigger2
 *  Input.isPressed('control') && Input.isTriggered('pagedown')
 *  Ctrlキー（またはAltキー）を押しながら、PageDownキーが押された瞬間。
 *
 * [利用規約] ..................................................................
 *  - 本プラグインの利用は、RPGツクールMV/RPGMakerMVの正規ユーザーに限られます。
 *  - 商用、非商用、有償、無償、一般向け、成人向けを問わず、利用可能です。
 *  - 利用の際、連絡や報告は必要ありません。また、製作者名の記載等も不要です。
 *  - プラグインを導入した作品に同梱する形以外での再配布、転載はご遠慮ください。
 *  - 本プラグインにより生じたいかなる問題についても、一切の責任を負いかねます。
 * [改訂履歴] ..................................................................
 *   Version 1.00  2017/05/28  First edition.
 * -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
 *  Web Site: http://makonet.sakura.ne.jp/rpg_tkool/
 *  Twitter : https://twitter.com/koma_neko
 *  Copylight (c) 2017 Nekoma Otobuki
 */

var Imported = Imported || {};
var Makonet = Makonet || {};

(function(){
    'use strict';

    var plugin = 'MpiGetMapImage';

    Imported[plugin] = true;
    Makonet[plugin] = {};

    var $mpi = Makonet[plugin];
    $mpi.parameters = PluginManager.parameters(plugin);

    $mpi.getImageTrigger1 = $mpi.parameters['GetImageTrigger1'];
    $mpi.getImageTrigger2 = $mpi.parameters['GetImageTrigger2'];
    $mpi.outputFolder     = $mpi.parameters['OutputFolder'];
    $mpi.testModeOnly     = $mpi.parameters['TestModeOnly'].toLowerCase() === 'true';

    var _ = plugin;
    var $_ = `$${_}`;

    //==============================================================================
    // Private Methods
    //==============================================================================

    function getMapImage() {
        var mapWidth = $gameMap.width();
        var mapHeight = $gameMap.height();
        var screenWidth = Math.floor(Graphics.width / $gameMap.tileWidth());
        var screenHeight = Math.floor(Graphics.height / $gameMap.tileHeight());
        var screenPixcelWidth = screenWidth * $gameMap.tileWidth();
        var screenPixcelHeight = screenHeight * $gameMap.tileHeight();
        var rows = Math.ceil(mapWidth / screenWidth);
        var columns = Math.ceil(mapHeight / screenHeight);
        var displayX = $gameMap.displayX();
        var displayY = $gameMap.displayY();
        var mapBitmap = new Bitmap(mapWidth * $gameMap.tileWidth(), mapHeight * $gameMap.tileHeight());
        for (var i = 0; i < rows; i++) {
            for (var j = 0; j < columns; j++) {
                $gameMap._displayX = i * screenWidth;
                $gameMap._displayY = j * screenHeight;
                SceneManager._scene._spriteset.update();
                Graphics._renderer.render(SceneManager._scene);
                var bitmap = Bitmap.snap(SceneManager._scene);
                mapBitmap.blt(bitmap, 0, 0, screenPixcelWidth, screenPixcelHeight, screenPixcelWidth * i, screenPixcelHeight * j, screenPixcelWidth, screenPixcelHeight);
            }
        }
        $gameMap._displayX = displayX;
        $gameMap._displayY = displayY;
        SceneManager._scene._spriteset.update();
        Graphics._renderer.render(SceneManager._scene);
        return mapBitmap;
    }

    function getDateString() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        var hours = date.getHours();
        var minutes = date.getMinutes();
        var seconds = date.getSeconds();
        return year + month.padZero(2) + day.padZero(2) + hours.padZero(2) + minutes.padZero(2) + seconds.padZero(2);
    }

    function outputMapImage(bitmap) {
        var fs = require('fs');
        var path = StorageManager.localFileDirectoryPath().replace(/save[\\/]$/, '');
        var folder = path + $mpi.outputFolder;
        if (!fs.existsSync(folder)) {
            fs.mkdirSync(folder);
        }
        var file = folder + '\\Map' + $gameMap.mapId().padZero(3) + '_' + getDateString() + '.png';
        var data = bitmap._canvas.toDataURL('img/png').replace(/^.*,/, '');
        var buffer = new Buffer(data, 'base64');
        fs.writeFileSync(file, buffer);
    }

    function showCharacters() {
        for (var i = 0; i < this._characterSprites.length; i++) {
            var sprite = this._characterSprites[i];
            if (!sprite.isTile()) {
                sprite.show();
            }
        }
    };

    //==============================================================================
    // Scene_Map
    //==============================================================================

    (function(o,p){
        var f=o[p];o[p]=function(){
            if (Utils.isOptionValid('test') || !$mpi.testModeOnly) {
                var trigger1 = !!eval($mpi.getImageTrigger1);
                var trigger2 = !!eval($mpi.getImageTrigger2);
                if (trigger1 || trigger2) {
                    var mapImage = null;
                    if (trigger1) {
                        mapImage = getMapImage();
                    }
                    if (trigger2) {
                        this._spriteset.hideCharacters();
                        mapImage = getMapImage();
                        showCharacters.call(this._spriteset);
                    }
                    if (mapImage) {
                        outputMapImage(mapImage);
                    }
                }
            }
            f.apply(this,arguments);
        };
    }(Scene_Map.prototype,'update'));
}());


code:
//=============================================================================
// NRP_AudioManager.js
//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc v1.02 Manage audio files.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @url http://newrpg.seesaa.net/article/483999181.html
 *
 * @help Manage audio files.
 *
 * -------------------------------------------------------------------
 * [Functions]
 * -------------------------------------------------------------------
 * ◆Change Current BGM Setting (Plugin command for MZ)
 * The volume, pitch, and pan of the currently playing BGM
 * can be changed by plugin command.
 *
 * Unlike RPG Maker command, there is no need to specify a file name,
 * which allows for a greater degree of freedom.
 * For example, it is possible to lower the volume of the BGM
 * when a special skill is activated.
 *
 * Also, the current playing position
 * is maintained when the pitch is changed.
 *
 * ◆Audio Alias Function
 * For example, if you want to set the boss battle music in Maker,
 * you may use the "Change Battle BGM" command
 * to set the boss battle music, and then change it back
 * to the normal battle music after the battle.
 *
 * The problem is if you then want to change
 * the boss battle music or normal battle music.
 * The operation needs to be changed for all boss battle events.
 *
 * If you set up a dummy file in advance,
 * you can replace that song with another file.
 * You will not have to bother to change all the event commands.
 *
 * Also, if you want to change the normal battle music
 * from the second half of the game,
 * you can branch it by means of a switch.
 *
 * ◆Audio Adjustment Function
 * For example, when playing an ogg file imported as material,
 * the volume is sometimes out of balance with other materials.
 * There is a way to adjust the volume every time you play,
 * but it is difficult if you want to change it later.
 *
 * If you use this plug-in to set the volume in such cases,
 * you will not have to set it every time you play.
 * In particular, you can set the volume to over 100,
 * which is normally impossible.
 *
 * You can also change the start point of BGM and BGS.
 * You can eliminate unnatural space by moving back
 * the start point of ogg that contain long space at the beginning.
 *
 * ※If you use this function together with the Audio Alias Function,
 *   please set it for the file after the replacement.
 *
 * -------------------------------------------------------------------
 * [Terms]
 * -------------------------------------------------------------------
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but will deal with defects to the extent possible.
 *
 * @-----------------------------------------------------
 * @ [Plugin Commands]
 * @-----------------------------------------------------
 *
 * @command ChangeCurrentBgmSetting
 * @desc Changes the volume, pitch, and pan of the currently playing BGM.
 *
 * @arg Volume
 * @type number
 * @max 400
 * @default 90
 * @desc The volume of the BGM.
 * 90 is the default value.
 *
 * @arg Pitch
 * @type number
 * @default 100
 * @desc The pitch of the BGM.
 * 100 is the default value.
 *
 * @arg Pan
 * @type number
 * @max 100 @min -100
 * @default 0
 * @desc The pan of the BGM.
 * 0 is the default value.
 *
 * @-----------------------------------------------------
 * @ [Plugin Parameters]
 * @-----------------------------------------------------
 *
 * @param <BGM>
 *
 * @param BgmSettings
 * @parent <BGM>
 * @type struct<BgmSetting>[]
 * @desc Set the volume and other settings for each BGM file.
 *
 * @param BgmAliases
 * @parent <BGM>
 * @type struct<BgmAlias>[]
 * @desc Replaces the BGM file and plays it.
 * The higher the setting, the higher the priority.
 *
 * @param <BGS>
 *
 * @param BgsSettings
 * @parent <BGS>
 * @type struct<BgsSetting>[]
 * @desc Set the volume and other settings for each BGS file.
 *
 * @param BgsAliases
 * @parent <BGS>
 * @type struct<BgsAlias>[]
 * @desc Replaces the BGS file and plays it.
 * The higher the setting, the higher the priority.
 *
 * @param <ME>
 *
 * @param MeSettings
 * @parent <ME>
 * @type struct<MeSetting>[]
 * @desc Set the volume and other settings for each ME file.
 *
 * @param MeAliases
 * @parent <ME>
 * @type struct<MeAlias>[]
 * @desc Replaces the ME file and plays it.
 * The higher the setting, the higher the priority.
 *
 * @param <SE>
 *
 * @param SeSettings
 * @parent <SE>
 * @type struct<SeSetting>[]
 * @desc Set the volume and other settings for each SE file.
 *
 * @param SeAliases
 * @parent <SE>
 * @type struct<SeAlias>[]
 * @desc Replaces the SE file and plays it.
 * The higher the setting, the higher the priority.
 */

/*~struct~BgmSetting:
 * @param Name
 * @type file
 * @dir audio/bgm
 * @desc File name of the BGM.
 *
 * @param Volume
 * @type number
 * @max 400
 * @default 100
 * @desc The volume of the BGM.
 * Set the value based on 100.
 *
 * @param Pitch
 * @type number
 * @desc The pitch of the BGM.
 * Set the value based on 100.
 *
 * @param Pan
 * @type number
 * @max 100 @min -100
 * @desc The pan of the BGM.
 * Set the value based on 0.
 *
 * @param Pos
 * @type number
 * @max 999 @decimals 2
 * @desc The starting point of the BGM (in seconds).
 */

/*~struct~BgmAlias:
 * @param FromFileName
 * @type file
 * @dir audio/bgm
 * @desc The file name before the replacement.
 *
 * @param ToFileName
 * @type file
 * @dir audio/bgm
 * @desc The file name after the replacement.
 *
 * @param Switch
 * @type switch
 * @desc This switch is used to enable the replacement setting.
 */

/*~struct~BgsSetting:
 * @param Name
 * @type file
 * @dir audio/bgs
 * @desc File name of the BGS.
 *
 * @param Volume
 * @type number
 * @max 400
 * @default 100
 * @desc The volume of the BGS.
 * Set the value based on 100.
 *
 * @param Pitch
 * @type number
 * @desc The pitch of the BGS.
 * Set the value based on 100.
 *
 * @param Pan
 * @type number
 * @max 100 @min -100
 * @desc The pan of the BGS.
 * Set the value based on 0.
 *
 * @param Pos
 * @type number
 * @max 999 @decimals 2
 * @desc The starting point of the BGS (in seconds).
 */

/*~struct~BgsAlias:
 * @param FromFileName
 * @type file
 * @dir audio/bgs
 * @desc The file name before the replacement.
 *
 * @param ToFileName
 * @type file
 * @dir audio/bgs
 * @desc The file name after the replacement.
 *
 * @param Switch
 * @type switch
 * @desc This switch is used to enable the replacement setting.
 */

/*~struct~MeSetting:
 * @param Name
 * @type file
 * @dir audio/me
 * @desc File name of the ME.
 *
 * @param Volume
 * @type number
 * @max 400
 * @default 100
 * @desc The volume of the ME.
 * Set the value based on 100.
 *
 * @param Pitch
 * @type number
 * @desc The pitch of the ME.
 * Set the value based on 100.
 *
 * @param Pan
 * @type number
 * @max 100 @min -100
 * @desc The pan of the ME.
 * Set the value based on 0.
 */

/*~struct~MeAlias:
 * @param FromFileName
 * @type file
 * @dir audio/me
 * @desc The file name before the replacement.
 *
 * @param ToFileName
 * @type file
 * @dir audio/me
 * @desc The file name after the replacement.
 *
 * @param Switch
 * @type switch
 * @desc This switch is used to enable the replacement setting.
 */

/*~struct~SeSetting:
 * @param Name
 * @type file
 * @dir audio/se
 * @desc File name of the SE.
 *
 * @param Volume
 * @type number
 * @max 400
 * @default 100
 * @desc The volume of the SE.
 * Set the value based on 100.
 *
 * @param Pitch
 * @type number
 * @desc The pitch of the SE.
 * Set the value based on 100.
 *
 * @param Pan
 * @type number
 * @max 100 @min -100
 * @desc The pan of the SE.
 * Set the value based on 0.
 */

/*~struct~SeAlias:
 * @param FromFileName
 * @type file
 * @dir audio/se
 * @desc The file name before the replacement.
 *
 * @param ToFileName
 * @type file
 * @dir audio/se
 * @desc The file name after the replacement.
 *
 * @param Switch
 * @type switch
 * @desc This switch is used to enable the replacement setting.
 */

/*:ja
 * @target MV MZ
 * @plugindesc v1.02 音声ファイルの管理を行う。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @url http://newrpg.seesaa.net/article/483999181.html
 *
 * @help 音声ファイルの管理を行います。
 *
 * -------------------------------------------------------------------
 * ■機能
 * -------------------------------------------------------------------
 * ◆現在のＢＧＭ設定を変更（ＭＺ用プラグインコマンド）
 * 現在演奏中のＢＧＭの音量やピッチ、位相を
 * プラグインコマンドによって変更できます。
 *
 * ツクールのコマンドと異なりファイル名を指定する必要がないため、
 * 自由度のある操作が可能になります。
 * 例えば、大技の発動時にＢＧＭの音量を下げるなどの演出が可能です。
 *
 * また、ピッチ変更時も現在の演奏位置が維持されます。
 *
 * ◆音声置換機能
 * 例えば、ツクールでボス戦曲を設定する場合、
 * 『戦闘ＢＧＭの変更』コマンドによって、
 * ボス戦曲を設定し、戦闘後に通常戦闘曲に戻す
 * というような操作を行うかと思います。
 *
 * 問題はその後、ボス戦曲や通常戦闘曲を変更したくなった場合です。
 * 全てのボス戦イベントに対して変更を行う必要があります。
 *
 * このプラグインではあらかじめダミーのファイルを設定しておけば、
 * その曲を設定したファイルへ置換して演奏することが可能です。
 * いちいち全てのイベントを変更する必要がなくなります。
 *
 * また、ゲーム後半は通常戦闘曲を変更したいという場合は、
 * スイッチによって分岐させることもできます。
 *
 * ◆音声調整機能
 * 例えば、素材として取り込んだoggファイルを演奏する場合、
 * 他の素材と音量の釣り合いが取れてないことが時々あります。
 * 演奏時にいちいち音量を調整する方法もありますが、
 * 後で変更したくなった場合が大変です。
 *
 * そんな時にこのプラグインで音量を設定してしまえば、
 * 演奏毎に設定する必要がなくなります。
 * 特に通常は不可能な100以上の音量も設定可能です。
 *
 * また、ＢＧＭやＢＧＳの開始時点を変更できます。
 * 先頭に長めの空白が含まれているoggの開始時点を後ろにすれば、
 * 不自然な空白をなくすことができます。
 *
 * ※音声置換機能と併用する場合は、
 * 　置換後のファイルに対して設定してください。
 *
 * -------------------------------------------------------------------
 * ■利用規約
 * -------------------------------------------------------------------
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @-----------------------------------------------------
 * @ プラグインコマンド
 * @-----------------------------------------------------
 *
 * @command ChangeCurrentBgmSetting
 * @text 現在のＢＧＭ設定を変更
 * @desc 現在演奏中のＢＧＭの音量やピッチ、位相を変更します。
 *
 * @arg Volume
 * @text 音量
 * @type number
 * @max 400
 * @default 90
 * @desc ＢＧＭの音量です。
 * 90が初期値です。
 *
 * @arg Pitch
 * @text ピッチ
 * @type number
 * @default 100
 * @desc ＢＧＭのピッチです。
 * 100が初期値です。
 *
 * @arg Pan
 * @text 位相
 * @type number
 * @max 100 @min -100
 * @default 0
 * @desc ＢＧＭの位相です。
 * 0が初期値です。
 *
 * @-----------------------------------------------------
 * @ プラグインパラメータ
 * @-----------------------------------------------------
 *
 * @param <BGM>
 * @text ＜ＢＧＭ＞
 *
 * @param BgmSettings
 * @parent <BGM>
 * @text ＢＧＭ設定
 * @type struct<BgmSetting>[]
 * @desc ＢＧＭファイル毎に音量などの設定を行います。
 *
 * @param BgmAliases
 * @parent <BGM>
 * @text ＢＧＭ置換設定
 * @type struct<BgmAlias>[]
 * @desc ＢＧＭファイルを置換して演奏します。
 * 上の設定ほど優先されます。
 *
 * @param <BGS>
 * @text ＜ＢＧＳ＞
 *
 * @param BgsSettings
 * @parent <BGS>
 * @text ＢＧＳ設定
 * @type struct<BgsSetting>[]
 * @desc ＢＧＳファイル毎に音量などの設定を行います。
 *
 * @param BgsAliases
 * @parent <BGS>
 * @text ＢＧＳ置換設定
 * @type struct<BgsAlias>[]
 * @desc ＢＧＳファイルを置換して演奏します。
 * 上の設定ほど優先されます。
 *
 * @param <ME>
 * @text ＜ＭＥ＞
 *
 * @param MeSettings
 * @parent <ME>
 * @text ＭＥ設定
 * @type struct<MeSetting>[]
 * @desc ＭＥファイル毎に音量などの設定を行います。
 *
 * @param MeAliases
 * @parent <ME>
 * @text ＭＥ置換設定
 * @type struct<MeAlias>[]
 * @desc ＭＥファイルを置換して演奏します。
 * 上の設定ほど優先されます。
 *
 * @param <SE>
 * @text ＜ＳＥ＞
 *
 * @param SeSettings
 * @parent <SE>
 * @text ＳＥ設定
 * @type struct<SeSetting>[]
 * @desc ＳＥファイル毎に音量などの設定を行います。
 *
 * @param SeAliases
 * @parent <SE>
 * @text ＳＥ置換設定
 * @type struct<SeAlias>[]
 * @desc ＳＥファイルを置換して演奏します。
 * 上の設定ほど優先されます。
 */

/*~struct~BgmSetting:ja
 * @param Name
 * @text ファイル名
 * @type file
 * @dir audio/bgm
 * @desc ＢＧＭのファイル名です。
 *
 * @param Volume
 * @text 音量
 * @type number
 * @max 400
 * @default 100
 * @desc ＢＧＭの音量です。
 * 100を基準に設定してください。
 *
 * @param Pitch
 * @text ピッチ
 * @type number
 * @desc ＢＧＭのピッチです。
 * 100を基準に設定してください。
 *
 * @param Pan
 * @text 位相
 * @type number
 * @max 100 @min -100
 * @desc ＢＧＭの位相です。
 * 0を基準に設定してください。
 *
 * @param Pos
 * @text 開始位置
 * @type number
 * @max 999 @decimals 2
 * @desc ＢＧＭの開始位置（秒）です。
 */

/*~struct~BgmAlias:ja
 * @param FromFileName
 * @text 置換元のファイル名
 * @type file
 * @dir audio/bgm
 * @desc 置換元のファイル名です。
 *
 * @param ToFileName
 * @text 置換先のファイル名
 * @type file
 * @dir audio/bgm
 * @desc 置換先のファイル名です。
 *
 * @param Switch
 * @text スイッチ
 * @type switch
 * @desc 置換設定を有効にするスイッチです。
 */

/*~struct~BgsSetting:ja
 * @param Name
 * @text ファイル名
 * @type file
 * @dir audio/bgs
 * @desc ＢＧＳのファイル名です。
 *
 * @param Volume
 * @text 音量
 * @type number
 * @max 400
 * @default 100
 * @desc ＢＧＳの音量です。
 * 100を基準に設定してください。
 *
 * @param Pitch
 * @text ピッチ
 * @type number
 * @desc ＢＧＳのピッチです。
 * 100を基準に設定してください。
 *
 * @param Pan
 * @text 位相
 * @type number
 * @max 100 @min -100
 * @desc ＢＧＳの位相です。
 * 0を基準に設定してください。
 *
 * @param Pos
 * @text 開始位置
 * @type number
 * @max 999 @decimals 2
 * @desc ＢＧＳの開始位置（秒）です。
 */

/*~struct~BgsAlias:ja
 * @param FromFileName
 * @text 置換元のファイル名
 * @type file
 * @dir audio/bgs
 * @desc 置換元のファイル名です。
 *
 * @param ToFileName
 * @text 置換先のファイル名
 * @type file
 * @dir audio/bgs
 * @desc 置換先のファイル名です。
 *
 * @param Switch
 * @text スイッチ
 * @type switch
 * @desc 置換設定を有効にするスイッチです。
 */

/*~struct~MeSetting:ja
 * @param Name
 * @text ファイル名
 * @type file
 * @dir audio/me
 * @desc ＭＥのファイル名です。
 *
 * @param Volume
 * @text 音量
 * @type number
 * @max 400
 * @default 100
 * @desc ＭＥの音量です。
 * 100を基準に設定してください。
 *
 * @param Pitch
 * @text ピッチ
 * @type number
 * @desc ＭＥのピッチです。
 * 100を基準に設定してください。
 *
 * @param Pan
 * @text 位相
 * @type number
 * @max 100 @min -100
 * @desc ＭＥの位相です。
 * 0を基準に設定してください。
 */

/*~struct~MeAlias:ja
 * @param FromFileName
 * @text 置換元のファイル名
 * @type file
 * @dir audio/me
 * @desc 置換元のファイル名です。
 *
 * @param ToFileName
 * @text 置換先のファイル名
 * @type file
 * @dir audio/me
 * @desc 置換先のファイル名です。
 *
 * @param Switch
 * @text スイッチ
 * @type switch
 * @desc 置換設定を有効にするスイッチです。
 */

/*~struct~SeSetting:ja
 * @param Name
 * @text ファイル名
 * @type file
 * @dir audio/se
 * @desc ＳＥのファイル名です。
 *
 * @param Volume
 * @text 音量
 * @type number
 * @max 400
 * @default 100
 * @desc ＳＥの音量です。
 * 100を基準に設定してください。
 *
 * @param Pitch
 * @text ピッチ
 * @type number
 * @desc ＳＥのピッチです。
 * 100を基準に設定してください。
 *
 * @param Pan
 * @text 位相
 * @type number
 * @max 100 @min -100
 * @desc ＳＥの位相です。
 * 0を基準に設定してください。
 */

/*~struct~SeAlias:ja
 * @param FromFileName
 * @text 置換元のファイル名
 * @type file
 * @dir audio/se
 * @desc 置換元のファイル名です。
 *
 * @param ToFileName
 * @text 置換先のファイル名
 * @type file
 * @dir audio/se
 * @desc 置換先のファイル名です。
 *
 * @param Switch
 * @text スイッチ
 * @type switch
 * @desc 置換設定を有効にするスイッチです。
 */

(function() {
"use strict";

function toBoolean(str, def) {
    if (str === true || str === "true") {
        return true;
    } else if (str === false || str === "false") {
        return false;
    }
    return def;
}
function toNumber(str, def) {
    if (str == undefined || str == "") {
        return def;
    }
    return isNaN(str) ? def : +(str || def);
}

/**
 * ●構造体（二重配列）をJSで扱えるように変換
 */
function parseStruct2(arg) {
    const ret = [];
    if (arg) {
        for (const str of JSON.parse(arg)) {
            ret.push(JSON.parse(str));
        }
    }
    return ret;
}

const PLUGIN_NAME = "NRP_AudioManager";
const parameters = PluginManager.parameters(PLUGIN_NAME);
const pBgmSettings = parseStruct2(parameters["BgmSettings"]);
const pBgmAliases = parseStruct2(parameters["BgmAliases"]);
const pBgsSettings = parseStruct2(parameters["BgsSettings"]);
const pBgsAliases = parseStruct2(parameters["BgsAliases"]);
const pMeSettings = parseStruct2(parameters["MeSettings"]);
const pMeAliases = parseStruct2(parameters["MeAliases"]);
const pSeSettings = parseStruct2(parameters["SeSettings"]);
const pSeAliases = parseStruct2(parameters["SeAliases"]);

//-----------------------------------------------------------------------------
// ＭＺ用プラグインコマンド
//-----------------------------------------------------------------------------

// MVには存在しないため、空で定義しておかないとエラーになる。
if (!PluginManager.registerCommand) {
    PluginManager.registerCommand = function() {}
}

/**
 * ●現在のＢＧＭ設定を変更
 */
PluginManager.registerCommand(PLUGIN_NAME, "ChangeCurrentBgmSetting", function(args) {
    // 現在演奏中のＢＧＭ情報を引き継ぎ
    const bgmData = AudioManager.saveBgm();

    const volume = toNumber(args.Volume);
    if (volume != null) {
        bgmData.volume = volume;
    }

    const pitch = toNumber(args.Pitch);
    if (pitch != null) {
        bgmData.pitch = pitch;
    }

    const pan = toNumber(args.Pan);
    if (pan != null) {
        bgmData.pan = pan;
    }

    // 変更した情報を反映
    AudioManager.updateBgmParameters(bgmData);
    AudioManager._bgmBuffer.play(true, bgmData.pos);
    AudioManager.updateCurrentBgm(bgmData, bgmData.pos);
});

//----------------------------------------
// ＢＧＭ
//----------------------------------------

/**
 * ●ＢＧＭ演奏
 */
const _AudioManager_playBgm = AudioManager.playBgm;
AudioManager.playBgm = function(bgm, pos) {
    // nullの場合はそのまま
    if (!bgm) {
        _AudioManager_playBgm.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newBgm = {...bgm};
    // 別名があれば変換
    const aliasName = getAlias(newBgm, pBgmAliases);
    if (aliasName) {
        newBgm.name = aliasName;
    }

    // 開始位置を調整
    if (!pos) {
        pos = getAudioPos(newBgm, pBgmSettings);
    }

    _AudioManager_playBgm.call(this, newBgm, pos);
};

/**
 * ●ＢＧＭのパラメータ更新
 */
const _AudioManager_updateBgmParameters = AudioManager.updateBgmParameters;
AudioManager.updateBgmParameters = function(bgm) {
    // nullの場合はそのまま
    if (!bgm) {
        _AudioManager_updateBgmParameters.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newBgm = {...bgm};
    // 設定を取得してnewBgmに保持
    setAudioAdjust(newBgm, pBgmSettings);

    _AudioManager_updateBgmParameters.call(this, newBgm);
};

/**
 * ●現在ＢＧＭかどうかの判定
 */
const _AudioManager_isCurrentBgm = AudioManager.isCurrentBgm;
AudioManager.isCurrentBgm = function(bgm) {
    const ret = _AudioManager_isCurrentBgm.apply(this, arguments);
    if (ret) {
        return ret;
    }

    //------------------------------------
    // falseの場合はさらに判定追加
    //------------------------------------
    // 別名があれば変換
    const aliasName = getAlias(bgm, pBgmAliases);

    return (
        this._currentBgm &&
        this._bgmBuffer &&
        this._currentBgm.name === aliasName
    );
};

//----------------------------------------
// ＢＧＳ
//----------------------------------------

/**
 * ●ＢＧＳ演奏
 */
const _AudioManager_playBgs = AudioManager.playBgs;
AudioManager.playBgs = function(bgs, pos) {
    // nullの場合はそのまま
    if (!bgs) {
        _AudioManager_playBgs.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newBgs = {...bgs};
    // 別名があれば変換
    const aliasName = getAlias(newBgs, pBgsAliases);
    if (aliasName) {
        newBgs.name = aliasName;
    }

    // 開始位置を調整
    if (!pos) {
        pos = getAudioPos(newBgs, pBgsSettings);
    }

    _AudioManager_playBgs.call(this, newBgs, pos);
};

/**
 * ●ＢＧＳのパラメータ更新
 */
const _AudioManager_updateBgsParameters = AudioManager.updateBgsParameters;
AudioManager.updateBgsParameters = function(bgs) {
    // nullの場合はそのまま
    if (!bgs) {
        _AudioManager_updateBgsParameters.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newBgs = {...bgs};
    // 設定を取得してnewBgsに保持
    setAudioAdjust(newBgs, pBgsSettings);

    _AudioManager_updateBgsParameters.call(this, newBgs);
};

/**
 * ●現在ＢＧＳかどうかの判定
 */
const _AudioManager_isCurrentBgs = AudioManager.isCurrentBgs;
AudioManager.isCurrentBgs = function(bgs) {
    const ret = _AudioManager_isCurrentBgs.apply(this, arguments);
    if (ret) {
        return ret;
    }

    //------------------------------------
    // falseの場合はさらに判定追加
    //------------------------------------
    // 別名があれば変換
    const aliasName = getAlias(bgs, pBgsAliases);

    return (
        this._currentBgs &&
        this._bgsBuffer &&
        this._currentBgs.name === aliasName
    );
};

//----------------------------------------
// ＭＥ
//----------------------------------------

/**
 * ●ＭＥ演奏
 */
const _AudioManager_playMe = AudioManager.playMe;
AudioManager.playMe = function(me) {
    // nullの場合はそのまま
    if (!me) {
        _AudioManager_playMe.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newMe = {...me};
    // 別名があれば変換
    const aliasName = getAlias(newMe, pMeAliases);
    if (aliasName) {
        newMe.name = aliasName;
    }

    _AudioManager_playMe.call(this, newMe);
};

/**
 * ●ＭＥのパラメータ更新
 */
const _AudioManager_updateMeParameters = AudioManager.updateMeParameters;
AudioManager.updateMeParameters = function(me) {
    // nullの場合はそのまま
    if (!me) {
        _AudioManager_updateMeParameters.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newMe = {...me};
    // 設定を取得してnewMeに保持
    setAudioAdjust(newMe, pMeSettings);

    _AudioManager_updateMeParameters.call(this, newMe);
};

//----------------------------------------
// ＳＥ
//----------------------------------------

/**
 * ●ＳＥ演奏
 */
const _AudioManager_playSe = AudioManager.playSe;
AudioManager.playSe = function(se) {
    // nullの場合はそのまま
    if (!se) {
        _AudioManager_playSe.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newSe = {...se};
    // 別名があれば変換
    const aliasName = getAlias(newSe, pSeAliases);
    if (aliasName) {
        newSe.name = aliasName;
    }

    _AudioManager_playSe.call(this, newSe);
};

/**
 * ●ＳＥのパラメータ更新
 */
const _AudioManager_updateSeParameters = AudioManager.updateSeParameters;
AudioManager.updateSeParameters = function(buffer, se) {
    // nullの場合はそのまま
    if (!se) {
        _AudioManager_updateSeParameters.apply(this, arguments);
        return;
    }

    // ディープコピーする。
    const newSe = {...se};
    // 設定を取得してnewSeに保持
    setAudioAdjust(newSe, pSeSettings);

    _AudioManager_updateSeParameters.call(this, buffer, newSe);
};

//----------------------------------------
// 共通処理
//----------------------------------------

/**
 * ●別名を取得する。
 */
function getAlias(audio, aliases) {
    // 別名が存在した場合はそちらを返す。
    const alias = aliases.find(alias => isValidAlias(audio, alias));
    if (alias) {
        return alias.ToFileName;
    }
    return undefined;
}

/**
 * ●有効な別名かどうか？
 */
function isValidAlias(audio, alias) {
    // ファイル名が一致している。
    if (alias.FromFileName == audio.name) {
        const aliasSwitch = toNumber(alias.Switch);
        // スイッチの設定がなければ有効
        if (!aliasSwitch) {
            return true;
        }
        // スイッチがオンならば有効
        return $gameSwitches.value(aliasSwitch);
    }
    // それ以外は無効
    return false;
}

/**
 * ●音声に調整設定を保持。
 */
function setAudioAdjust(audio, settings) {
    // 一致するファイルが存在すれば取得
    const setting = settings.find(setting => setting.Name == audio.name);
    // 設定がなければ処理しない。
    if (!setting) {
        return;
    }

    const adjustVolume = toNumber(setting.Volume);
    const adjustPitch = toNumber(setting.Pitch);
    const adjustPan = toNumber(setting.Pan);

    if (adjustVolume != undefined) {
        audio.volume = audio.volume * adjustVolume / 100;
    }
    if (adjustPitch != undefined) {
        audio.pitch = audio.pitch * adjustPitch / 100;
    }
    if (adjustPan != undefined) {
        audio.pan = audio.pan + adjustPan;
    }
}

/**
 * ●音声の開始位置を取得。
 */
function getAudioPos(audio, settings) {
    // 一致するファイルが存在すれば取得
    const setting = settings.find(setting => setting.Name == audio.name);
    // 設定がなければ処理しない。
    if (!setting) {
        return;
    }

    const adjustPos = toNumber(setting.Pos);

    if (adjustPos != undefined) {
        return adjustPos;
    }
    return undefined;
}

})();

repo_name: onms/sister

license: unknown


code:
//=============================================================================
// NRP_BattleParallelCommon.js
//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc v1.022 Enables parallel common events, even during battle.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @url http://newrpg.seesaa.net/article/477740800.html
 *
 * @help Enables parallel common events, even during battle
 * Register the target common events in the plugin parameter.
 * If the configured switch is on at that time, it will be executed in parallel.
 *
 * Conversely, you can also disable registered common events on the map.
 *
 * [Terms]
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but we will respond to defects as far as possible.
 *
 * @param commonEventsWhiteList
 * @type common_event[]
 * @default []
 * @desc Register a parallel common event to be enabled in battle.
 *
 * @param invalidOnMap
 * @type boolean
 * @default false
 * @desc Disables registered parallel common events on the map.
 *
 * @param validAllCommon
 * @type boolean
 * @default false
 * @desc Enables parallel common events in battle.
 * The above registration common events will be meaningless.
 *
 * @param alwaysMonitorChange
 * @type boolean
 * @default false
 * @desc It always monitors changes in variables and switches.
 * It can handle variable operations by external plugins.
 */

/*:ja
 * @target MV MZ
 * @plugindesc v1.022 コモンイベントの並列処理を戦闘中も有効にします。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @url http://newrpg.seesaa.net/article/477740800.html
 *
 * @help コモンイベントの並列処理を戦闘中も有効にします。
 * プラグインパラメータに、対象とするコモンイベントを登録します。
 * その状態で設定したスイッチがオンになっていれば、並列実行されます。
 *
 * 逆に登録したコモンイベントをマップ上で無効にすることも可能です。
 * これにより、戦闘中だけ有効なコモンイベントを作成できます。
 *
 * ■利用規約
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @param commonEventsWhiteList
 * @text 登録コモンイベント
 * @type common_event[]
 * @default []
 * @desc 戦闘で有効とする並列コモンイベントを登録します。
 *
 * @param invalidOnMap
 * @text マップ上で無効化
 * @type boolean
 * @default false
 * @desc 登録したコモンイベントの並列処理をマップ上で無効化します。
 *
 * @param validAllCommon
 * @text 全てを有効化
 * @type boolean
 * @default false
 * @desc 全コモンイベントの並列処理を戦闘で有効化します。
 * 上記の登録コモンイベントは無意味となります。
 *
 * @param alwaysMonitorChange
 * @text 変化を常に監視
 * @type boolean
 * @default false
 * @desc 戦闘中、変数やスイッチの変化を常に監視します。
 * 外部プラグインによる変数操作などに対応できます。
 */
(function() {
"use strict";

function toBoolean(val, def) {
    // 空白なら初期値を返す
    if (val === "" || val === undefined) {
        return def;

    // 既にboolean型なら、そのまま返す
    } else if (typeof val === "boolean") {
        return val;
    }
    // 文字列ならboolean型に変換して返す
    return val.toLowerCase() == "true";
}

/**
 * ●JSON用数値リストをJS用に変換
 */
function parseNumberList(param) {
    if (!param) {
        return [];
    }
    return JSON.parse(param).map(val => Number(val));
}

const PLUGIN_NAME = "NRP_BattleParallelCommon";
const parameters = PluginManager.parameters(PLUGIN_NAME);
const pWhiteList = parseNumberList(parameters["commonEventsWhiteList"]);
const pInvalidOnMap = toBoolean(parameters["invalidOnMap"], false);
const pValidAllCommon = toBoolean(parameters["validAllCommon"], false);
const pAlwaysMonitorChange = toBoolean(parameters["alwaysMonitorChange"], false);

/**
 * ●戦闘開始
 */
const _BattleManager_startBattle = BattleManager.startBattle;
BattleManager.startBattle = function() {
    _BattleManager_startBattle.apply(this, arguments);

    // 戦闘用コモンイベントの作成
    $gameMap.setupBattleCommonEvents();
};

/**
 * 【独自】戦闘用コモンイベントの作成
 */
Game_Map.prototype.setupBattleCommonEvents = function() {
    // 戦闘テスト時は並列コモンイベントを作成
    // ※通常はマップを経由しないと生成できないため
    if (DataManager.isBattleTest()) {
        this._commonEvents = [];
        for (const commonEvent of this.parallelCommonEvents()) {
            this._commonEvents.push(new Game_CommonEvent(commonEvent.id));
        }
    }

    // 全コモンイベントを有効化する場合
    if (pValidAllCommon) {
        this._battleCommonEvents = this._commonEvents;
        return;
    }

    // ホワイトリストに含まれるコモンイベントだけを抽出する。
    this._battleCommonEvents = this._commonEvents.filter(function(commonEvent) {
        return pWhiteList.includes(commonEvent._commonEventId);
    });

    // リフレッシュ
    this.refreshBattleCommonEvent();
};

/**
 * ●更新処理
 */
const _Scene_Battle_update = Scene_Battle.prototype.update;
Scene_Battle.prototype.update = function() {
    _Scene_Battle_update.apply(this, arguments);

    $gameMap.updateBattleCommonEvents();
};

/**
 * ●リフレッシュ処理のリクエスト
 */
const _Game_Map_requestRefresh = Game_Map.prototype.requestRefresh;
Game_Map.prototype.requestRefresh = function(mapId) {
    _Game_Map_requestRefresh.apply(this, arguments);

    // 戦闘用のリフレッシュ処理を設定
    if (pAlwaysMonitorChange) {
        this._needsRefreshOnBattle = true;
    }
};

/**
 * 【独自】戦闘中の並列処理実行
 */
Game_Map.prototype.updateBattleCommonEvents = function() {
    // 戦闘用のリフレッシュ処理を実行
    if (this._needsRefreshOnBattle) {
        if ($gameParty.inBattle()) {
            this._needsRefreshOnBattle = false;
            $gameMap.refreshBattleCommonEvent();
        }
    }

    // 並列処理実行
    for (const commonEvent of this._battleCommonEvents) {
        commonEvent.update();
    }
};

/**
 * 【独自】コモンイベントの更新
 */
Game_Map.prototype.refreshBattleCommonEvent = function() {
    // 空の場合は処理しない。
    if (!this._battleCommonEvents) {
        return;
    }

    for (const commonEvent of this._battleCommonEvents) {
        commonEvent.refresh();
    }
};

/**
 * 【独自】並列コモンイベントが有効かどうかの判定
 */
const _Game_CommonEvent_isActive = Game_CommonEvent.prototype.isActive;
Game_CommonEvent.prototype.isActive = function() {
    // 全コモンイベントが有効なら元のまま
    if (pValidAllCommon) {
        return _Game_CommonEvent_isActive.apply(this, arguments);
    }

    // 非戦闘中はホワイトリスト登録分を無効化する。
    if (pInvalidOnMap && !$gameParty.inBattle()) {
        if (pWhiteList.includes(this._commonEventId)) {
            return false;
        }
    }

    return _Game_CommonEvent_isActive.apply(this, arguments);
};

/**
 * ●スイッチが変更された場合
 */
const _Game_Switches_onChange = Game_Switches.prototype.onChange;
Game_Switches.prototype.onChange = function() {
    _Game_Switches_onChange.apply(this, arguments);

    if ($gameParty.inBattle()) {
        $gameMap.refreshBattleCommonEvent();
    }
};

/**
 * ●マップ切替時
 */
const _Scene_Map_start = Scene_Map.prototype.start;
Scene_Map.prototype.start = function() {
    _Scene_Map_start.apply(this, arguments);

    // 全コモンイベントが有効なら元のまま
    if (pValidAllCommon) {
        return;
    }

    // 非戦闘中はホワイトリスト登録分を無効化する。
    if (pInvalidOnMap) {
        for (const event of $gameMap._commonEvents) {
            if (pWhiteList.includes(event._commonEventId)) {
                event.refresh();
            }
        }
    }
};

})();


code:
//=============================================================================
// NRP_ChargeSkill.js
//=============================================================================
/*:
 * @target MV MZ
 * @plugindesc v1.022 Create a charge skill.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 * @url http://newrpg.seesaa.net/article/474413155.html
 *
 * @help Create a charge skill.
 * The charge time and other settings can also be set
 * in conjunction with the CTB plugin.
 * You can also use the normal turn system.
 *
 * [How to use]
 * 1. Create the state for charging. (Example settings below)
 *  - Action constraints: any of the 'attacks'
 *  - Release condition: Cancel after the battle is over
 *  - Automatic cancellation: at the end of the action
 *  - Continuation turn: 1
 * 2. create a skill for execution.
 * Enter the following into note and specify the ID of the created state.
 * <ChargeState:[ID]>
 *
 * The charge skill will now work.
 * If you want to set up more detailed settings, please see below.
 *
 * [Items available for skills note]
 * <ChargeState:[ID]>
 * Sets the ID of the state for charging. (Required)
 *
 * <ChargeSkill:[ID]>
 * Set the ID of the skill to start charging.
 *
 * <ChargeName:[Name]>
 * Sets the display name at the start of a charge.
 *
 * <ChargeSpeed:[number]>
 * Sets the speed compensation at the start of charging.
 * (In CTB, the length of the charge time.)
 *
 * <ChargeSpeed:+100> or <ChargeSpeed:*2>
 * Set the value with a sign as shown above.
 * Calculate the original speed as 100(%).
 *
 * <ChargeActionSkill:[ID]>
 * Specify if you want to perform a skill with a different ID.
 *
 * <ChargeTurnException>
 * At the start of a charge, ignore the passage of turns, such as states.
 *
 * <ChargeCost>
 * Change to consume MP/TP at the start of a charge.
 *
 * <IfNoCharge>
 * If the specified formula is satisfied, it is triggered immediately.
 *
 * <NoStartAction>
 * Do not step forward or display skill names when using skills.
 *
 * <NoResult>
 * Do not display the result of using a skill.
 *
 * [Items available for equips/states note]
 * <ChargeSpeed:[Number]]>
 * The charge speed is compensated by the equipment/state.
 *
 * <ChargeSkillType:[Number]>
 * Applies speed compensation only to specific skill types.
 * You can specify multiple skill types separated by commas.
 *
 * [Items available for states note]
 * <RemoveState:[ID]>
 * When a state is added, this unstates the specified number.
 *
 * <StateMotion:[Motion]>
 * Set the waiting motion during state.
 *
 * [Terms]
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but we will respond to defects as far as possible.
 *
 * @param chargeTurnException
 * @type boolean
 * @default false
 * @desc At the start of a charge skill, ignore some turn-over processes.
 * Subject to state & ability change turnover, poison damage, etc.
 */

/*:ja
 * @target MV MZ
 * @plugindesc v1.022 ため技作成用の機能を提供します。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 * @url http://newrpg.seesaa.net/article/474413155.html
 *
 * @help ため技を作成します。
 * CTBプラグインとの連携によって、チャージタイムなどの設定も可能です。
 * ※通常のターン制でも使用できます。
 *
 * ■使用方法
 * １．ため状態用ステートを作成します。（以下、設定例）
 *   ・行動制約：『～を攻撃』のいずれか
 *   ・解除条件：戦闘終了後に解除
 *   ・自動解除：行動終了時
 *   ・継続ターン：1
 * ２．実行用スキルを作成。
 *     メモ欄へ以下を記入し、作成したステートのIDを指定します。
 *   ・<ChargeState:[ID]>
 *
 * これだけでため技が機能します。
 * より詳細な設定をしたい場合は以下を参照してください。
 *
 * ◆スキルのメモ欄に使用可能な項目
 * <ChargeState:[ID]>  ：ため状態用ステートのIDを設定する。（必須）
 * <ChargeSkill:[ID]>  ：ため開始演出用スキルのIDを設定する。
 * <ChargeName:[名称]> ：ため開始時の表示名を設定する。
 * <ChargeSpeed:[数値]>：ため開始時の速度補正を設定する。
 *                       （CTBにおいてはため時間の長さ）
 *                       <ChargeSpeed:+100>または<ChargeSpeed:*2>
 *                       というように、符号付きで値を設定してください。
 *                       元の速度を100(%)として計算します。
 * <ChargeActionSkill:[ID]>：他のＩＤのスキルを実行したい場合に指定する。
 * <ChargeTurnException>：ため開始時、ステートなどのターン経過を無視します。
 * <ChargeCost>        ：MP･TPをため開始時に消費するよう変更する。
 * <IfNoCharge>        ：指定した式を満たす場合、即時発動する。
 * <NoStartAction>     ：スキル使用時の一歩前進や技名表示を行わない。
 * <NoResult>          ：スキル使用時の結果表示を行わない。
 *
 * ◆装備・ステートのメモ欄に使用可能な項目
 * <ChargeSpeed:[数値]]>：装備、ステート時のため速度に補正をかける。
 * <ChargeSkillType:[数値]>：特定のスキルタイプのみ速度補正をかけます。
 *                          カンマ区切りで複数指定可。
 *
 * ◆ステートのメモ欄に使用可能な項目
 * <RemoveState:[ID]> ：ステートが追加された際、指定番号のステートを解除する。
 * <StateMotion:[モーション名]> ：ステート中の待機モーションを設定する。
 *
 * 【利用規約】
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @param chargeTurnException
 * @text チャージターンの経過無効
 * @type boolean
 * @default false
 * @desc ため技の開始時、一部ターン経過処理を無視します。
 * ステート＆能力変化のターン経過、毒のダメージ効果などが対象。
 */

(function() {
"use strict";

function toBoolean(str) {
    if (str == true) {
        return true;
    }
    return (str == "true") ? true : false;
}

var parameters = PluginManager.parameters("NRP_ChargeSkill");
var pChargeTurnException = toBoolean(parameters["chargeTurnException"]);

/**
 * ●ため技情報を保有する構造体
 */
var ChargeSkill = function() {
    this.skillId = 0;
    this.targetIndex = -1;
};

/**
 * ●ステートクリア
 */
var _Game_BattlerBase_clearStates = Game_BattlerBase.prototype.clearStates;
Game_BattlerBase.prototype.clearStates = function() {
    _Game_BattlerBase_clearStates.call(this);

    // ステート毎に保有するため技データ
    this._chargeSkills = {};
};

/**
 * ●アクション開始
 */
var _BattleManager_startAction = BattleManager.startAction;
BattleManager.startAction = function() {
    // ため技開始
    startCharge(this._subject);
    // 行動取得
    var action = this._subject.currentAction();
    // 行動が取得できなければ終了
    // ※ため開始状態（skillId:0）を飛ばすため
    if (!action.item()) {
        return;
    }

    // 元処理実行
    _BattleManager_startAction.call(this);
};

/**
 * ●ため技開始
 */
function startCharge(subject) {
    var a = subject; // eval参照用
    var action = subject.currentAction();
    var item = action.item();

    // ため用ステート
    var chargeStateId = item.meta.ChargeState;

    // ChargeStateの設定がなければ、ため技ではない。
    if (!chargeStateId) {
        return;

    // 既にため状態ならば、普通にスキル実行
    } else if (isSkillCast(item, subject)) {
        // 消費タイミングがため開始時の場合
        var chargeCost = item.meta.ChargeCost;
        if (chargeCost) {
            // 実行時の消費はなし
            item._tmpMpCost = 0;
            item._tmpTpCost = 0;
        } else {
            item._tmpMpCost = undefined;
            item._tmpTpCost = undefined;
        }
        return;
    }

    // eval参照用
    var chargeSpeedRate = getChargeSpeedRate(action);

    // 即時発動条件を満たしているなら、以降処理せず実行
    if (isNoCharge(action, chargeSpeedRate)) {
        return;
    }

    // 数式評価
    chargeStateId = eval(chargeStateId);

    /*
     * ため開始時と判定
     */
    chargeSkill(subject, action, chargeStateId, chargeSpeedRate);
}

/**
 * ●ため技実行時かどうか？
 * ※ため終わったスキルを発動するタイミングかを判定
 */
function isSkillCast(item, subject) {
    var a = subject; // eval参照用

    // ため用ステート
    var chargeStateId = item.meta.ChargeState;
    // ChargeStateの設定がなければ、ため技ではない。
    if (chargeStateId) {
        // 数式評価
        chargeStateId = eval(chargeStateId);
        // 既にため状態ならば、普通にスキル実行
        if (a.isStateAffected(chargeStateId)) {
            return true;
        }
    }
    return false;
}

/**
 * ●ため開始技の実行
 * ※本来、選択したスキルとは別にため開始スキルを実行する。
 */
function chargeSkill(subject, action, chargeStateId, chargeSpeedRate) {
    var a = subject; // eval参照用
    var item = action.item();
    var keepActions = subject._actions; // アクション保持用

    // ため時の速度補正
    action._chargeSpeedRate = chargeSpeedRate;

    // 行動主体にステートを付加
    subject.addState(chargeStateId);
    // 行動制約によってアクションが解除されるので再設定
    subject._actions = keepActions;
    action = subject.currentAction();

    // ステート毎のスキルID配列が未定義の場合は初期化
    // ※途中セーブから導入した場合を考慮
    if (subject._chargeSkills == undefined) {
        subject._chargeSkills = {};
    }

    // ため技情報を作成
    var chargeSkill = new ChargeSkill();
    // スキルＩＤの指定があるなら設定
    if (item.meta.ChargeActionSkill) {
        chargeSkill.skillId = item.meta.ChargeActionSkill;
    } else {
        chargeSkill.skillId = item.id;
    }
    chargeSkill.targetIndex = action._targetIndex;

    // ため用ステートIDに、ため技情報を紐付け
    subject._chargeSkills[chargeStateId] = chargeSkill;

    // ため技の表示名
    var chargeName = item.meta.ChargeName;

    // 消費タイミングが『ため開始時』の場合
    var chargeCost = item.meta.ChargeCost;
    if (chargeCost) {
        // 消費を求めて減算する。
        subject._mp -= subject.skillMpCost(item);
        subject._tp -= subject.skillTpCost(item);
    }

    // スキルIDをため用に変更
    // ため演出用スキルＩＤを取得する。
    var chargeSkillId = item.meta.ChargeSkill;
    if (chargeSkillId) {
        chargeSkillId = eval(chargeSkillId);
        action.setSkill(chargeSkillId);

    // 取得できない場合は0を設定
    } else {
        action.setSkill(0);
    }

    // ため開始ターンを状態異常などの処理の対象外とする設定
    var chargeTurnException = item.meta.ChargeTurnException;
    // <ChargeTurnException>の指定がある場合は優先
    if (chargeTurnException != undefined) {
        if (chargeTurnException) {
            subject._isChargeTurnException = true;
        }
    // 指定がない場合はプラグインパラメータの設定
    } else if (pChargeTurnException) {
        subject._isChargeTurnException = true;
    }

    // 表示名変更
    setChargeName(chargeName, action, item, subject);
}

/**
 * ●ターン終了時
 */
var _Game_Battler_onTurnEnd = Game_Battler.prototype.onTurnEnd;
Game_Battler.prototype.onTurnEnd = function() {
    // ため技起動時は独自のターン経過処理を行う
    if (this._isChargeTurnException) {
        this._isChargeTurnException = undefined;
        this.clearResult();
        this.updateChargeStateTurns();
        return;
    }

    // 元処理実行
    _Game_Battler_onTurnEnd.call(this);
};

/**
 * 【独自実装】ため技用ステートのみターン更新する。
 */
Game_BattlerBase.prototype.updateChargeStateTurns = function() {
    this._states.forEach(function(stateId) {
        if (this._stateTurns[stateId] > 0 && this._chargeSkills[stateId]) {
            this._stateTurns[stateId]--;
        }
    }, this);
};

/**
 * ●ＭＰ消費処理
 */
var _Game_BattlerBase_skillMpCost = Game_BattlerBase.prototype.skillMpCost;
Game_BattlerBase.prototype.skillMpCost = function(skill) {
    // 一時消費ＭＰが設定されているならそちらを参照
    if (skill._tmpMpCost != undefined) {
        return Math.floor(skill._tmpMpCost * this.mcr);
    }

    // 元処理実行
    return _Game_BattlerBase_skillMpCost.call(this, skill);
};

/**
 * ●ＴＰ消費処理
 */
var _Game_BattlerBase_skillTpCost = Game_BattlerBase.prototype.skillTpCost;
Game_BattlerBase.prototype.skillTpCost = function(skill) {
    // 一時消費ＴＰが設定されているならそちらを参照
    if (skill._tmpTpCost != undefined) {
        return skill._tmpTpCost;
    }

    // 元処理実行
    return _Game_BattlerBase_skillTpCost.call(this, skill);
};

/**
 * ●スキル一覧の消費更新
 */
var _Window_SkillList_drawSkillCost = Window_SkillList.prototype.drawSkillCost;
Window_SkillList.prototype.drawSkillCost = function(skill, x, y, width) {
    skill._tmpMpCost = undefined;
    skill._tmpTpCost = undefined;

    // 元処理実行
    _Window_SkillList_drawSkillCost.call(this, skill, x, y, width);
};

/**
 * ●表示技名変更
 * ・actionの中身は新しいため演出用スキル
 * ・itemの中身は元の実行用スキル
 */
function setChargeName(chargeName, action, item, subject) {
    // eval参照用
    var a = subject;

    // 表示名変更
    if (action.item() && chargeName) {
        // ブランクならメッセージなし
        if (chargeName == true) {
            action.item().name = undefined;

        // 表示名設定
        } else {
            try {
                // 式として取得できる場合
                action.item().name = eval(chargeName);
            } catch (e) {
                // 式でない場合はエラーとなるが、普通に文字列で取得
                action.item().name = chargeName;
            }
        }
    }
}

/**
 * ●混乱時の動作（強制攻撃系の行動制約）
 */
var _Game_Action_setConfusion = Game_Action.prototype.setConfusion;
Game_Action.prototype.setConfusion = function() {
    if (this.item()) {
        // ため技情報があれば、実行スキルを設定
        var chargeSkill = getChargeSkill(this.subject());
        if (chargeSkill) {
            var skillId = eval(chargeSkill.skillId);
            this.setSkill(skillId);
            this.setTarget(chargeSkill.targetIndex);
            return;
        }
    }

    _Game_Action_setConfusion.call(this);
};

/**
 * ●ため技情報を取得する。
 */
function getChargeSkill(subject) {
    // ため技情報が存在しない場合は処理終了
    if (!subject._chargeSkills || subject._chargeSkills.length == 0) {
        return;
    }

    // ため技ステートを発見した場合、その情報を取得する。
    for (let i = 0; i < subject.states().length; i++) {
        let state = subject.states()[i];
        if (subject._chargeSkills[state.id]) {
            return subject._chargeSkills[state.id];
        }
    }
}

/**
 * ●ステート追加
 */
var _Game_BattlerBase_prototype_addNewState = Game_BattlerBase.prototype.addNewState;
Game_BattlerBase.prototype.addNewState = function(stateId) {
    // <RemoveState:number>があれば、そのステートを設定
    var removeStateVal = $dataStates[stateId].meta.RemoveState;
    if (removeStateVal) {
        // ","区切りに対応
        var removeStates = removeStateVal.split(",");
        // 対象のステートＩＤを除去していく。
        removeStates.forEach(function(removeStateId) {
            this.removeState(Number(removeStateId));
        }, this);
    }

    // 元の処理
    _Game_BattlerBase_prototype_addNewState.apply(this, arguments);
};

var _Game_BattlerBase_canPaySkillCost = Game_BattlerBase.prototype.canPaySkillCost;
Game_BattlerBase.prototype.canPaySkillCost = function(skill) {
    // ため技実行時
    if (isSkillCast(skill, this)) {
        // 消費タイミングがため開始時の場合
        var chargeCost = skill.meta.ChargeCost;
        if (chargeCost) {
            // コストは０として判定
            return true;
        }
    }

    // 元処理実行
    return _Game_BattlerBase_canPaySkillCost.call(this, skill);
};

/**
 * ●対象設定
 */
var _Game_Action_makeTargets = Game_Action.prototype.makeTargets;
Game_Action.prototype.makeTargets = function() {
    // ため技情報があれば、対象を再設定
    var chargeSkill = getChargeSkill(this.subject());
    if (chargeSkill) {
        this.setTarget(chargeSkill.targetIndex);
        let targets = [];

        // MVの場合
        if (Utils.RPGMAKER_NAME == "MV") {
            // 通常の混乱時の挙動は取らない。
            if (this.isForOpponent()) {
                targets = this.targetsForOpponents();
            } else if (this.isForFriend()) {
                targets = this.targetsForFriends();
            }
        // MZの場合
        } else {
            // 通常の混乱時の挙動は取らない。
            if (this.isForEveryone()) {
                targets.push(...this.targetsForEveryone());
            } else if (this.isForOpponent()) {
                targets.push(...this.targetsForOpponents());
            } else if (this.isForFriend()) {
                targets.push(...this.targetsForFriends());
            }
        }

        return this.repeatTargets(targets);
    }

    // 元処理実行
    return _Game_Action_makeTargets.call(this);
};

/**
 * 速度補正計算
 */
var _Game_Battler_makeSpeed = Game_Battler.prototype.makeSpeed;
Game_Battler.prototype.makeSpeed = function() {
    _Game_Battler_makeSpeed.call(this);

    // ため速度補正率が取得できれば計算
    var chargeSpeedRate = getChargeSpeedRate(this.currentAction());
    // ただし、即時発動時は除外する。
    if (chargeSpeedRate && !isNoCharge(this.currentAction(), chargeSpeedRate)) {
        this._speed *= chargeSpeedRate / 100;
    }
};

/**
 * ●即時発動かどうか？
 */
function isNoCharge(action, chargeSpeedRate) {
    // eval参照用
    var item = action.item();
    var a = action.subject();
    var chargeSpeed = eval(chargeSpeedRate - 100)

    // 即時発動条件を満たしているなら、以降処理せず実行
    var ifNoCharge = item.meta.IfNoCharge;
    if (ifNoCharge && eval(ifNoCharge)) {
        return true;
    }
    return false;
}

/**
 * ●ため速度率を計算
 */
function getChargeSpeedRate(action) {
    // 無効なスキルおよび即時発動なら終了
    if (!action || !action.item()) {
        return undefined;
    }

    var item = action.item();
    var a = action.subject();

    var chargeStateId = item.meta.ChargeState;
    let chargeSpeed;

    // ため速度が計算済
    if (action._chargeSpeedRate) {
        return action._chargeSpeedRate;

    // ため技に該当
    } else if (chargeStateId) {
        chargeStateId = eval(chargeStateId);

        // 既にため状態ならば処理しない
        if (a.isStateAffected(chargeStateId)) {
            return;
        }

        /*
         * ため技開始時
         * ※CTB用の行動予測計算処理も含む
         */
        // スキルの速度補正
        chargeSpeed = item.meta.ChargeSpeed;
        if (!chargeSpeed) {
            chargeSpeed = "0";
        }
        // 符号補正
        chargeSpeed = addStartPlus(chargeSpeed);
        var chargeSpeedRate = eval("100 " + chargeSpeed);

        // 装備による速度補正加算
        if (a.equips) {
            a.equips().forEach(function(equip) {
                let chargeSpeed = getItemChargeSpeed(equip, item.stypeId);
                if (chargeSpeed) {
                    // 符号補正
                    chargeSpeed = addStartPlus(chargeSpeed);
                    chargeSpeedRate = eval(chargeSpeedRate + " " + chargeSpeed);
                }
            });
        }

        // ステートによる速度補正加算
        a.states().forEach(function(state) {
            let chargeSpeed = getItemChargeSpeed(state, item.stypeId);
            if (chargeSpeed) {
                // 符号補正
                chargeSpeed = addStartPlus(chargeSpeed);
                chargeSpeedRate = eval(chargeSpeedRate + " " + chargeSpeed);
            }
        });

        return chargeSpeedRate;
    }

    // ため用ステートが見つからない場合は処理終了
    return undefined;
}

/**
 * ●item（装備およびステート）の溜め速度補正を加算
 */
function getItemChargeSpeed(item, stypeId) {
    if (!item) {
        return undefined;
    }

    let chargeSpeed = item.meta.ChargeSpeed;
    if (chargeSpeed) {
        let chargeSkillType = item.meta.ChargeSkillType;
        if (chargeSkillType) {
            // ","区切りに対応
            var chargeSkillTypes = chargeSkillType.split(",");
            // スキルタイプに一致があれば取得する。
            for (let i = 0; i < chargeSkillTypes.length; i++) {
                if (chargeSkillTypes[i] == stypeId) {
                    return chargeSpeed;
                }
            }
            // 一致がない場合は何も返さない
            return undefined;

        // スキルタイプの指定がない場合は常に取得
        } else {
            return chargeSpeed;
        }
    }
}

/**
 * ●式の先頭に符号がない場合、+を追加する。
 */
function addStartPlus(str) {
    if (!str.startsWith("+")
        && !str.startsWith("-")
        && !str.startsWith("*")
        && !str.startsWith("/")) {
            return "+ " + str;
    }
    return str;
}

/**
 * ●モーション設定
 */
var _Sprite_Actor_refreshMotion = Sprite_Actor.prototype.refreshMotion;
Sprite_Actor.prototype.refreshMotion = function() {
    var actor = this._actor;
    // アクション中は除外
    if (actor && !actor.isActing()) {
        // ステートによって、モーションの指定があれば呼び出す。
        for (let i = 0; i < actor.states().length; i++) {
            let state = actor.states()[i];
            let motionName = state.meta.StateMotion;
            if (motionName) {
                this.startMotion(motionName);
                return;
            }
        }
    }

    // 元処理実行
    _Sprite_Actor_refreshMotion.call(this);
};

/**
 * ●アクション名表示
 */
var _Window_BattleLog_displayAction = Window_BattleLog.prototype.displayAction;
Window_BattleLog.prototype.displayAction = function(subject, item) {
    // アクション名がなければ非表示
    if (!item.name) {
        return;
    }

    // 元処理実行
    _Window_BattleLog_displayAction.call(this, subject, item);
};

/**
 * ●アクション開始メッセージ＆演出
 */
var _Window_BattleLog_startAction = Window_BattleLog.prototype.startAction;
Window_BattleLog.prototype.startAction = function(subject, action, targets) {
    var item = action.item();
    // スキルメモ欄に<NoStartAction>が設定されているなら開始演出を省略
    if (item.meta.NoStartAction) {
        // アニメーションとウェイトだけを残す
        this.push('showAnimation', subject, targets.clone(), item.animationId);
        this.push('wait');
        return;
    }

    // 元処理実行
    _Window_BattleLog_startAction.apply(this, arguments);
};

/**
 * ●アクション結果表示
 */
var _Window_BattleLog_displayActionResults = Window_BattleLog.prototype.displayActionResults;
Window_BattleLog.prototype.displayActionResults = function(subject, target) {
    if (BattleManager._action) {
        var item = BattleManager._action.item();
        // スキルメモ欄に<NoResult>が設定されているなら結果演出を省略
        if (item.meta.NoResult) {
            return;
        }
    }
    // 元処理実行
    _Window_BattleLog_displayActionResults.apply(this, arguments);
};

})();


code:
//=============================================================================
// NRP_LightAnimation.js
//=============================================================================
/*:
 * @plugindesc v2.01 Lightens animation processing.
 * @author Takeshi Sunagawa (http://newrpg.seesaa.net/)
 *
 * @help The animation processing is reduced
 * by suppressing the creation of unnecessary cells.
 * It also suppresses the number of updates to the target flash.
 *
 * <Terms>
 * There are no restrictions.
 * Modification, redistribution freedom, commercial availability,
 * and rights indication are also optional.
 * The author is not responsible,
 * but we will respond to defects as far as possible.
 *
 * @param flashDivide
 * @type number
 * @min 1
 * @default 2
 * @desc Reduces the target flash updates by the specified number.
 * If it's 2, it's 1/2 times.
 */

/*:ja
 * @plugindesc v2.01 アニメーション処理を軽量化します。
 * @author 砂川赳（http://newrpg.seesaa.net/）
 *
 * @help 不要なセルの作成を抑制し、アニメーション処理を軽量化します。
 * また、対象のフラッシュの更新回数を抑制します。
 *
 * ■利用規約
 * 特に制約はありません。
 * 改変、再配布自由、商用可、権利表示も任意です。
 * 作者は責任を負いませんが、不具合については可能な範囲で対応します。
 *
 * @param flashDivide
 * @text フラッシュ更新軽減度
 * @type number
 * @min 1
 * @default 2
 * @desc 指定した数値分だけ対象のフラッシュの更新を減らします。
 * 2なら1/2回となります。
 */
(function() {
"use strict";

var parameters = PluginManager.parameters("NRP_LightAnimation");
var pFlashDivide = parameters["flashDivide"];

/**
 * 【関数上書】セルの作成
 */
Sprite_Animation.prototype.createCellSprites = function() {
    // 使用しているセル番号のＭＡＸを取得（０始まり）
    var maxCell = 0;
    // フレームごとのループ
    this._animation.frames.forEach(function(frame) {
        // セルごとのループ
        frame.forEach(function(cell, index) {
            // 取得済みの最大値よりセル番号が大きく、
            // かつ、パターンが０以上
            if (index > maxCell && cell[0] >= 0) {
                maxCell = index;
            }
        });
    });

    // 常に１６セルを確保していたのを修正し、必要なセルだけを生成する。
    this._cellSprites = [];
    for (var i = 0; i <= maxCell; i++) {
        var sprite = new Sprite();
        sprite.anchor.x = 0.5;
        sprite.anchor.y = 0.5;
        this._cellSprites.push(sprite);
        this.addChild(sprite);
    }
};

/*
 * ●フラッシュ更新軽減度が有効な場合のみ実施
 */
if (pFlashDivide && pFlashDivide >= 2) {
    /**
     * ●アニメーションの更新
     */
    var _Sprite_Battler_updateAnimation = Sprite_Battler.prototype.updateAnimation;
    Sprite_Battler.prototype.updateAnimation = function() {
        _Sprite_Battler_updateAnimation.call(this);

        // フラッシュ用に時間をカウントする。
        // ※対象を共通化するため_effectTargetを指定
        if (this.isAnimationPlaying()) {
            if (!this._effectTarget._flashDurationCount) {
                this._effectTarget._flashDurationCount = 0;
            }
            this._effectTarget._flashDurationCount++;
        } else {
            this._effectTarget._flashDurationCount = 0;
        }
    };

    /**
     * ●フラッシュ開始
     */
    var _Sprite_Animation_startFlash = Sprite_Animation.prototype.startFlash;
    Sprite_Animation.prototype.startFlash = function(color, duration) {
        // 元処理実行
        _Sprite_Animation_startFlash.call(this, color, duration);

        // フラッシュ更新カウント
        this._flashUpdCount = 0;
    };

    /**
     * 【関数上書】対象のフラッシュ更新
     */
    Sprite_Animation.prototype.updateFlash = function() {
        if (this._flashDuration > 0) {
            var d = this._flashDuration--;

            // var target = getTargetSprite(this);

            // 該当のタイミングの場合
            if (this._target._flashDurationCount % pFlashDivide == 1) {
                // 最終更新の場合はフラッシュクリア
                if (this._flashDuration < pFlashDivide && this._flashUpdCount > 0) {
                    this._flashColor[3] = 0;
                    this._target.setBlendColor(this._flashColor);
                // 通常更新
                } else {
                    this._flashColor[3] *= (d - 1) / d;
                    this._target.setBlendColor(this._flashColor);
                }
                // フラッシュ更新カウント+1
                this._flashUpdCount++;
            }
            // タイミング外でもフラッシュ終了時かつ一度しか更新していない場合は対象
            // ※２回以上更新されないフラッシュはここで制御しないと色が戻らないため
            if (this._flashDuration == 0 && this._flashUpdCount == 1) {
                // フラッシュクリア
                this._flashColor[3] = 0;
                this._target.setBlendColor(this._flashColor);
            }
        }
    };
}
})();