code:
//=============================================================================
// TDDP_PreloadManager.js
// Version: 1.1.1
//=============================================================================

var Imported = Imported || {};
Imported.TDDP_PreloadManager = "1.1.1";

var TDDP = TDDP || {};
TDDP.PreloadManager = TDDP.PreloadManager || {};
//=============================================================================
/*:
 * @plugindesc 1.1.1 Preload resources on scene/map load as well as game startup for a smoother gameplay experience.          id:TDDP_PreloadManager
 *
 * @author Tor Damian Design / Galenmereth
 *
 * @param Preload On Map Load
 * @desc If you want to preload all assets found on a map upon loading the map, set this to true.
 * @default true
 *
 * @param Preload System Music
 * @desc If you want to preload all the Music specified in the Database System tab on startup, set this to true.
 * @default false
 *
 * @param Preload System SFX
 * @desc If you want to preload all the SFX specified in the Database System tab on startup, set this to true.
 * @default false
 *
 * @param Print Debug to Console
 * @desc If you want to see debug information in the console (F8) set this to true.
 * @default false
 *
 * @help =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * Introduction / Table of contents
 * =~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
 * TDDP PreloadManager lets you preload resources on both startup (before the
 * game title screen displays) and on map load (in between map transfers) to
 * ensure resources such as pictures, music and sound effects are preloaded
 * before called.
 *
 * By default MV will stream the resources as they are required. This plugin
 * serves as an alternative for a smoother gameplay experience at the cost of
 * more bandwidth.
 *
 * This Plugin will load all resources in all event pages on the map,
 * regardless of if they will be triggered by the player at any time or not.
 * Since page conditions cannot be predicted as they are dependent on player
 * interaction, this is a necessity to ensure the right files are ready and
 * preloaded.
 *
 * For updates and easy to use documentation, please go to the plugin's website:
 * http://mvplugins.tordamian.com/?p=29
 *
 * There you can also download a PDF of the documentation for offline use, and
 * having the documentation in one cleanly presented place means you can always
 * be sure it's the most recent available.
 *
 * Table of contents
 * -----------------
 * 1. Installation
 * 2. Advanced Configuration
 * 3. Terms & Conditions
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 1. Installation
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * Drag and drop plugin .js file into your project's js/plugins folder, then
 * enable it in the editor interface.
 *
 * Make sure this plugin is placed at the top for maximum compatibility.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 2. Advanced Configuration
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * There is an advanced configuration section if you open the plugin .js file
 * in a text editor. Look for BOOT PRELOAD CONFIG -- ADVANCED USERS. This lets
 * you define resources to preload on boot manually.
 *
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * 3. Terms & Conditions
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * This plugin is free for both non-commercial and commercial use. Please see
 * http://mvplugins.tordamian.com/terms-of-use for the full terms of use.
 *
 * A big thank you to Degica for making this plugin free for commercial use for
 * everyone!
 */
/*
* =============================================================================
* BOOT PRELOAD CONFIG -- ADVANCED USERS
* =============================================================================
*
* Tip: You can omit the filename, it will assume .png since this is what MV
* prefers.
*
* -----------------------------------------------------------------------------
* Image files to load on boot:
* -----------------------------------------------------------------------------
* Keys:
*   animation
*   battleback1
*   battleback2
*   character
*   enemy
*   face
*   parallax
*   picture
*   svActor
*   svEnemy
*   system
*   tileset
*   title1
*   title2
*
* If you have subfolders in any of these folders, just prepend that to the
* filename, like this example, where the picture "arrow" is in the "cursors"
* subfolder within the system folder:
*
* system: [
*   "balloon",
*   "cursors/arrow"
* ]
*/
TDDP.bootPreloadImages = {
    /* Example
    face: [
        "Actor3"
    ],
    system: [
      "myFile",
      "subfolder/myOtherFile"
    ]
    */
    //�ǉ�
    picture: [
    for(var j = 0; j<= 3; j++) {
    for (var i = 1; i =< 20; i++) {
        "tati_huro_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 21; i++) {
        "tati_kuno_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 19; i++) {
        "tati_non_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 21; i++) {
        "tati_sia_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 1; j++) {
    for (var i = 1; i =< 16; i++) {
        "tati_saria_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 2; i++) {
        "buka_huro_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 2; i++) {
        "buka_kuno_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 2; i++) {
        "buka_non_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 3; j++) {
    for (var i = 1; i =< 2; i++) {
        "buka_sia_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}
for (var j = 0; j <= 1; j++) {
    for (var i = 1; i =< 2; i++) {
        "buka_saria_" + "abcd".substr(j, 1) + ('000' + i).slice(-3)
    }
}

    ],//�����܂�
}
/*
*
* -----------------------------------------------------------------------------
* BGM files to load on boot
* -----------------------------------------------------------------------------
*/
TDDP.bootPreloadBGM = [
    // "Town1"
]
/*
*
* -----------------------------------------------------------------------------
* BGS files to load on boot
* -----------------------------------------------------------------------------
*/
TDDP.bootPreloadBGS = [
    // "Quake"
]
/*
*
* -----------------------------------------------------------------------------
* SFX files to load on boot.
* -----------------------------------------------------------------------------
*/
TDDP.bootPreloadSE = [
    // "Open2"
]
/*
*
* -----------------------------------------------------------------------------
* ME files to load on boot.
* -----------------------------------------------------------------------------
*/
TDDP.bootPreloadME = [
    // "Shock1"
]
//=============================================================================
// END OF BOOT PRELOAD CONFIG
//=============================================================================
var PreloadManager;
(function () {
    "use strict";
    // Skip preloading if event test
    if (DataManager.isEventTest()) return;
    //=============================================================================
    // Setting up parameters
    //=============================================================================
    var parameters = $plugins.filter(function (p) { return p.description.contains("id:TDDP_PreloadManager") })[0].parameters;
    var preloadOnMapLoad = Boolean(parameters['Preload On Map Load'] === 'true' || false);
    var preloadSystemMusic = Boolean(parameters['Preload System Music'] === 'true' || false);
    var preloadSystemSFX = Boolean(parameters['Preload System SFX'] === 'true' || false);
    var debug = Boolean(parameters['Print Debug to Console'] === 'true' || false);
    if (debug) console.log("========= TDDP PreloadManager: Debug mode on =========")

    PreloadManager = function () {
        throw new Error('This is a static class');
    };

    PreloadManager._callOnComplete = false;
    PreloadManager._filesLoaded = 0;
    PreloadManager._filesTotal = 0;
    PreloadManager._ready = false;
    PreloadManager._preloadedMaps = [];
    PreloadManager._preloadedAudio = [];
    PreloadManager._sessionRequestedImages = [];

    PreloadManager.callOnComplete = function (func) {
        this._callOnComplete = func;
    };

    PreloadManager.start = function () {
        this._ready = true;
        this._sessionRequestedImages = [];
        this.controlIfReady(true);
    };

    PreloadManager._projectPath = function () {
        var path = window.location.pathname.replace(/\/[^\/]*$/, "/");
        if (path.match(/^\/([A-Z]\:)/)) {
            path = path.slice(1);
        }
        return decodeURIComponent(path);
    };

    PreloadManager.controlAudioFileExistence = function (folder, filename) {
        this.controlFileExistence("audio/" + folder + "/", filename, [".m4a", ".ogg"]);
    };

    PreloadManager.controlFileExistence = function (folder, filename, extensions) {
        if (StorageManager.isLocalMode() && Utils.isOptionValid('test')) {
            var fs = require("fs");
            var path = this._projectPath() + folder + filename;
            for (var i = 0, max = extensions.length; i < max; i++) {
                if (fs.existsSync(path + extensions[i])) return true;
            }
            throw new Error("PreloadManager: File " + folder + filename + " could not be found. Does it exist?")
        }
    };

    PreloadManager.preloadImages = function (type, filename, hue) {
        if (filename.constructor === Array) {
            for (var i = 0; i < filename.length; i++) {
                this.preloadImages(type, filename[i], hue);
            }
        } else {
            if (filename.length > 0) {
                if (this._isImageRequested(type, filename)) return;
                var func = "load" + type.charAt(0).toUpperCase() + type.substr(1).toLowerCase();
                if (typeof ImageManager[func] === 'undefined') {
                    e = "PreloadManager: " + type + " is not a valid image load key. Check your configuration.";
                    Graphics.printError(e);
                    throw new Error(e);
                }
                this._increaseFileNums();
                ImageManager[func](filename, hue).addLoadListener(this.onFileLoaded.bind(this, "(" + type + ") " + filename));
                this._registerRequestedImage(type, filename);
            }
        }
    };

    PreloadManager.preloadBGM = function (audioObject) {
        this.preloadAudio("bgm", audioObject);
    };

    PreloadManager.preloadBGS = function (audioObject) {
        this.preloadAudio("bgs", audioObject);
    };

    PreloadManager.preloadSE = function (audioObject) {
        this.preloadAudio("se", audioObject);
    }

    PreloadManager.preloadME = function (audioObject) {
        this.preloadAudio("me", audioObject);
    }

    PreloadManager.preloadAudio = function (type, audioObject) {
        if (!audioObject) return;
        if (audioObject.constructor === Array) {
            for (var i = 0, max = audioObject.length; i < max; i++) {
                this.preloadAudio(type, audioObject[i]);
            }
        } else {
            if (audioObject.name.length <= 0) return;
            if (this.isAudioCached(type, audioObject.name)) {
                if (debug) console.log(type + "/" + audioObject.name + " already preloaded; skipping.");
                return;
            }
            this._increaseFileNums();
            this.controlAudioFileExistence(type, audioObject.name);
            var bufferObject = AudioManager.createBuffer(type, audioObject.name);
            bufferObject.addLoadListener(this.onAudioFileLoaded.bind(this, type, audioObject.name));
        }
    }

    PreloadManager.preloadAnimation = function (animationId) {
        var animation = $dataAnimations[animationId];
        this.preloadImages('animation', [animation.animation1Name, animation.animation2Name]);
        for (var i = 0, max = animation.timings.length; i < max; i++) {
            var se = animation.timings[i].se;
            this.preloadSE(se);
        }
    }

    PreloadManager.preloadMapResources = function (mapId) {
        this._ready = false;
        // Wait and ensure map is loaded
        if (!DataManager.isMapDataLoaded()) return setTimeout(this.preloadMapResources.bind(this, mapId), 100);
        var mapDebugName = mapId + " (" + $dataMapInfos[mapId].name + ")";
        if (this._preloadedMaps.indexOf(mapId) > -1) {
            if (debug) console.log("Map " + mapDebugName + " already preloaded, skipping.");
        } else {
            if (debug) console.log("Map " + mapDebugName + " preload starting.");
            // Map is loaded, preload resources now
            this.preloadBGM($dataMap.bgm);
            this.preloadBGS($dataMap.bgs);
            this.preloadImages('battleback1', $dataMap.battleback1Name);
            this.preloadImages('battleback2', $dataMap.battleback2Name);
            this.preloadImages('parallax', $dataMap.parallaxName);
            // Cycle events and load appropriate resources
            for (var i = 0, max = $dataMap.events.length; i < max; i++) {
                var event = $dataMap.events[i];
                if (!event) continue;
                for (var p = 0, pMax = event.pages.length; p < pMax; p++) {
                    var page = event.pages[p];
                    // Preload character graphic for page
                    this.preloadImages('character', page.image.characterName);
                    for (var l = 0, lMax = page.list.length; l < lMax; l++) {
                        var listEntry = page.list[l];
                        this.preloadEventListEntry(listEntry);
                    }
                }
            };
            this._preloadedMaps.push(mapId);
        }
        this.start(true);
    };

    PreloadManager.preloadEventListEntry = function (listEntry) {
        var code = listEntry.code;
        var parameters = listEntry.parameters;
        switch (code) {
            // Show Picture
            case 231:
                this.preloadImages('picture', parameters[1]);
                break;
            // Play BGM
            case 241:
                this.preloadBGM(parameters[0]);
                break;
            // Play BGS
            case 245:
                this.preloadBGS(parameters[0]);
                break;
            // Play ME
            case 249:
                this.preloadME(parameters[0]);
                break;
            // Play SE
            case 250:
                this.preloadSE(parameters[0]);
                break;
            // Change Parallax
            case 284:
                this.preloadImages('parallax', parameters[0]);
                break;
            // Show Text
            case 101:
                this.preloadImages('face', parameters[0]);
                break;
            // Show Animation
            case 212:
                this.preloadAnimation(parameters[1]);
                break;
        }
    };

    PreloadManager.onFileLoaded = function (filename) {
        this._filesLoaded += 1;
        if (debug) console.log("Loaded file: " + filename + "(" + this._filesLoaded + "/" + this._filesTotal + ")");
        this.controlIfReady();
    };

    PreloadManager.onAudioFileLoaded = function (type, filename) {
        this._cacheAudio(type, filename);
        this.onFileLoaded("(" + type + ") " + filename);
    };

    PreloadManager.controlIfReady = function (manual) {
        if (this.isReady()) {
            if (debug && !manual) console.log("All files loaded (" + this._filesLoaded + "/" + this._filesTotal + ")");
            this._filesTotal = this._filesLoaded = 0;
            if (this._callOnComplete) {
                this._callOnComplete.call();
            }
        }
    }

    PreloadManager._cacheAudio = function (path, filename) {
        this._preloadedAudio.push(path + filename);
    };

    PreloadManager._registerRequestedImage = function (type, filename) {
        this._sessionRequestedImages.push(type + filename);
    };

    PreloadManager._isImageRequested = function (type, filename) {
        return this._sessionRequestedImages.indexOf(type + filename) > -1;
    }

    PreloadManager.isAudioCached = function (path, filename) {
        return this._preloadedAudio.indexOf(path + filename) > -1;
    }

    PreloadManager._increaseFileNums = function () {
        this._ready = false;
        this._filesTotal += 1;
    };

    PreloadManager.isReady = function () {
        if (this._filesLoaded >= this._filesTotal) {
            if (this._ready || this._filesTotal == 0) {
                return true;
            }
        }
        return false;
    };

    var _isDatabaseLoaded = function () {
        DataManager.checkError();
        for (var i = 0; i < DataManager._databaseFiles.length; i++) {
            if (!window[DataManager._databaseFiles[i].name]) {
                return false;
            }
        }
        return true;
    }

    //=============================================================================
    // Scene_Boot extensions
    //=============================================================================
    var Scene_Boot_prototype_create =
        Scene_Boot.prototype.create;
    Scene_Boot.prototype.create = function () {
        Scene_Boot_prototype_create.call(this);
        this._performPreload();
    };

    Scene_Boot.prototype._performPreload = function () {
        if (!_isDatabaseLoaded()) return setTimeout(this._performPreload.bind(this), 5);
        if (debug) console.log("========= TDDP PreloadManager: Boot Preload =========");
        // Preload bootPreloadImages resources
        if (TDDP.bootPreloadImages) {
            for (var key in TDDP.bootPreloadImages) {
                if (TDDP.bootPreloadImages.hasOwnProperty(key)) {
                    PreloadManager.preloadImages(key, TDDP.bootPreloadImages[key]);
                }
            }
        }
        // Preload bootPreloadBGM resources
        if (TDDP.bootPreloadBGM && TDDP.bootPreloadBGM.length > 0) {
            for (var i = 0, max = TDDP.bootPreloadBGM.length; i < max; i++) {
                PreloadManager.preloadBGM({
                    name: TDDP.bootPreloadBGM[i],
                    volume: 90,
                    pitch: 100
                });
            }
        }
        // Preload bootPreloadBGS resources
        if (TDDP.bootPreloadBGS && TDDP.bootPreloadBGS.length > 0) {
            for (var i = 0, max = TDDP.bootPreloadBGS.length; i < max; i++) {
                PreloadManager.preloadBGS({
                    name: TDDP.bootPreloadBGS[i],
                    volume: 90,
                    pitch: 100
                });
            }
        }
        // Preload bootPreloadSE resources
        if (TDDP.bootPreloadSE && TDDP.bootPreloadSE.length > 0) {
            for (var i = 0, max = TDDP.bootPreloadSE.length; i < max; i++) {
                PreloadManager.preloadSE({
                    name: TDDP.bootPreloadSE[i],
                    volume: 90,
                    pitch: 100
                });
            }
        }
        // Preload bootPreloadME resources
        if (TDDP.bootPreloadME && TDDP.bootPreloadME.length > 0) {
            for (var i = 0, max = TDDP.bootPreloadME.length; i < max; i++) {
                PreloadManager.preloadME({
                    name: TDDP.bootPreloadME[i],
                    volume: 90,
                    pitch: 100
                });
            }
        }
        // Preload system SFX if set
        if (preloadSystemSFX) {
            if (debug) console.log("========= TDDP PreloadManager: Boot Preloading System SFX =========");
            for (var i = 0, max = $dataSystem.sounds.length; i < max; i++) {
                PreloadManager.preloadSE($dataSystem.sounds[i]);
            }
        }
        // Preload system BGM and ME if set
        if (preloadSystemMusic) {
            if (debug) console.log("========= TDDP PreloadManager: Boot Preloading System Music =========");
            [
                $dataSystem.titleBgm,
                $dataSystem.battleBgm,
                $dataSystem.boat.bgm,
                $dataSystem.ship.bgm,
                $dataSystem.airship.bgm,
            ].forEach(function (bgm) {
                PreloadManager.preloadBGM(bgm);
            });
            [
                $dataSystem.victoryMe,
                $dataSystem.defeatMe,
                $dataSystem.gameoverMe,
            ].forEach(function (me) {
                PreloadManager.preloadME(me);
            });
        }
        PreloadManager.start();
    };

    //=============================================================================
    // DataManager extensions
    //=============================================================================
    if (preloadOnMapLoad) {
        var DataManager_loadMapData =
            DataManager.loadMapData;
        DataManager.loadMapData = function (mapId) {
            if (debug) console.log("========= TDDP PreloadManager: Map Preload =========");
            this._preloaded = false;
            DataManager_loadMapData.call(this, mapId);
            PreloadManager.preloadMapResources(mapId);
            PreloadManager.callOnComplete(this._onPreloadDone.bind(this));
        }

        DataManager._onPreloadDone = function () {
            this._preloaded = true;
        }

        var DataManager_isMapLoaded =
            DataManager.isMapLoaded;
        DataManager.isMapLoaded = function () {
            return (this.isMapDataLoaded() && this._preloaded);
        }

        DataManager.isMapDataLoaded = function () {
            return DataManager_isMapLoaded.call(this);
        }
    }

    //=============================================================================
    // Scene_Base extensions
    //=============================================================================
    var Scene_Base_prototype_isReady =
        Scene_Base.prototype.isReady;
    Scene_Base.prototype.isReady = function () {
        if (!PreloadManager.isReady()) return false;
        return Scene_Base_prototype_isReady.call(this);
    }

    //=============================================================================
    // Html5Audio extensions
    //=============================================================================
    /**
     * Sets up the Html5 Audio.
     *
     * @static
     * @method setup
     * @param {String} url The url of the audio file
     */
    Html5Audio.setup = function (url) {
        if (!this._initialized) {
            this.initialize();
        }
        this.clear();
        this._load(url); // Changed from this._url = url to call the _load func; this func is never loaded by default
    };

    /**
     * @static
     * @method _setupEventHandlers
     * @private
     */
    Html5Audio._setupEventHandlers = function () {
        document.addEventListener('touchstart', this._onTouchStart.bind(this));
        document.addEventListener('visibilitychange', this._onVisibilityChange.bind(this));
        this._audioElement.addEventListener("canplaythrough", this._onLoadedData.bind(this)); // Changed from loaddata to canplaythrough, so it knows streaming is stable enough
        this._audioElement.addEventListener("error", this._onError.bind(this));
        this._audioElement.addEventListener("ended", this._onEnded.bind(this));
    };

    /**
     * @static
     * @method _onLoadedData
     * @private
     */
    Html5Audio._onLoadedData = function () {
        this._buffered = true;
        this._onLoad(); // I removed check for this._unlocked because that shouldn't matter
    };
})();


code:
//=============================================================================
// TKM_TachieManager.js
// ----------------------------------------------------------------------------
// Copyright (c) 2016 Tsukimi
// This software released under the MIT license.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 0.0.0 2017/02/27 リリース
// 1.0.0 2017/05/13 リニューアル
// 1.0.1 2017/05/24 立ち絵更新の時にちらつくバグ解消
//=============================================================================

/*:
 * @plugindesc 立ち絵マネージャー
 * @author Tsukimi
 *
 * @param ---------------
 * @desc -
 * @default ---立ち絵コンテナ設定---
 *
 * @param 立ち絵1_ピクチャ番号
 * @desc 立ち絵1のピクチャ番号
 * @default 20
 *
 * @param 立ち絵1_x座標
 * @desc 立ち絵1の画面上のx座標
 * @default 0
 *
 * @param 立ち絵1_y座標
 * @desc 立ち絵1の画面上のy座標
 * @default 0
 *
 * @param 立ち絵1_反転
 * @desc 立ち絵1を反転して表示するか（0=そのまま、1=反転）
 * @default 0
 *
 * @param 立ち絵2_ピクチャ番号
 * @desc 立ち絵2のピクチャ番号
 * @default 25
 *
 * @param 立ち絵2_x座標
 * @desc 立ち絵2の画面上のx座標
 * @default 600
 *
 * @param 立ち絵2_y座標
 * @desc 立ち絵2の画面上のy座標
 * @default 0
 *
 * @param 立ち絵2_反転
 * @desc 立ち絵2を反転して表示するか（0=そのまま、1=反転）
 * @default 1
 *
 * @param ---------------
 * @desc -
 * @default ---立ち絵レイヤー設定---
 *
 * @param レイヤー00名
 * @desc レイヤー00に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー01名
 * @desc レイヤー01に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー02名
 * @desc レイヤー02に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー03名
 * @desc レイヤー03に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー04名
 * @desc レイヤー04に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー05名
 * @desc レイヤー05に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー06名
 * @desc レイヤー06に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー07名
 * @desc レイヤー07に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー08名
 * @desc レイヤー08に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 * @param レイヤー09名
 * @desc レイヤー09に表示するパーツの名前(空欄のまま=このレイヤーを使用しない)
 * @default
 *
 *
 * @help
 *
 *　レイヤー式立ち絵マネージャー
 * 作者：ツキミ
 *
 * 説明：
 * レイヤー式立ち絵のマネージャーです。
 * 立ち絵のコンテナに、パーツを自動的に一枚絵に合成し表示します。
 * その後普通にピクチャの移動などもできます。
 *
 * ***************************************************
 * プラグインコマンド：
 *  イベントコマンド「プラグインコマンド」から実行。
 *  （パラメータの間は半角スペースで区切る）
 *
 * tachie_Register [キャラ名]
 *     システムに[キャラ名]を登録します。
 *     例：tachie_Register sizuru
 *
 *
 * tachie_ChangePart [キャラ名] [レイヤー名] [パーツ番号]
 * tachie_CP [キャラ名] [レイヤー名] [パーツ番号]
 *     キャラのパーツの番号を設定します。デフォルトでは全部0です。
 *     例：tachie_ChangePart sizuru body 1
 *     　　tachie_CP sizuru body 1
 *
 * ※CPはChangePartの短縮表示で、効果が同じです
 *
 *
 * tachie_SetChar [立ち絵番号] [キャラ名]
 *     立ち絵のコンテナに表示するキャラを設定します。
 *     （まだ描画してません）
 *     例：tachie_SetChar 1 sizuru
 *
 *
 * tachie_Draw [立ち絵番号] [オプション]
 *     立ち絵のコンテナに設定されたキャラを描画します。
 *     オプション：
 *         invisible: 不透明度0でピクチャの表示（主にフェード演出用など）
 *         inv: 上と同じ
 *     例：tachie_Draw 1 inv
 *     　　tachie_Draw 2
 *
 *
 * tachie_Clear [立ち絵番号]
 *     立ち絵のコンテナに描画された立ち絵を消します。ピクチャの消去と効果は同じ
 *     例：tachie_Clear 1
 *
 *
 * ***************************************************
 *
 * 作者のサイト： http://tsukimitsf.blog.fc2.com/
 * バグなどがあったら、是非こちらへご一報ください。ありがとうございます。
 */
var $TKMvar = $TKMvar || {};
$TKMvar.tachie = $TKMvar.tachie || {};

$TKMvar.tachie.CharList; // is {} ; "キャラ名": [ 各レイヤーの番号[] ]
$TKMvar.tachie.PicData = [];  // 各立ち絵のピクチャの番号、xy座標、現キャラなど

$TKMvar.tachie.PicData[0] = {}; // 左に表示するピクチャ；立ち絵1
$TKMvar.tachie.PicData[1] = {}; // 右に表示するピクチャ；立ち絵2
// カスタマイズするならここに PicData[2] =　{} などを追加

$TKMvar.tachie.partsNameArr = [];  // 各レイヤーのパーツ名

$TKMvar.tachie.MaxLayer = 10; // 0~9; このプラグインをカスタマイズする時に、ここを調整

(function () {
    "use strict";

    $TKMvar.tachie.preloadBitmap = function (tachieNum) {
        // 取得
        var PicData = $TKMvar.tachie.PicData;
        var MaxLayer = $TKMvar.tachie.MaxLayer;

        // 配列を作成
        if (!PicData[tachieNum]["bitmap"]) PicData[tachieNum]["bitmap"] = [];

        var name = PicData[tachieNum]["char"];          // 設定されたキャラの名前
        var partList = $TKMvar.tachie.CharList[name];    // キャラのパーツ番号を取得

        for (var i = 0; i < MaxLayer; i++) {
            // パーツ番号が0だったら省略する
            if (partList[i] === 0) {
                PicData[tachieNum]["bitmap"][i] = null;
                continue;
            }
            else {
                PicData[tachieNum]["bitmap"][i] =
                    ImageManager.loadPicture(name + "_" + $TKMvar.tachie.partsNameArr[i] + "_" + partList[i], 0);
            }
        }
    };

    // 初期値の設定
    // 新しくゲームを始めた時に呼ばれる
    var createGameObjects = DataManager.createGameObjects;
    DataManager.createGameObjects = function () {
        createGameObjects.call(this);
        $TKMvar.tachie.CharList = {};
        var PicData = $TKMvar.tachie.PicData;
        for (var i = 0; i < PicData.length; i++) {
            PicData[i]["char"] = ""; // 現キャラ名を "" にする
            PicData[i]["bitmap"] = null;
        }
    };

    // セーブデータの生成
    // 返り値がセーブされるのでデータをcontentsに追加して返す
    var makeSaveContents = DataManager.makeSaveContents;
    DataManager.makeSaveContents = function () {
        var contents = makeSaveContents.call(this);
        contents.TKMvar_tachieList = $TKMvar.tachie.CharList;

        var PicData = $TKMvar.tachie.PicData;
        // 現キャラだけセーブ
        contents.TKMvar_tachieCurr = [];
        for (var i = 0; i < PicData.length; i++) {
            contents.TKMvar_tachieCurr[i] = PicData[i]["char"];
        }
        return contents;
    };

    // セーブデータの読み込み
    // 生成時と同じ形でデータがcontentsに入っているので、変数に格納する
    var extractSaveContents = DataManager.extractSaveContents;
    DataManager.extractSaveContents = function (contents) {
        extractSaveContents.call(this, contents);
        $TKMvar.tachie.CharList = contents.TKMvar_tachieList;
        // 現キャラをロードし、前のゲームのキャッシュを削除
        var PicData = $TKMvar.tachie.PicData;
        for (var i = 0; i < PicData.length; i++) {
            PicData[i]["char"] = contents.TKMvar_tachieCurr[i];
            PicData[i]["bitmap"] = null;
        }

    };

    // parameterの処理
    var param = PluginManager.parameters('TKM_TachieManager');

    for (var i = 0; i < $TKMvar.tachie.MaxLayer; i++) {
        var name = 'レイヤー' + ("00" + i).slice(-2) + '名';
        $TKMvar.tachie.partsNameArr[i] = param[name];
    }
    for (var i = 0; i < $TKMvar.tachie.PicData.length; i++) {
        $TKMvar.tachie.PicData[i]["picNum"] = parseInt(param['立ち絵' + (i + 1) + '_ピクチャ番号'], 10);
        $TKMvar.tachie.PicData[i]["x"] = parseInt(param['立ち絵' + (i + 1) + '_x座標'], 10);
        $TKMvar.tachie.PicData[i]["y"] = parseInt(param['立ち絵' + (i + 1) + '_y座標'], 10);
        $TKMvar.tachie.PicData[i]["reverse"] = parseInt(param['立ち絵' + (i + 1) + '_反転'], 10) ? true : false;
    }

    Bitmap.prototype.resizeIfSmallerThan = function (bitemp) { // 立ち絵合成に使う
        var changed = false;
        var width = this.width;
        var height = this.height;
        if (width < bitemp.width) {
            width = bitemp.width;
            changed = true;
        }
        if (height < bitemp.height) {
            height = bitemp.height;
            changed = true;
        }
        if (changed) {
            this.resize(width, height);
        }
    };

    var _Sprite_Picture_loadBitmap = Sprite_Picture.prototype.loadBitmap;
    Sprite_Picture.prototype.loadBitmap = function () {
        if (this._pictureName.substr(0, 10) !== "TKMtachie_") {
            _Sprite_Picture_loadBitmap.call(this);
        }
        else { // ピクチャのname要素の接頭が TKMtachie_ だったら
            // 取得
            var PicData = $TKMvar.tachie.PicData;
            var MaxLayer = $TKMvar.tachie.MaxLayer;

            if (!this.bitmap || !this.bitmap.isTachie) { // Tachie専用のbitmapかどうか
                // this.bitmap = new Bitmap(Graphics.width, Graphics.height);
                this.bitmap = new Bitmap(1, 1);
                this.bitmap.isTachie = true;
                this.bitmap.smooth = true;
            }

            var HasController = false;
            for (var i = 0; i < PicData.length; i++) {
                if (this._pictureId === PicData[i]["picNum"]) { // このSprite_Pictureに対応するPicDataを探す
                    HasController = true;

                    // ** first check if all loaded
                    // *  if no ["bitmap"], call preload and pass
                    var loaded = true;
                    if (!PicData[i]["bitmap"]) { // 主にニューゲームとロードゲームの時
                        $TKMvar.tachie.preloadBitmap(i);
                        this._pictureName = "TKMtachie_"; // wait for all loaded (if _pictureName !== picture's name, will execute loadBitmap again)
                        break;
                    }
                    // *  ["bitmap"] exists; check if somebody still loading
                    for (var j = 0; j < MaxLayer; j++) {
                        var bitemp = PicData[i]["bitmap"][j]; // i: 立ち絵番号, j: パーツ番号
                        if (bitemp) {
                            if (!bitemp.isReady()) {
                                loaded = false;
                                break;
                            }
                        }
                    }
                    // ** if not loaded
                    if (!loaded) {
                        this._pictureName = "TKMtachie_"; // wait for all loaded (if _pictureName !== picture's name, will execute loadBitmap again)
                        break;
                    }
                    // 全パーツのbitmpのロードが終わったら、描画する
                    this.bitmap.clear();
                    this.setFrame(0, 0, 0, 0); // 描画範囲を各パーツを描画できるように拡大
                    for (var j = 0; j < MaxLayer; j++) {
                        var bitemp = PicData[i]["bitmap"][j];
                        if (bitemp) {
                            this.bitmap.resizeIfSmallerThan(bitemp);
                        }
                    }
                    // 反転するかどうか
                    var doReverse = PicData[i]["reverse"];
                    if (doReverse) { // TODO: transformは遅い、もっといい方法ないか？
                        this.bitmap.context.save();
                        this.bitmap.context.translate(this.bitmap.width, 0);
                        this.bitmap.context.scale(-1, 1);
                    }
                    // 本当の描画
                    for (var j = 0; j < MaxLayer; j++) {
                        var bitemp = PicData[i]["bitmap"][j];
                        if (bitemp) {
                            // this.bitmap.resizeIfSmallerThan(bitemp);
                            this.bitmap.context.drawImage(bitemp.canvas, 0, 0);
                        }
                    }

                    this.bitmap._setDirty();
                    if (doReverse) this.bitmap.context.restore(); // 反転の後始末
                    //this._onBitmapLoad(); // ←アツマールコアでは無効になった
                    // 描画範囲をbitmapに合わせる
                    this._frame.width = this._bitmap.width;
                    this._frame.height = this._bitmap.height;
                    this._refresh();
                    break;
                }
            }
            if (!HasController) {
                $gameScreen.picture(this._pictureId)._name = "";
                this._pictureName = '';
                this.bitmap = null;
            }
        }
        // end of function
    };

    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function (command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);

        // commandの処理
        switch ((command || '')) {
            case 'tachie_Register':         // tachie_Register [キャラ名]
                var charName = args[0];
                // 取得
                var CharList = $TKMvar.tachie.CharList;
                var MaxLayer = $TKMvar.tachie.MaxLayer;
                CharList[charName] = []; // 新しいキャラのパーツ番号の配列を作る

                for (var i = 0; i < MaxLayer; i++) {
                    CharList[charName][i] = 0; // すべてのパーツのデフォルト値は0
                }
                break;

            case 'tachie_CP':               // tachie_CP [キャラ名] [レイヤー番号] [パーツ番号]
            case 'tachie_ChangePart':       // tachie_ChangePart [キャラ名] [レイヤー番号] [パーツ番号]
                if (!(args[0] in $TKMvar.tachie.CharList)) break; // そんなキャラ名が登録されなかったら無視する

                // 取得
                var CharList = $TKMvar.tachie.CharList;
                var MaxLayer = $TKMvar.tachie.MaxLayer;
                var PicData = $TKMvar.tachie.PicData;

                // パーツの名前に対応するレイヤーを探す
                var layerNum = -1;
                for (var i = 0; i < MaxLayer; i++) {
                    if ($TKMvar.tachie.partsNameArr[i] === args[1]) {
                        layerNum = i; break;
                    }
                }
                if (layerNum === -1) break; // そんなレイヤー名がなかったら無視する

                var partNum = parseInt(args[2], 10) || 0;
                if (CharList[args[0]][layerNum] === partNum) break; // パーツが同じなら変更する必要ない
                CharList[args[0]][layerNum] = partNum;

                // ついでにそのパーツのbitmapをキャッシュしよう
                for (var i = 0; i < PicData.length; i++) {
                    if (PicData[i]["char"] == args[0]) {
                        // bitmap [] の存在確認
                        if (!PicData[i]["bitmap"]) $TKMvar.tachie.preloadBitmap(i);
                        if (partNum === 0) PicData[i]["bitmap"][layerNum] = null;
                        else PicData[i]["bitmap"][layerNum] =
                            ImageManager.loadPicture(args[0] + "_" + $TKMvar.tachie.partsNameArr[layerNum] + "_" + partNum, 0);
                    }
                }

                break;

            case 'tachie_SetChar':          // tachie_SetChar [立ち絵番号] [キャラ名]
                var tachieNum = parseInt(args[0], 10) || 0; // 立ち絵1か2か、それとも…
                tachieNum--; // データ上は0から
                if (tachieNum === -1) break;

                // 取得
                var CharList = $TKMvar.tachie.CharList;
                var MaxLayer = $TKMvar.tachie.MaxLayer;
                var PicData = $TKMvar.tachie.PicData;

                if ($TKMvar.tachie.PicData[tachieNum]["char"] === args[1]) break; // キャラが同じなら変更する必要ない

                if (args[1] in CharList) {
                    if (PicData.length > tachieNum) {
                        PicData[tachieNum]["char"] = args[1];

                        PicData[tachieNum]["bitmap"] = null;
                        PicData[tachieNum]["bitmap"] = [];

                        // preload bitmap
                        /*
                        var partList= $TKMvar.tachie.CharList[args[1]];
                        for(var i = 0; i < $TKMvar.tachie.MaxLayer; i++) {
                            if(partList[i] === 0) {
                                $TKMvar.tachie.PicData[tachieNum]["bitmap"][i] = null;
                                continue;
                            }
                            else {
                                $TKMvar.tachie.PicData[tachieNum]["bitmap"][i] = ImageManager.loadPicture(args[1] + "_" + $TKMvar.tachie.partsNameArr[i] + "_" + partList[i], 0);
                            }

                        }*/
                        $TKMvar.tachie.preloadBitmap(tachieNum);

                    }
                }
                break;

            case 'tachie_Draw':             // tachie_Draw [立ち絵番号] [オプション]
                var tachieNum = parseInt(args[0], 10) || 0; // 立ち絵1か2か、それとも…
                tachieNum--; // データ上は0から
                if (tachieNum === -1) break;
                if ($TKMvar.tachie.PicData.length <= tachieNum) break;
                if (!$TKMvar.tachie.PicData[tachieNum]["char"]) break;

                // 取得
                var CharList = $TKMvar.tachie.CharList;
                var MaxLayer = $TKMvar.tachie.MaxLayer;
                var PicData = $TKMvar.tachie.PicData;

                var pictureId = PicData[tachieNum]["picNum"];
                // ピクチャの名前を設定: "TKMtachie_[キャラ]_[すべてのパーツ番号]"
                var char = PicData[tachieNum]["char"];
                var name = "TKMtachie_" + char + "_";
                var partList = CharList[char];
                for (var i = 0; i < $TKMvar.tachie.MaxLayer; i++) {
                    name += partList[i];
                }
                var x = $TKMvar.tachie.PicData[tachieNum]["x"];
                var y = $TKMvar.tachie.PicData[tachieNum]["y"];
                // TODO

                // オプション
                if (!args[1]) {
                    $gameScreen.showPicture(pictureId, name, 0, x, y, 100, 100, 255, 0);
                }
                else {
                    switch (args[1].toUpperCase()) {
                        case 'INV':
                        case 'INVISIBLE':
                            $gameScreen.showPicture(pictureId, name, 0, x, y, 100, 100, 0, 0);
                            break;

                        default:
                            $gameScreen.showPicture(pictureId, name, 0, x, y, 100, 100, 255, 0);
                            break;
                    }
                }
                break;

            case 'tachie_Clear':            // tachie_Clear [立ち絵番号]
                var tachieNum = parseInt(args[0], 10) || 0; // 立ち絵1か2か、それとも…
                tachieNum--; // データ上は0から
                if (tachieNum === -1) break;
                if ($TKMvar.tachie.PicData.length <= tachieNum) break;

                $gameScreen.erasePicture($TKMvar.tachie.PicData[tachieNum]["picNum"]);
                // $TKMvar.tachie.PicData[tachieNum]["char"] = "";
                break;
        }

    };

})();

repo_name: dazed/translations

license: unknown


code:
//=============================================================================
// TMVplugin - フキダシループ
// 作者: tomoaky (http://hikimoki.sakura.ne.jp/)
// Version: 1.11
// 最終更新日: 2016/06/20
//=============================================================================

/*:
 * @plugindesc フキダシアイコンをループ表示させます。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @help
 * 使い方:
 *   プラグインコマンドまたはメモ欄タグを使ってイベントにフキダシループを設
 *   定すると、指定されたフキダシアイコンが繰り返し表示され続けるようになり
 *   ます。
 *
 *   イベントのメモ欄以外に、実行内容の一番上にある注釈コマンド内でも同様の
 *   タグでフキダシループを設定することができます。メモ欄と注釈の両方にタグ
 *   がある場合は注釈が優先されます。
 *
 *   プラグインコマンドによるフキダシループは、イベントページの切り替わりや
 *   イベントコマンド『イベントの一時消去』などによって解除されます。
 *
 * プラグインコマンド:
 *   setBalloonLoop 2 1
 *   ２番のイベントにフキダシループとしてびっくりアイコンを設定します。イベ
 *   ント番号は -1 ならプレイヤー、0 ならコマンドを実行しているイベントが対
 *   象となります。
 *   表示するアイコンの番号はイベントコマンド『フキダシアイコンの表示』での
 *   並びに対応していて、0 を指定するとフキダシループが解除されます。
 *
 * メモ欄タグ（イベント）:
 *   <balloonLoop:1>
 *   このタグがついているイベントは setBalloonLoop を実行しなくても自動的に
 *   フキダシループが設定されます。数値は表示するアイコン番号です。
 *
 */

var Imported = Imported || {};
Imported.TMBalloonLoop = true;

if (!Imported.TMEventBase) {
  Imported.TMEventBase = true;
  (function () {

    //-----------------------------------------------------------------------------
    // Game_Event
    //

    var _Game_Event_setupPage = Game_Event.prototype.setupPage;
    Game_Event.prototype.setupPage = function () {
      _Game_Event_setupPage.call(this);
      if (this._pageIndex >= 0) {
        this.loadCommentParams();
      }
    };

    Game_Event.prototype.loadCommentParams = function () {
      this._commentParams = {};
      var re = /<([^<>:]+)(:?)([^>]*)>/g;
      var list = this.list();
      for (var i = 0; i < list.length; i++) {
        var command = list[i];
        if (command && command.code == 108 || command.code == 408) {
          for (; ;) {
            var match = re.exec(command.parameters[0]);
            if (match) {
              if (match[2] === ':') {
                this._commentParams[match[1]] = match[3];
              } else {
                this._commentParams[match[1]] = true;
              }
            } else {
              break;
            }
          }
        } else {
          break;
        }
      }
    };

    Game_Event.prototype.loadTagParam = function (paramName) {
      if (this._commentParams[paramName]) {
        return this._commentParams[paramName];
      } else if (this.event().meta[paramName]) {
        return this.event().meta[paramName];
      } else {
        return null;
      }
    };

  })();
}

(function () {

  //-----------------------------------------------------------------------------
  // Game_CharacterBase
  //

  var _Game_CharacterBase_endBalloon = Game_CharacterBase.prototype.endBalloon;
  Game_CharacterBase.prototype.endBalloon = function () {
    _Game_CharacterBase_endBalloon.call(this);
    var balloonLoop = this.balloonLoop();
    if (balloonLoop) {
      this.requestBalloon(balloonLoop);
    }
  };

  Game_CharacterBase.prototype.setBalloonLoop = function (balloonLoop) {
    this._balloonLoop = balloonLoop;
  };

  Game_CharacterBase.prototype.balloonLoop = function () {
    return this._balloonLoop;
  };

  //-----------------------------------------------------------------------------
  // Game_Event
  //

  var _Game_Event_setupPage = Game_Event.prototype.setupPage;
  Game_Event.prototype.setupPage = function () {
    _Game_Event_setupPage.call(this);
    if (this._pageIndex >= 0) {
      var balloonLoop = +this.loadTagParam('balloonLoop');
      if (balloonLoop) {
        this.setBalloonLoop(balloonLoop);
      }
    } else {
      this.setBalloonLoop(0);
    }
  };

  //-----------------------------------------------------------------------------
  // Game_Interpreter
  //

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'setBalloonLoop') {
      var character = this.character(+args[0]);
      if (character) {
        character.setBalloonLoop(+args[1]);
      }
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_Character
  //

  var _Sprite_Character_endBalloon = Sprite_Character.prototype.endBalloon;
  Sprite_Character.prototype.endBalloon = function () {
    var balloonLoop = this._character.balloonLoop();
    if (balloonLoop) {
      this._balloonSprite.setup(balloonLoop);
    } else {
      _Sprite_Character_endBalloon.call(this);
    }
  };

})();


code:
//=============================================================================
// TMPlugin - 魔法スロット
// バージョン: 1.2.0
// 最終更新日: 2018/10/25
// 配布元　　: https://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc 通常の装備とは別に魔法を記憶するシステムを追加します。
 *
 * @author tomoaky (https://hikimoki.sakura.ne.jp/)
 *
 * @param menuCommand
 * @desc メニューシーンに追加するコマンド。
 * 初期値: 魔法の記憶
 * @default 魔法の記憶
 *
 * @param actorSelectCommand
 * @desc 魔法記憶シーンで表示するアクター選択コマンド。
 * 初期値: アクター選択 (未入力ならコマンドを非表示にする)
 * @default アクター選択
 *
 * @param magicSlot
 * @desc 魔法記憶シーンで表示する魔法スロットのパラメータ名。
 * 初期値: 記憶スロット
 * @default 記憶スロット
 *
 * @param equipCommand
 * @desc 魔法記憶シーンで表示する装備コマンド。
 * 初期値: 記憶
 * @default 記憶
 *
 * @param clearCommand
 * @type string
 * @desc 魔法記憶シーンで表示する全て外すコマンド。
 * 初期値: 全て忘れる
 * @default 全て忘れる
 *
 * @param magicTypeName
 * @type string
 * @desc 魔法として扱う武器タイプ名。
 * 初期値: 魔法
 * @default 魔法
 *
 * @param blankText
 * @type string
 * @desc 空きスロットに表示するテキスト。
 * 初期値: 空きスロット
 * @default 空きスロット
 *
 * @param slotCostColor
 * @type number
 * @max 31
 * @desc 必要な空きスロット数の文字色番号。
 * 初期値: 31
 * @default 31
 *
 * @param statusWidth
 * @type number
 * @desc 魔法記憶シーンのステータスウィンドウの幅。
 * 初期値: 340
 * @default 340
 *
 * @param maxMpText
 * @type string
 * @desc 魔法記憶シーンの最大MPの項目名。
 * 初期値: 最大%1
 * @default 最大%1
 *
 * @help
 * TMPlugin - 魔法スロット ver1.2.0
 *
 * 使い方:
 *
 *   データベースのタイプタブにある『武器タイプ』に 魔法 という名前の
 *   新しいタイプを追加してください。このタイプを設定した武器は魔法として
 *   扱われるようになります。
 *
 *   次に、魔法として扱う武器の特徴『スキル追加』に実際に記憶する魔法を
 *   設定してください。
 *
 *   アクター、あるいは職業のメモ欄に <magicSlot:1> というタグを
 *   設定してください。ここで設定した数値が記憶できる魔法の最大数になります。
 *
 *   あとはゲーム内で魔法として設定した武器を入手し、魔法記憶シーンで
 *   アクターに記憶させれば、魔法が使えるようになります。
 *
 *   このプラグインは RPGツクールMV Version 1.6.1 で動作確認をしています。
 *
 *
 * メモ欄タグ（アクター、職業、武器、防具）:
 *
 *   <magicSlot:1>
 *     記憶できる魔法の最大数が 1 増えます。実際の最大数はアクター、職業、
 *     装備している武器と防具に設定されたこのタグの合計値が採用されます。
 *
 *
 * メモ欄タグ（スキル）:
 *
 *   <magicSlotCost:1>
 *     記憶に必要なスロット数を 1 に設定します。たとえばこの値が 2 のスキルは
 *     スロットに 2 空きがないと記憶することができません。
 *
 *
 * メモ欄タグ（武器）:
 *
 *   <equippableActor:1 2>
 *     魔法を記憶することができるアクターを番号で指定します、
 *     複数のアクターを設定する場合は半角スペースで区切ってください。
 *     このタグを省略した場合はすべてのアクターが記憶可能になります。
 *
 *   <equippableClass:3>
 *     魔法を記憶することができる職業を番号で指定します、
 *     複数の職業を設定する場合は半角スペースで区切ってください。
 *     このタグを省略した場合はすべての職業が記憶可能になります。
 *
 *
 * プラグインコマンド:
 *
 *   callMagicEquip
 *     魔法記憶シーンを呼び出します。
 *
 *   callMagicEquip 2
 *     アクター 2 番の魔法記憶シーンを呼び出します。
 *     指定したアクターがパーティにいない場合はパーティの先頭にいるアクターが
 *     対象になります。
 *
 *   addMagicSlot 3 1
 *     アクター 3 番の空きスロットを 1 増やします。
 *     数値には制御文字 \V[n] が使用できます。
 *
 *
 * プラグインパラメータ補足:
 *
 *   menuCommand
 *     このパラメータに何も入力しなかった場合、メニューから魔法記憶シーンを
 *     開くことができなくなります。
 *     特定の場所でのみ魔法の入れ替えをしたい場合に利用してください、
 *     その場合はプラグインコマンド callMagicEquip で魔法記憶シーンを
 *     呼び出す必要があります。
 *
 *   magicTypeName
 *     魔法として扱う武器タイプ名を変更することができます。
 *     『魔法』というタイプ名をすでに使用している場合に変更してください。
 *
 *   slotCostColor
 *     イベントコマンド『文章の表示』などで使用する制御文字 \C[n] と同じです。
 *     0 ～ 31 の範囲で値を設定してください。
 *
 *   maxMpText
 *     魔法記憶シーンに表示するアクターの最大MPの項目名を設定します。
 *     %1 という文字列がデータベースの用語で設定したMPの文字列と置換。
 *     このパラメータが空の場合は最大MPを表示しなくなります。
 */

var Imported = Imported || {};
Imported.TMMagicSlot = true;

var TMPlugin = TMPlugin || {};
TMPlugin.MagicSlot = {};
TMPlugin.MagicSlot.Parameters = PluginManager.parameters('TMMagicSlot');
TMPlugin.MagicSlot.MenuCommand = TMPlugin.MagicSlot.Parameters['menuCommand'];
TMPlugin.MagicSlot.ActorSelectCommand = TMPlugin.MagicSlot.Parameters['actorSelectCommand'];
TMPlugin.MagicSlot.MagicSlot = TMPlugin.MagicSlot.Parameters['magicSlot'] || '記憶スロット';
TMPlugin.MagicSlot.EquipCommand = TMPlugin.MagicSlot.Parameters['equipCommand'] || '記憶';
TMPlugin.MagicSlot.ClearCommand = TMPlugin.MagicSlot.Parameters['clearCommand'] || '全て忘れる';
TMPlugin.MagicSlot.MagicTypeName = TMPlugin.MagicSlot.Parameters['magicTypeName'] || '魔法';
TMPlugin.MagicSlot.BlankText = TMPlugin.MagicSlot.Parameters['blankText'] || '空きスロット';
TMPlugin.MagicSlot.SlotCostColor = +(TMPlugin.MagicSlot.Parameters['slotCostColor'] || 31);
TMPlugin.MagicSlot.StatusWidth = +(TMPlugin.MagicSlot.Parameters['statusWidth'] || 340);
TMPlugin.MagicSlot.MaxMpText = TMPlugin.MagicSlot.Parameters['maxMpText'];

if (!TMPlugin.InterpreterBase) {
	TMPlugin.InterpreterBase = true;
	(function () {
		Game_Interpreter.prototype.convertEscapeCharactersTM = function (text) {
			text = text.replace(/\\/g, '\x1b');
			text = text.replace(/\x1b\x1b/g, '\\');
			text = text.replace(/\x1bV\[(\d+)\]/gi, function () {
				return $gameVariables.value(parseInt(arguments[1]));
			}.bind(this));
			text = text.replace(/\x1bV\[(\d+)\]/gi, function () {
				return $gameVariables.value(parseInt(arguments[1]));
			}.bind(this));
			text = text.replace(/\x1bN\[(\d+)\]/gi, function () {
				return this.actorNameTM(parseInt(arguments[1]));
			}.bind(this));
			text = text.replace(/\x1bP\[(\d+)\]/gi, function () {
				return this.partyMemberNameTM(parseInt(arguments[1]));
			}.bind(this));
			text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
			return text;
		};
		Game_Interpreter.prototype.actorNameTM = function (n) {
			var actor = n >= 1 ? $gameActors.actor(n) : null;
			return actor ? actor.name() : '';
		};
		Game_Interpreter.prototype.partyMemberNameTM = function (n) {
			var actor = n >= 1 ? $gameParty.members()[n - 1] : null;
			return actor ? actor.name() : '';
		};
	})();
} // TMPlugin.InterpreterBase

(function () {

	//-----------------------------------------------------------------------------
	// Game_Actor
	//

	var _Game_Actor_setup = Game_Actor.prototype.setup;
	Game_Actor.prototype.setup = function (actorId) {
		_Game_Actor_setup.call(this, actorId);
		this.initMagics();
	};

	var _Game_Actor_refresh = Game_Actor.prototype.refresh;
	Game_Actor.prototype.refresh = function () {
		this.releaseUnequippableMagics();
		_Game_Actor_refresh.call(this);
	};

	var _Game_Actor_traitObjects = Game_Actor.prototype.traitObjects;
	Game_Actor.prototype.traitObjects = function () {
		return _Game_Actor_traitObjects.call(this).concat(this.magics());
	};

	Game_Actor.prototype.initMagics = function () {
		this._magics = [];
		this._magicSlotPlus = 0;
	};

	Game_Actor.prototype.magics = function () {
		this._magics = this._magics || [];
		return this._magics.map(function (itemId) {
			return $dataWeapons[itemId];
		});
	};

	Game_Actor.prototype.magicSlotPlus = function () {
		this._magicSlotPlus = this._magicSlotPlus || 0;
		return this._magicSlotPlus;
	};

	Game_Actor.prototype.magicSlots = function () {
		var objects = [this.actor(), this.currentClass()];
		var equips = this.equips();
		for (var i = 0; i < equips.length; i++) {
			var item = equips[i];
			if (item) objects.push(item);
		}
		var result = objects.reduce(function (n, item) {
			return n + (+item.meta.magicSlot || 0);
		}.bind(this), this.magicSlotPlus());
		return Math.max(result, 0);
	};

	Game_Actor.prototype.totalMagicSlotCost = function () {
		return this.magics().reduce(function (n, item) {
			return n + (+item.meta.magicSlotCost || 1);
		}.bind(this), 0);
	};

	Game_Actor.prototype.blankMagicSlots = function () {
		return this.magicSlots() - this.totalMagicSlotCost();
	};

	Game_Actor.prototype.releaseUnequippableMagics = function (forcing) {
		for (; ;) {
			var magics = this.magics();
			var magicSlots = this.magicSlots();
			var totalCost = this.totalMagicSlotCost();
			if (magicSlots < totalCost) {
				var itemId = this._magics.pop();
				if (!forcing) {
					$gameParty.gainItem($dataWeapons[itemId], 1);
				}
			} else {
				break;
			}
		}
	};

	Game_Actor.prototype.changeMagic = function (slotId, item) {
		var oldItem = this.magics()[slotId];
		if (oldItem) $gameParty.gainItem(oldItem, 1);
		if (item) {
			this._magics[slotId] = item.id;
			$gameParty.loseItem(item, 1);
		} else {
			this._magics.splice(slotId, 1);
		}
	};

	Game_Actor.prototype.clearMagics = function () {
		while (this.magics().length > 0) {
			this.changeMagic(0, null);
		}
	};

	Game_Actor.prototype.addMagicSlot = function (value) {
		this._magicSlotPlus = this._magicSlotPlus || 0;
		this._magicSlotPlus += value;
		this.refresh();
	};

	//-----------------------------------------------------------------------------
	// Game_Interpreter
	//

	var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
	Game_Interpreter.prototype.pluginCommand = function (command, args) {
		_Game_Interpreter_pluginCommand.call(this, command, args);
		if (command === 'callMagicEquip') {
			if (args[0]) {
				var arr = args.map(this.convertEscapeCharactersTM, this);
				var actor = $gameActors.actor(+arr[0]);
				if (actor) {
					$gameParty.setMenuActor(actor);
				}
			}
			SceneManager.push(Scene_MagicEquip);
		} else if (command === 'addMagicSlot') {
			var arr = args.map(this.convertEscapeCharactersTM, this);
			var actor = $gameActors.actor(+arr[0]);
			if (actor) {
				actor.addMagicSlot(+arr[1]);
			}
		}
	};

	//-----------------------------------------------------------------------------
	// Window_MenuCommand
	//

	var _Window_MenuCommand_addMainCommands = Window_MenuCommand.prototype.addMainCommands;
	Window_MenuCommand.prototype.addMainCommands = function () {
		_Window_MenuCommand_addMainCommands.call(this);
		var enabled = this.areMainCommandsEnabled();
		if (TMPlugin.MagicSlot.MenuCommand) {
			this.addCommand(TMPlugin.MagicSlot.MenuCommand, 'magicEquip', enabled);
		}
	};

	//-----------------------------------------------------------------------------
	// Window_MagicStatus
	//

	function Window_MagicStatus() {
		this.initialize.apply(this, arguments);
	}

	Window_MagicStatus.prototype = Object.create(Window_Base.prototype);
	Window_MagicStatus.prototype.constructor = Window_MagicStatus;

	Window_MagicStatus.prototype.initialize = function (x, y) {
		var width = this.windowWidth();
		var height = this.windowHeight();
		Window_Base.prototype.initialize.call(this, x, y, width, height);
		this._actor = null;
		this.refresh();
	};

	Window_MagicStatus.prototype.windowWidth = function () {
		return TMPlugin.MagicSlot.StatusWidth;
	};

	Window_MagicStatus.prototype.windowHeight = function () {
		return this.fittingHeight(this.numVisibleRows());
	};

	Window_MagicStatus.prototype.numVisibleRows = function () {
		return TMPlugin.MagicSlot.MaxMpText ? 3 : 2;
	};

	Window_MagicStatus.prototype.setActor = function (actor) {
		if (this._actor !== actor) {
			this._actor = actor;
			this.refresh();
		}
	};

	Window_MagicStatus.prototype.refresh = function () {
		this.contents.clear();
		if (this._actor) {
			var x = this.textPadding();
			var lineHeight = this.lineHeight();
			var width = this.contents.width - x * 2;
			this.drawActorName(this._actor, x, 0);
			this.changeTextColor(this.systemColor());
			this.drawText(TMPlugin.MagicSlot.MagicSlot, x, lineHeight, width);
			this.changeTextColor(this.normalColor());
			var text = '' + this._actor.totalMagicSlotCost() + ' / ' + this._actor.magicSlots();
			this.drawText(text, x, lineHeight, width, 'right');
			if (TMPlugin.MagicSlot.MaxMpText) {
				this.changeTextColor(this.systemColor());
				this.drawText(TMPlugin.MagicSlot.MaxMpText.format(TextManager.mp),
					x, lineHeight * 2, width);
				this.changeTextColor(this.normalColor());
				this.drawText(this._actor.mmp, x, lineHeight * 2, width, 'right');
			}
		}
	};

	//-----------------------------------------------------------------------------
	// Window_MagicCommand
	//

	function Window_MagicCommand() {
		this.initialize.apply(this, arguments);
	}

	Window_MagicCommand.prototype = Object.create(Window_HorzCommand.prototype);
	Window_MagicCommand.prototype.constructor = Window_MagicCommand;

	Window_MagicCommand.prototype.initialize = function (x, y, width) {
		this._windowWidth = width;
		Window_HorzCommand.prototype.initialize.call(this, x, y);
	};

	Window_MagicCommand.prototype.windowWidth = function () {
		return this._windowWidth;
	};

	Window_MagicCommand.prototype.maxCols = function () {
		return TMPlugin.MagicSlot.ActorSelectCommand ? 3 : 2;
	};

	Window_MagicCommand.prototype.makeCommandList = function () {
		this.addCommand(TMPlugin.MagicSlot.EquipCommand, 'equip');
		this.addCommand(TMPlugin.MagicSlot.ClearCommand, 'clear');
		if (TMPlugin.MagicSlot.ActorSelectCommand) {
			this.addCommand(TMPlugin.MagicSlot.ActorSelectCommand, 'actorSelect');
		}
	};

	//-----------------------------------------------------------------------------
	// Window_MagicSlot
	//

	function Window_MagicSlot() {
		this.initialize.apply(this, arguments);
	}

	Window_MagicSlot.prototype = Object.create(Window_Selectable.prototype);
	Window_MagicSlot.prototype.constructor = Window_MagicSlot;

	Window_MagicSlot.prototype.initialize = function (x, y, width) {
		var height = this.fittingHeight(5);
		Window_Selectable.prototype.initialize.call(this, x, y, width, height);
		this._actor = null;
		this.refresh();
	};

	Window_MagicSlot.prototype.setActor = function (actor) {
		if (this._actor !== actor) {
			this._actor = actor;
			this.refresh();
		}
	};

	Window_MagicSlot.prototype.update = function () {
		Window_Selectable.prototype.update.call(this);
		if (this._itemWindow) {
			var blankSlots = this._actor && this.index() >= 0 ? this._actor.blankMagicSlots() : 0;
			var item = this.item();
			if (item) blankSlots += (+item.meta.magicSlotCost || 1);
			this._itemWindow.setBlankSlots(blankSlots);
		}
	};

	Window_MagicSlot.prototype.maxItems = function () {
		return this._actor ? this._actor.magics().length + this._actor.blankMagicSlots() : 0;
	};

	Window_MagicSlot.prototype.item = function () {
		return this._actor ? this._actor.magics()[this.index()] : null;
	};

	Window_MagicSlot.prototype.drawItem = function (index) {
		if (this._actor) {
			var rect = this.itemRectForText(index);
			var item = this._actor.magics()[index];
			this.changeTextColor(this.normalColor());
			if (item) {
				this.drawItemName(item, rect.x, rect.y, rect.width);
				this.changeTextColor(this.textColor(TMPlugin.MagicSlot.SlotCostColor));
				this.drawText(item.meta.magicSlotCost || '1', rect.x, rect.y, rect.width, 'right');
			} else {
				this.drawText(TMPlugin.MagicSlot.BlankText, rect.x, rect.y, rect.width);
			}
		}
	};

	Window_MagicSlot.prototype.isEnabled = function (index) {
		return true;
	};

	Window_MagicSlot.prototype.isCurrentItemEnabled = function () {
		return this.isEnabled(this.index());
	};

	Window_MagicSlot.prototype.setItemWindow = function (itemWindow) {
		this._itemWindow = itemWindow;
		this.update();
	};

	Window_MagicSlot.prototype.updateHelp = function () {
		Window_Selectable.prototype.updateHelp.call(this);
		this.setHelpWindowItem(this.item());
	};

	//-----------------------------------------------------------------------------
	// Window_MagicItem
	//

	function Window_MagicItem() {
		this.initialize.apply(this, arguments);
	}

	Window_MagicItem.prototype = Object.create(Window_ItemList.prototype);
	Window_MagicItem.prototype.constructor = Window_MagicItem;

	Window_MagicItem.prototype.initialize = function (x, y, width, height) {
		Window_ItemList.prototype.initialize.call(this, x, y, width, height);
		this._actor = null;
		this._blankSlots = 0;
	};

	Window_MagicItem.prototype.setActor = function (actor) {
		if (this._actor !== actor) {
			this._actor = actor;
			this.refresh();
			this.resetScroll();
		}
	};

	Window_MagicItem.prototype.setBlankSlots = function (blankSlots) {
		if (this._blankSlots !== blankSlots) {
			this._blankSlots = blankSlots;
			this.refresh();
			this.resetScroll();
		}
	};

	Window_MagicItem.prototype.includes = function (item) {
		if ($dataSystem.weaponTypes[item.wtypeId] !== TMPlugin.MagicSlot.MagicTypeName) {
			return false;
		}
		if (this._actor.magics().some(function (magic) {
			return item == magic;
		})) return false;
		if (item.meta.equippableActor) {
			var actorId = this._actor.actorId();
			if (!item.meta.equippableActor.split(" ").map(Number).some(function (id) {
				return actorId === id;
			})) return false;
		}
		if (item.meta.equippableClass) {
			var classId = this._actor._classId;
			if (!item.meta.equippableClass.split(" ").map(Number).some(function (id) {
				return classId === id;
			})) return false;
		}
		return this._blankSlots >= +(item.meta.magicSlotCost || 1);
	};

	Window_MagicItem.prototype.isEnabled = function (item) {
		return true;
	};

	Window_MagicItem.prototype.makeItemList = function () {
		this._data = $gameParty.weapons().filter(function (item) {
			return this.includes(item);
		}, this);
		this._data.push(null);
	};

	Window_MagicItem.prototype.selectLast = function () {
	};

	Window_MagicItem.prototype.playOkSound = function () {
	};

	//-----------------------------------------------------------------------------
	// Scene_Menu
	//

	var _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
	Scene_Menu.prototype.createCommandWindow = function () {
		_Scene_Menu_createCommandWindow.call(this);
		this._commandWindow.setHandler('magicEquip', this.commandPersonal.bind(this));
	};

	var _Scene_Menu_onPersonalOk = Scene_Menu.prototype.onPersonalOk;
	Scene_Menu.prototype.onPersonalOk = function () {
		_Scene_Menu_onPersonalOk.call(this);
		if (this._commandWindow.currentSymbol() === 'magicEquip') {
			SceneManager.push(Scene_MagicEquip);
		}
	};

	//-----------------------------------------------------------------------------
	// Scene_MagicEquip
	//

	function Scene_MagicEquip() {
		this.initialize.apply(this, arguments);
	}

	Scene_MagicEquip.prototype = Object.create(Scene_MenuBase.prototype);
	Scene_MagicEquip.prototype.constructor = Scene_MagicEquip;

	Scene_MagicEquip.prototype.initialize = function () {
		Scene_MenuBase.prototype.initialize.call(this);
	};

	Scene_MagicEquip.prototype.create = function () {
		Scene_MenuBase.prototype.create.call(this);
		this.createHelpWindow();
		this.createStatusWindow();
		this.createCommandWindow();
		this.createSlotWindow();
		this.createItemWindow();
		this.createActorSelectWindow();
		this.refreshActor();
	};

	Scene_MagicEquip.prototype.start = function () {
		Scene_MenuBase.prototype.start.call(this);
		if (TMPlugin.MagicSlot.ActorSelectCommand) {
			this._actorSelectWindow.refresh();
		}
	};

	Scene_MagicEquip.prototype.createStatusWindow = function () {
		this._statusWindow = new Window_MagicStatus(0, this._helpWindow.height);
		this.addWindow(this._statusWindow);
	};

	Scene_MagicEquip.prototype.createCommandWindow = function () {
		var wx = this._statusWindow.width;
		var wy = this._helpWindow.height;
		var ww = Graphics.boxWidth - this._statusWindow.width;
		this._commandWindow = new Window_MagicCommand(wx, wy, ww);
		this._commandWindow.setHelpWindow(this._helpWindow);
		this._commandWindow.setHandler('equip', this.commandEquip.bind(this));
		this._commandWindow.setHandler('clear', this.commandClear.bind(this));
		this._commandWindow.setHandler('actorSelect', this.commandActorSelect.bind(this));
		this._commandWindow.setHandler('cancel', this.popScene.bind(this));
		this._commandWindow.setHandler('pagedown', this.nextActor.bind(this));
		this._commandWindow.setHandler('pageup', this.previousActor.bind(this));
		this.addWindow(this._commandWindow);
	};

	Scene_MagicEquip.prototype.createSlotWindow = function () {
		var wx = this._statusWindow.width;
		var wy = this._commandWindow.y + this._commandWindow.height;
		var ww = Graphics.boxWidth - this._statusWindow.width;
		this._slotWindow = new Window_MagicSlot(wx, wy, ww);
		this._slotWindow.setHelpWindow(this._helpWindow);
		this._slotWindow.setHandler('ok', this.onSlotOk.bind(this));
		this._slotWindow.setHandler('cancel', this.onSlotCancel.bind(this));
		this.addWindow(this._slotWindow);
	};

	Scene_MagicEquip.prototype.createItemWindow = function () {
		var wx = 0;
		var wy = Math.max(this._statusWindow.y + this._statusWindow.height,
			this._slotWindow.y + this._slotWindow.height);
		var ww = Graphics.boxWidth;
		var wh = Graphics.boxHeight - wy;
		this._itemWindow = new Window_MagicItem(wx, wy, ww, wh);
		this._itemWindow.setHelpWindow(this._helpWindow);
		this._itemWindow.setHandler('ok', this.onItemOk.bind(this));
		this._itemWindow.setHandler('cancel', this.onItemCancel.bind(this));
		this._slotWindow.setItemWindow(this._itemWindow);
		this.addWindow(this._itemWindow);
	};

	Scene_MagicEquip.prototype.createActorSelectWindow = function () {
		if (TMPlugin.MagicSlot.ActorSelectCommand) {
			this._actorSelectWindow = new Window_MenuStatus(0, 0);
			this._actorSelectWindow.setHandler('ok', this.onActorSelectOk.bind(this));
			this._actorSelectWindow.setHandler('cancel', this.onActorSelectCancel.bind(this));
			this._actorSelectWindow.reserveFaceImages();
			this._actorSelectWindow.hide();
			this.addWindow(this._actorSelectWindow);
		}
	};

	Scene_MagicEquip.prototype.refreshActor = function () {
		var actor = this.actor();
		this._statusWindow.setActor(actor);
		this._slotWindow.setActor(actor);
		this._itemWindow.setActor(actor);
	};

	Scene_MagicEquip.prototype.commandEquip = function () {
		this._slotWindow.activate();
		this._slotWindow.select(0);
	};

	Scene_MagicEquip.prototype.commandClear = function () {
		SoundManager.playEquip();
		this.actor().clearMagics();
		this._statusWindow.refresh();
		this._slotWindow.refresh();
		this._commandWindow.activate();
	};

	Scene_MagicEquip.prototype.commandActorSelect = function () {
		this._actorSelectWindow.selectLast();
		this._actorSelectWindow.show();
		this._actorSelectWindow.activate();
	};

	Scene_MagicEquip.prototype.onSlotOk = function () {
		this._itemWindow.activate();
		this._itemWindow.select(0);
	};

	Scene_MagicEquip.prototype.onSlotCancel = function () {
		this._slotWindow.deselect();
		this._commandWindow.activate();
	};

	Scene_MagicEquip.prototype.onItemOk = function () {
		SoundManager.playEquip();
		var slotId = this._slotWindow.index();
		if (slotId > this.actor().magics().length) {
			slotId = this.actor().magics().length;
		}
		this.actor().changeMagic(slotId, this._itemWindow.item());
		this._slotWindow.activate();
		this._slotWindow.refresh();
		this._itemWindow.deselect();
		this._itemWindow.refresh();
		this._statusWindow.refresh();
	};

	Scene_MagicEquip.prototype.onItemCancel = function () {
		this._slotWindow.activate();
		this._itemWindow.deselect();
	};

	Scene_MagicEquip.prototype.onActorSelectOk = function () {
		this._actorSelectWindow.hide();
		$gameParty.setMenuActor($gameParty.members()[this._actorSelectWindow.index()]);
		this.updateActor();
		this.onActorChange();
	};

	Scene_MagicEquip.prototype.onActorSelectCancel = function () {
		this._actorSelectWindow.hide();
		this._commandWindow.activate();
	};

	Scene_MagicEquip.prototype.onActorChange = function () {
		this.refreshActor();
		this._commandWindow.activate();
	};

})();


code:
//=============================================================================
// TMPlugin - メニューラベル
// バージョン: 1.1.1
// 最終更新日: 2017/02/07
// 配布元    : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc メニューシーンに変数の値を表示します。
 * 歩数や戦闘回数などを表示することもできます。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param labelAName
 * @desc ラベルＡの名前
 * 初期値: ラベルＡ
 * @default ラベルＡ
 *
 * @param labelAId
 * @desc ラベルＡのゲーム変数番号
 * 初期値: 10（ 0 で非表示 / 1 以上で表示）
 * @default 10
 *
 * @param labelAMax
 * @desc ラベルＡの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelAFooter
 * @desc ラベルＡのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelBName
 * @desc ラベルＢの名前
 * 初期値: ラベルＢ
 * @default ラベルＢ
 *
 * @param labelBId
 * @desc ラベルＢのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelBMax
 * @desc ラベルＢの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelBFooter
 * @desc ラベルＢのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelCName
 * @desc ラベルＣの名前
 * 初期値: ラベルＣ
 * @default ラベルＣ
 *
 * @param labelCId
 * @desc ラベルＣのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelCMax
 * @desc ラベルＣの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelCFooter
 * @desc ラベルＣのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelDName
 * @desc ラベルＤの名前
 * 初期値: ラベルＤ
 * @default ラベルＤ
 *
 * @param labelDId
 * @desc ラベルＤのゲーム変数番号
 * 初期値: 0（ 0 で非表示 / 1 以上で表示）
 * @default 0
 *
 * @param labelDMax
 * @desc ラベルＤの最大値
 * 初期値: 9999
 * @default 9999
 *
 * @param labelDFooter
 * @desc ラベルＤのフッターテキスト
 * 初期値:
 * @default
 *
 * @param labelNameWidth
 * @desc ラベル名の表示幅
 * 初期値: 128
 * @default 128
 *
 * @param labelValueWidth
 * @desc ラベル値の表示幅
 * 初期値: 72
 * @default 72
 *
 * @param labelNameColorId
 * @desc ラベル名の文字色番号
 * 初期値: 16
 * @default 16
 *
 * @param labelValueColorId
 * @desc ラベル値の文字色番号
 * 初期値: 0
 * @default 0
 *
 * @param labelMaxColorId
 * @desc ラベル値が最大のときの文字色番号
 * 初期値: 2
 * @default 2
 *
 * @param labelFooterColorId
 * @desc フッターの文字色番号
 * 初期値: 0
 * @default 0
 *
 * @param footerSpace
 * @desc フッターとラベル値の間隔
 * 初期値: 0
 * @default 0
 *
 * @param reverseMenuWindow
 * @desc メニューシーンのウィンドウ配置を左右反転
 * 初期値: 0 ( 0 = 無効 / 1 = 有効)
 * @default 0
 *
 * @param menuTextAlign
 * @desc メニューコマンド項目の描画位置
 * 初期値: left ( left / center / right)
 * @default left
 *
 * @help
 * TMPlugin - メニューラベル ver1.1.1

 * 使い方:
 *
 *   このプラグインを導入するとメインメニューの左下にゲーム変数の
 *   値（以下ラベル）を最大で 4 つまで表示することができるようになります。
 *
 *   このプラグインは RPGツクールMV Version 1.3.4 で動作確認をしています。
 *
 *
 * プラグインコマンド:
 *
 *   stopMenuLabel
 *     メニューラベルを無効にします。この設定はセーブデータにも記録され、
 *     startMenuLabel コマンドが実行されるまでラベルが表示されなくなります。
 *
 *   startMenuLabel
 *     無効になっているメニューラベルを有効にします。
 *     ゲーム開始時の状態ではメニューラベルは有効になっています。
 *
 *
 * プラグインパラメータ補足:
 *
 *   labelAId ～ labelDId
 *     この値が 1 以上のときは変数の値が表示され、それ以外の場合は
 *     以下のようなルールで表示される値が変化します。
 *      0 … ラベルの無効化（何も表示しない）
 *     -1 … 歩数
 *     -2 … セーブ回数
 *     -3 … 戦闘回数
 *     -4 … 勝利回数
 *     -5 … 敗北回数
 *
 *   labelAMax ～ labelDMax
 *     ゲーム変数の値がこれらの値以上だった場合、ラベルに表示される値の
 *     文字色番号が labelValueColorId から labelMaxColorId に変化します。
 *     また、ゲーム変数の値が最大値よりも大きい場合は、最大値を表示します。
 *     0 を設定すると上記機能が無効になります。
 *
 *   labelAFooter ～ labelDFooter
 *     ラベル値の後ろに表示する文字列を設定します。
 *     『1234 点』、『12 日目』のような表示にするための機能です、値との間の
 *     スペースは半角スペースなどで調整してください。
 *
 *   labelNameColorId
 *   labelValueColorId
 *   labelMaxColorId
 *   labelFooterColorId
 *     ラベルの各部分ごとの文字色番号を設定します。
 *     番号はイベントコマンド『文章の表示』などで使う制御文字 \C[n] の
 *     n の部分と同じものになります。
 *
 *   footerSpace
 *     ラベル値とフッターの表示位置を所持金ウィンドウとそろえたいときは
 *     このパラメータを調節してください。フッターと通貨単位がともに
 *     全角 1 文字の場合は 6 を設定するとちょうど同じになります。
 */

var Imported = Imported || {};
Imported.TMMenuLabel = true;

var TMPlugin = TMPlugin || {};
TMPlugin.MenuLabel = {};
TMPlugin.MenuLabel.Parameters = PluginManager.parameters('TMMenuLabel');
TMPlugin.MenuLabel.Labels = [];
TMPlugin.MenuLabel.Labels[0] = {
  name: TMPlugin.MenuLabel.Parameters['labelAName'],
  id: +(TMPlugin.MenuLabel.Parameters['labelAId'] || 10),
  max: +(TMPlugin.MenuLabel.Parameters['labelAMax'] || 9999),
  footer: TMPlugin.MenuLabel.Parameters['labelAFooter']
};
TMPlugin.MenuLabel.Labels[1] = {
  name: TMPlugin.MenuLabel.Parameters['labelBName'],
  id: +(TMPlugin.MenuLabel.Parameters['labelBId'] || 10),
  max: +(TMPlugin.MenuLabel.Parameters['labelBMax'] || 9999),
  footer: TMPlugin.MenuLabel.Parameters['labelBFooter']
};
TMPlugin.MenuLabel.Labels[2] = {
  name: TMPlugin.MenuLabel.Parameters['labelCName'],
  id: +(TMPlugin.MenuLabel.Parameters['labelCId'] || 10),
  max: +(TMPlugin.MenuLabel.Parameters['labelCMax'] || 9999),
  footer: TMPlugin.MenuLabel.Parameters['labelCFooter']
};
TMPlugin.MenuLabel.Labels[3] = {
  name: TMPlugin.MenuLabel.Parameters['labelDName'],
  id: +(TMPlugin.MenuLabel.Parameters['labelDId'] || 10),
  max: +(TMPlugin.MenuLabel.Parameters['labelDMax'] || 9999),
  footer: TMPlugin.MenuLabel.Parameters['labelDFooter']
};
TMPlugin.MenuLabel.NameWidth = +(TMPlugin.MenuLabel.Parameters['labelNameWidth'] || 160);
TMPlugin.MenuLabel.ValueWidth = +(TMPlugin.MenuLabel.Parameters['labelValueWidth'] || 96);
TMPlugin.MenuLabel.NameColorId = +(TMPlugin.MenuLabel.Parameters['labelNameColorId'] || 16);
TMPlugin.MenuLabel.ValueColorId = +(TMPlugin.MenuLabel.Parameters['labelValueColorId'] || 0);
TMPlugin.MenuLabel.MaxColorId = +(TMPlugin.MenuLabel.Parameters['labelMaxColorId'] || 2);
TMPlugin.MenuLabel.FooterColorId = +(TMPlugin.MenuLabel.Parameters['labelFooterColorId'] || 0);
TMPlugin.MenuLabel.FooterSpace = +(TMPlugin.MenuLabel.Parameters['footerSpace'] || 0);
TMPlugin.MenuLabel.ReverseMenuWindow = TMPlugin.MenuLabel.Parameters['reverseMenuWindow'] === '1';
TMPlugin.MenuLabel.MenuTextAlign = TMPlugin.MenuLabel.Parameters['menuTextAlign'] || 'left';

(function () {

  //-----------------------------------------------------------------------------
  // Game_System
  //

  Game_System.prototype.isMenuLabelEnabled = function () {
    if (this._menuLabelEnabled === undefined) this._menuLabelEnabled = true;
    return this._menuLabelEnabled;
  };

  Game_System.prototype.setMenuLabel = function (flag) {
    this._menuLabelEnabled = flag;
  };

  //-----------------------------------------------------------------------------
  // Game_Interpreter
  //

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'startMenuLabel') {
      $gameSystem.setMenuLabel(true);
    } else if (command === 'stopMenuLabel') {
      $gameSystem.setMenuLabel(false);
    }
  };

  //-----------------------------------------------------------------------------
  // Window_MenuCommand
  //

  Window_MenuCommand.prototype.itemTextAlign = function () {
    return TMPlugin.MenuLabel.MenuTextAlign;
  };

  //-----------------------------------------------------------------------------
  // Window_MenuLabel
  //

  function Window_MenuLabel() {
    this.initialize.apply(this, arguments);
  }

  Window_MenuLabel.prototype = Object.create(Window_Base.prototype);
  Window_MenuLabel.prototype.constructor = Window_MenuLabel;

  Window_MenuLabel.prototype.initialize = function (x, y) {
    var width = this.windowWidth();
    var height = this.windowHeight();
    Window_Base.prototype.initialize.call(this, x, y, width, height);
    this.refresh();
  };

  Window_MenuLabel.prototype.maxItems = function () {
    var n = 0;
    for (var i = 0; i < 4; i++) {
      if (TMPlugin.MenuLabel.Labels[i].id !== 0) n++;
    }
    return n;
  };

  Window_MenuLabel.prototype.windowWidth = function () {
    return 240;//240から変更
  };

  Window_MenuLabel.prototype.windowHeight = function () {
    return this.fittingHeight(this.maxItems());//削除
    //return this.fittingHeight(1);//追加
  };

  Window_MenuLabel.prototype.refresh = function () {
    var x = this.textPadding();
    var width = this.contents.width - this.textPadding() * 2;
    var lineHeight = this.lineHeight();
    this.contents.clear();
    var x = this.contents.width - this.textPadding();
    var y = 0;
    for (var i = 0; i < 4; i++) {
      var label = TMPlugin.MenuLabel.Labels[i];
      var value = this.labelValue(label.id);
      if (value != null) {
        this.drawMenuLabel(x, y, label, value);
        y += lineHeight;//変更、削除
        //x += 216;//変更、追加
      }
    }
  };

  Window_MenuLabel.prototype.labelValue = function (id) {
    if (id > 0) {
      return $gameVariables.value(id);
    } else if (id === -1) {
      return $gameParty.steps();
    } else if (id === -2) {
      return $gameSystem.saveCount();
    } else if (id === -3) {
      return $gameSystem.battleCount();
    } else if (id === -4) {
      return $gameSystem.winCount();
    } else if (id === -5) {
      return $gameSystem.escapeCount();
    }
    return null;
  };

  Window_MenuLabel.prototype.drawMenuLabel = function (x, y, label, value) {
    if (label.footer) {
      var footerWidth = this.textWidth(label.footer);
      x -= footerWidth;
      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.FooterColorId));
      this.drawText(label.footer, x, y, footerWidth);
      x -= TMPlugin.MenuLabel.FooterSpace;
    }
    x -= TMPlugin.MenuLabel.ValueWidth;
    this.changeTextColor(this.textColor(TMPlugin.MenuLabel.ValueColorId));
    if (label.max && value >= label.max) {
      value = label.max;
      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.MaxColorId));
    }
    this.drawText(value, x, y, TMPlugin.MenuLabel.ValueWidth, 'right');
    if (label.name) {
      this.changeTextColor(this.textColor(TMPlugin.MenuLabel.NameColorId));
      this.drawText(label.name, this.textPadding(), y, TMPlugin.MenuLabel.NameWidth);
    }
  };

  //-----------------------------------------------------------------------------
  // Scene_Menu
  //

  var _Scene_Menu_create = Scene_Menu.prototype.create;
  Scene_Menu.prototype.create = function () {
    _Scene_Menu_create.call(this);
    if ($gameSystem.isMenuLabelEnabled()) this.createMenuLabelWindow();
    if (TMPlugin.MenuLabel.ReverseMenuWindow) {
      this._statusWindow.x = 0;
      this._commandWindow.x = this._statusWindow.width;
      this._goldWindow.x = this._commandWindow.x
      if (this._menuLabelWindow) this._menuLabelWindow.x = this._commandWindow.x
    }
  };

  Scene_Menu.prototype.createMenuLabelWindow = function () {
    this._menuLabelWindow = new Window_MenuLabel(0, 0);
    this._menuLabelWindow.y = this._goldWindow.y; //- this._menuLabelWindow.height;//変更
    this.addWindow(this._menuLabelWindow);
  };

})();


code:
//=============================================================================
// TMPlugin - ネームポップ
// バージョン: 2.0.0
// 最終更新日: 2016/08/12
// 配布元    : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc イベントの頭上に文字列を表示する機能を追加します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param backOpacity
 * @desc ネームポップの背景の不透明度。
 * 初期値: 96 ( 0 ～ 255 )
 * @default 96
 *
 * @param fontSize
 * @desc ネームポップのフォントサイズ。
 * 初期値: 20
 * @default 20
 *
 * @param outlineWidth
 * @desc ネームポップの縁取りの太さ。
 * 初期値: 4
 * @default 4
 *
 * @param outlineColor
 * @desc ネームポップの縁取りの色。
 * 初期値: rgba(0, 0, 0, 0.5)
 * @default rgba(0, 0, 0, 0.5)
 *
 * @param width
 * @desc ネームポップの幅
 * 初期値: 160
 * @default 160
 *
 * @param roundRectRadius
 * @desc TMBitmapEx.js導入時の、角丸矩形の丸部分の半径。
 * 初期値: 6
 * @default 6
 *
 * @help
 * 使い方:
 *
 *   イベントのメモ欄（または注釈コマンド）にタグを書き込むか、あるいは
 *   プラグインコマンドを使って後からネームポップを設定することで、
 *   キャラクターの頭上に文字列を表示することができます。
 *
 *   イベントの透明化をオンにするとネームポップも非表示になります。
 *   ネームポップだけを表示したい場合はイベントの画像を (なし) に
 *   してください。
 *
 *   このプラグインは RPGツクールMV Version 1.3.0 で動作確認をしています。
 *
 *
 * プラグインコマンド:
 *
 *   namePop 1 名前
 *     イベント１番の頭上に 名前 という文字列を表示します。
 *
 *   namePop 1 名前 -48
 *     ネームポップを上へ 48 ドットずらして表示します。
 *
 *   namePop 1 名前 -48 blue
 *     ネームポップの縁取りの色を青色で表示します。
 *
 *   namePop 1
 *     イベント１番のネームポップを消去します。
 *
 *   イベント番号（ひとつ目の数値）は以下の規則にしたがって対象を指定します。
 *     -1     … プレイヤーを対象にする
 *     0      … コマンドを実行しているイベントを対象にする
 *     1 以上 … その番号のイベントを対象にする
 *
 *
 * メモ欄（イベント）タグ:
 *
 *   <namePop:名前 12 red>
 *     頭上に 名前 という文字列を、通常よりも下へ 12 ドットずらして、
 *     文字の縁取りを赤色にして表示します。
 *
 *   イベントのメモ欄以外に、実行内容の一番上にある注釈コマンド内でも
 *   同様のタグでネームポップを設定することができます。
 *   メモ欄と注釈の両方にタグがある場合は注釈が優先されます。
 *
 *   ネームポップには一部の制御文字を使用することもできます。
 *   \V, \N, \P, \G, \\, \C が使えます、使い方は『文章の表示』と同じですが、
 *   \C はネームポップ全体の文字色を変更します。
 *
 *   制御文字による置換はプラグインコマンドやイベントページの切り替えにより
 *   名前が変化したときにのみ実行されます。つまり \V で変数の値を名前として
 *   設定し、その後変数の値を別の値に変更してもネームポップは変化しません。
 *
 *
 * プラグインパラメータ補足:
 *
 *   namePopOutlineColor
 *     縁取りの色は rgba(0, 0, 0, 0.5) のような形式でRGB値と不透明度を
 *     設定します。RGB値は 0 ～ 255、不透明度は 0 ～ 1.0 の範囲で値を
 *     設定してください。
 *       例: rgba(255, 0, 255, 0.5)    # 不透明度５０％のピンク
 *
 *     また、上記の形式以外に black や blue といったカラーネームと、
 *     #000000 や #0000ff のようなカラーコードを指定することもできます。
 *
 *   roundRectRadius
 *     TMBitmapEx.js をこのプラグインよりも上の位置に導入し、
 *     このパラメータの値を 1 以上にすることで、ネームポップ背景を
 *     角丸の矩形にすることができます。
 */

var Imported = Imported || {};
Imported.TMNamePop = true;

var TMPlugin = TMPlugin || {};
TMPlugin.NamePop = {};
TMPlugin.NamePop.Parameters = PluginManager.parameters('TMNamePop');
TMPlugin.NamePop.BackOpacity = +(TMPlugin.NamePop.Parameters['backOpacity'] || 96);
TMPlugin.NamePop.FontSize = +(TMPlugin.NamePop.Parameters['fontSize'] || 20);
TMPlugin.NamePop.OutlineWidth = +(TMPlugin.NamePop.Parameters['outlineWidth'] || 4);
TMPlugin.NamePop.OutlineColor = TMPlugin.NamePop.Parameters['outlineColor'] || 'rgba(0, 0, 0, 0.5)';
TMPlugin.NamePop.Width = +(TMPlugin.NamePop.Parameters['width'] || 160);
TMPlugin.NamePop.RoundRectRadius = +(TMPlugin.NamePop.Parameters['roundRectRadius'] || 6);

if (!TMPlugin.EventBase) {
  TMPlugin.EventBase = true;
  (function () {

    var _Game_Event_setupPage = Game_Event.prototype.setupPage;
    Game_Event.prototype.setupPage = function () {
      _Game_Event_setupPage.call(this);
      if (this._pageIndex >= 0) this.loadCommentParams();
    };

    Game_Event.prototype.loadCommentParams = function () {
      this._commentParams = {};
      var re = /<([^<>:]+)(:?)([^>]*)>/g;
      var list = this.list();
      for (var i = 0; i < list.length; i++) {
        var command = list[i];
        if (command && command.code == 108 || command.code == 408) {
          for (; ;) {
            var match = re.exec(command.parameters[0]);
            if (match) {
              this._commentParams[match[1]] = match[2] === ':' ? match[3] : true;
            } else {
              break;
            }
          }
        } else {
          break;
        }
      }
    };

    Game_Event.prototype.loadTagParam = function (paramName) {
      return this._commentParams[paramName] || this.event().meta[paramName];
    };

  })();
} // TMPlugin.EventBase

if (!TMPlugin.InterpreterBase) {
  TMPlugin.InterpreterBase = true;
  (function () {

    Game_Interpreter.prototype.convertEscapeCharactersTM = function (text) {
      text = text.replace(/\\/g, '\x1b');
      text = text.replace(/\x1b\x1b/g, '\\');
      text = text.replace(/\x1bV\[(\d+)\]/gi, function () {
        return $gameVariables.value(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bV\[(\d+)\]/gi, function () {
        return $gameVariables.value(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bN\[(\d+)\]/gi, function () {
        return this.actorNameTM(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bP\[(\d+)\]/gi, function () {
        return this.partyMemberNameTM(parseInt(arguments[1]));
      }.bind(this));
      text = text.replace(/\x1bG/gi, TextManager.currencyUnit);
      return text;
    };

    Game_Interpreter.prototype.actorNameTM = function (n) {
      var actor = n >= 1 ? $gameActors.actor(n) : null;
      return actor ? actor.name() : '';
    };

    Game_Interpreter.prototype.partyMemberNameTM = function (n) {
      var actor = n >= 1 ? $gameParty.members()[n - 1] : null;
      return actor ? actor.name() : '';
    };

  })();
} // TMPlugin.InterpreterBase

(function () {

  //-----------------------------------------------------------------------------
  // Game_CharacterBase
  //

  Game_CharacterBase.prototype.setNamePop = function (namePop, shiftY) {
    if (namePop) {
      namePop = $gameMap._interpreter.convertEscapeCharactersTM(namePop).replace(/_/g, ' ');
    }
    this._namePop = namePop;
    this._namePopY = shiftY || 0;
  };

  Game_CharacterBase.prototype.namePopOutlineColor = function () {
    return this._namePopOutlineColor || TMPlugin.NamePop.OutlineColor;
  };

  Game_CharacterBase.prototype.setNamePopOutlineColor = function (outlineColor) {
    this._namePopOutlineColor = outlineColor;
  };

  Game_CharacterBase.prototype.requestNamePop = function () {
    this._requestNamePop = true;
  };

  Game_CharacterBase.prototype.onChangeNamePop = function () {
    this._requestNamePop = false;
  };

  Game_CharacterBase.prototype.isNamePopRequested = function () {
    return this._requestNamePop;
  };

  //-----------------------------------------------------------------------------
  // Game_Event
  //

  var _Game_Event_setupPage = Game_Event.prototype.setupPage;
  Game_Event.prototype.setupPage = function () {
    _Game_Event_setupPage.call(this);
    if (this._pageIndex >= 0) {
      var namePop = this.loadTagParam('namePop');
      if (namePop) {
        var arr = namePop.split(' ');
        this.setNamePop(arr[0], arr[1]);
        this.setNamePopOutlineColor(arr[2]);
      }
    } else {
      this.setNamePop(null, 0);
    }
    this.requestNamePop();
  };

  //-----------------------------------------------------------------------------
  // Game_Interpreter
  //

  var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
  Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
    if (command === 'namePop') {
      var arr = args.map(this.convertEscapeCharactersTM, this);
      var character = this.character(+arr[0]);
      if (character) {
        character.setNamePop(args[1], arr[2]);
        character.setNamePopOutlineColor(arr[3]);
        character.requestNamePop();
      }
    }
  };

  //-----------------------------------------------------------------------------
  // Sprite_Character
  //

  var _Sprite_Character_update = Sprite_Character.prototype.update;
  Sprite_Character.prototype.update = function () {
    _Sprite_Character_update.call(this);
    this.updateNamePop();
  };

  Sprite_Character.prototype.updateNamePop = function () {
    if (this._character.isNamePopRequested() ||
      this._namePop !== this._character._namePop) {
      this._character.onChangeNamePop();
      this._namePop = this._character._namePop;
      if (this._namePop) {
        if (!this._namePopSprite) {
          this._namePopSprite = new Sprite_NamePop();
          this.addChild(this._namePopSprite);
          this._namePopSprite.y = this.namePopShiftY();
        }
        this._namePopSprite.refresh(this._namePop,
          this._character.namePopOutlineColor());
      } else {
        this.removeChild(this._namePopSprite);
        this._namePopSprite = null;
      }
    }
  };

  Sprite_Character.prototype.namePopShiftY = function () {
    return this._character._namePopY - this.patternHeight();
  };

  //-----------------------------------------------------------------------------
  // Sprite_NamePop
  //

  function Sprite_NamePop() {
    this.initialize.apply(this, arguments);
  }

  Sprite_NamePop.prototype = Object.create(Sprite.prototype);
  Sprite_NamePop.prototype.constructor = Sprite_NamePop;

  Sprite_NamePop.prototype.initialize = function () {
    Sprite.prototype.initialize.call(this);
    this.bitmap = new Bitmap(TMPlugin.NamePop.Width, TMPlugin.NamePop.FontSize + 4);
    this.bitmap.fontSize = TMPlugin.NamePop.FontSize;
    this.bitmap.outlineWidth = TMPlugin.NamePop.OutlineWidth;
    this.anchor.x = 0.5;
    this.anchor.y = 1;
  };

  Sprite_NamePop.prototype.update = function () {
    Sprite.prototype.update.call(this);
    this.y = this.parent.namePopShiftY();
  };

  Sprite_NamePop.prototype.refresh = function (text, outlineColor) {
    this.bitmap.clear();
    this.bitmap.textColor = '#ffffff';
    this.bitmap.outlineColor = outlineColor;
    text = this.convertEscapeCharacters(text);
    var tw = this.bitmap.measureTextWidth(text);
    var x = Math.max((this.width - tw) / 2 - 4, 0);
    var w = Math.min(tw + 8, this.width);
    this.bitmap.paintOpacity = TMPlugin.NamePop.BackOpacity;
    if (Imported.TMBitmapEx && TMPlugin.NamePop.RoundRectRadius) {
      this.bitmap.fillRoundRect(x, 0, w, this.height, TMPlugin.NamePop.RoundRectRadius, '#000000');
    } else {
      this.bitmap.fillRect(x, 0, w, this.height, '#000000');
    }
    this.bitmap.paintOpacity = 255;
    this.bitmap.drawText(text, 0, 0, this.width, this.height, 'center');
  };

  Sprite_NamePop.prototype.convertEscapeCharacters = function (text) {
    text = text.replace(/\x1bC\[(\d+)\]/gi, function () {
      this.bitmap.textColor = this.textColor(arguments[1]);
      return '';
    }.bind(this));
    return text;
  };

  Sprite_NamePop.prototype.textColor = function (n) {
    var px = 96 + (n % 8) * 12 + 6;
    var py = 144 + Math.floor(n / 8) * 12 + 6;
    var windowskin = ImageManager.loadSystem('Window');
    return windowskin.getPixel(px, py);
  };

})();


code:
//=============================================================================
// TMPlugin - パッシヴスキル
// バージョン: 1.1.1
// 最終更新日: 2017/06/17
// 配布元    : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================

/*:
 * @plugindesc 使用せずとも常に効果が発動しつづけるスキルを追加します。
 *
 * @author tomoaky (http://hikimoki.sakura.ne.jp/)
 *
 * @param passiveCommands
 * @type string
 * @desc パッシヴスキルのスキルタイプ番号を半角数字で設定します。
 * 複数指定する場合は半角スペースで区切ってください。
 * @default
 *
 * @help
 * TMPlugin - パッシヴスキル ver1.1.1
 *
 * 使い方:
 *
 *   このプラグインは、データベースに設定されているスキルと武器を紐付けて
 *   パッシヴスキルを作成します。
 *   スキルのメモ欄に <passive:50> というタグを書き込むと、
 *   このスキルを習得している間、50 番の武器を装備したときと
 *   同じ効果が得られるようになります。
 *
 *   特徴の『スキル追加』ではパッシヴスキルの効果は適用されません。
 *
 *   パッシヴスキルに必要武器が設定されている場合、該当するタイプの武器を
 *   装備している間だけパッシヴスキルの効果が適用されます。
 *   武器タイプ以外にもメモ欄タグを使ってＴＰやステートを効果適用の条件に
 *   指定することができます。
 *
 *   プラグインコマンドはありません。
 *
 *   このプラグインは RPGツクールMV Version 1.5.0 で動作確認をしています。
 *
 *
 * メモ欄タグ（スキル）:
 *
 *   <passive:50>     # 50 番の武器を効果とするパッシヴスキルになる
 *   <passiveTp:75>   # 残りＴＰが 75 以上のときだけパッシヴ効果が適用される
 *   <passiveTp:-25>  # 残りＴＰが 25 未満のときだけパッシヴ効果が適用される
 *   <passiveState:4> # 4 番のステートが有効なときだけパッシヴ効果が適用される
 *   <passiveTurn:2>  # 戦闘中 2 ターン目にのみパッシヴ効果が適用される
 *
 *   パッシヴ効果はスキルだけでなく装備品に設定することもできます。
 *
 *
 * プラグインパラメータ補足:
 *
 *   passiveCommands を設定すると、該当するスキルタイプはバトル中に
 *   表示されなくなります。
 *   パッシヴスキルのスキルタイプ番号を指定すれば、コマンドからパッシヴスキルを
 *   除外することができます。
 */

var Imported = Imported || {};
Imported.TMPassiveSkill = true;

(function () {

  var parameters = PluginManager.parameters('TMPassiveSkill');
  var passiveCommands = parameters['passiveCommands'].split('').map(Number);

  //-----------------------------------------------------------------------------
  // Game_Actor
  //

  var _Game_Actor_paramPlus = Game_Actor.prototype.paramPlus;
  Game_Actor.prototype.paramPlus = function (paramId) {
    var passiveWeapons = this.passiveWeapons();
    return passiveWeapons.reduce(function (r, weapon) {
      return r + weapon.params[paramId];
    }, _Game_Actor_paramPlus.call(this, paramId));
  };

  var _Game_Actor_traitObjects = Game_Actor.prototype.traitObjects;
  Game_Actor.prototype.traitObjects = function () {
    var objects = _Game_Actor_traitObjects.call(this);
    var passiveWeapons = this.passiveWeapons();
    for (var i = 0; i < passiveWeapons.length; i++) {
      objects.push(passiveWeapons[i]);
    }
    return objects;
  };

  Game_Actor.prototype.passiveWeapons = function () {
    var result = [];
    var objects = this.equips();
    this._skills.forEach(function (id) {
      objects.push($dataSkills[id]);
    }, this);
    objects.forEach(function (item) {
      if (item && !result.contains(item)) {
        var passiveWeapon = this.passiveWeapon(item);
        if (passiveWeapon) result.push(passiveWeapon);
      }
    }, this);
    return result;
  };

  Game_Actor.prototype.passiveWeapon = function (item) {
    if (item.meta.passive &&
      this.isPassiveSkillTpOk(item) &&
      this.isPassiveSkillStateOk(item) &&
      this.isPassiveSkillTurnOk(item) &&
      (!DataManager.isSkill(item) || this.isSkillWtypeOk(item))) {
      return $dataWeapons[+item.meta.passive];
    }
    return null;
  };

  Game_Actor.prototype.isPassiveSkillTpOk = function (item) {
    if (item.meta.passiveTp) {
      var n = +item.meta.passiveTp;
      var tp = this.tp;
      if ((n > 0 && n > tp) || (n < 0 && -n <= tp)) return false;
    }
    return true;
  };

  Game_Actor.prototype.isPassiveSkillStateOk = function (item) {
    if (item.meta.passiveState) {
      return this.isStateAffected(+item.meta.passiveState);
    }
    return true;
  };

  Game_Actor.prototype.isPassiveSkillTurnOk = function (item) {
    if (item.meta.passiveTurn) {
      return $gameParty.inBattle() && $gameTroop.turnCount() === +item.meta.passiveTurn;
    }
    return true;
  };

  Game_Actor.prototype.addedSkillTypes = function () {
    var skillTypes = Game_BattlerBase.prototype.addedSkillTypes.call(this);
    if ($gameParty.inBattle()) {
      for (var i = 0; i < skillTypes.length; i++) {
        if (passiveCommands.contains(skillTypes[i])) {
          skillTypes.splice(i--, 1);
        }
      }
    }
    return skillTypes;
  };

})();


code:
/*:
 * @plugindesc 敵ターゲットウィンドウにＨＰゲージを表示させます。
 特定の敵のゲージを非表示にすることもできます。
 * @author 茶の助
 *
 * @help ＨＰゲージを表示させたくない場合は、
 その敵のメモ欄に<ＨＰ非表示>と書いてください。
 */

(function () {

    Window_Base.prototype.hpGaugeColor = function (rate) {
        return [this.hpGaugeColor1(), this.hpGaugeColor2()];
    };

    Window_BattleEnemy.prototype.drawItem = function (index) {
        var rect = this.itemRectForText(index);
        if (!$dataEnemies[this._enemies[index]._enemyId].note.match('<ＨＰ非表示>')) {
            var hprate = this._enemies[index].hp / this._enemies[index].mhp;
            var color = this.hpGaugeColor(hprate);
            this.drawGauge(rect.x, rect.y, rect.width, hprate, color[0], color[1], this.gaugeBackColor());
        }
        this.resetTextColor();
        var name = this._enemies[index].name();
        this.drawText(name, rect.x, rect.y, rect.width, 'left', true); //
    };

})();


code:
//=============================================================================
// TitleCommandPosition.js
//=============================================================================

/*:
 * @plugindesc Changes the position of the title command window.
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc The offset value for the x coordinate.
 * @default 0
 *
 * @param Offset Y
 * @desc The offset value for the y coordinate.
 * @default 0
 *
 * @param Width
 * @desc The width of the command window.
 * @default 240
 *
 * @param Background
 * @desc The background type. 0: Normal, 1: Dim, 2: Transparent
 * @default 0
 *
 * @help This plugin does not provide plugin commands.
 */

/*:ja
 * @plugindesc タイトルコマンドウィンドウの位置を変更します。
 * @author Yoji Ojima
 *
 * @param Offset X
 * @desc X座標のオフセット値です。
 * @default 0
 *
 * @param Offset Y
 * @desc Y座標のオフセット値です。
 * @default 0
 *
 * @param Width
 * @desc コマンドウィンドウの幅です。
 * @default 240
 *
 * @param Background
 * @desc 背景タイプです。0: 通常、1: 暗くする、2: 透明
 * @default 0
 *
 * @help このプラグインには、プラグインコマンドはありません。
 */

(function () {

    var parameters = PluginManager.parameters('TitleCommandPosition');
    var offsetX = Number(parameters['Offset X'] || 0);
    var offsetY = Number(parameters['Offset Y'] || 0);
    var width = Number(parameters['Width'] || 240);
    var background = Number(parameters['Background'] || 0);

    var _Window_TitleCommand_updatePlacement =
        Window_TitleCommand.prototype.updatePlacement;
    Window_TitleCommand.prototype.updatePlacement = function () {
        _Window_TitleCommand_updatePlacement.call(this);
        this.x += offsetX;
        this.y += offsetY;
        this.setBackgroundType(background);
    };

    Window_TitleCommand.prototype.windowWidth = function () {
        return width;
    };

})();