code:
//
//  アニメーションマップネーム ver1.03
//
// author yana
//

var Imported = Imported || {};
Imported['AnimationMapName'] = 1.04;

/*:
 * @plugindesc ver1.04/マップ名表示をアニメーションさせます。
 * @author Yana
 *
 * @param Pattern Variable ID
 * @desc パターンの変更に使う変数のIDです。
 * 0または、空欄で変数を使用しません。
 * @default
 *
 * @param Anime Font Size
 * @desc 表示マップ名のフォントサイズです。
 * @default 28
 *
 * @param Anime Pattern
 * @desc マップ名の動作パターンです。
 * Normal:普通 GrowUp:にょきにょき Stretch:うにょーん
 * @default Normal
 *
 * @param Anime Count
 * @desc マップ名の表示時間です。
 * @default 300
 *
 * @param Anime OriginalX
 * @desc 移動前の座標Xです。
 * @default 0
 *
 * @param Anime OriginalY
 * @desc 移動前の座標Yです。
 * @default -60
 *
 * @param Anime MoveX
 * @desc X座標の移動距離です。
 * @default 0
 *
 * @param Anime MoveY
 * @desc Y座標の移動距離です。
 * @default 60
 *
 * @param Fill Rect Color
 * @desc 背景の色です。
 * @default rgba(0,0,0,0.5)
 *
 * @param Back Picture
 * @desc 背景に使用するピクチャ画像です。
 * こちらを指定すると、背景を塗りつぶすRectは無効になります。
 * @default
 *
 * @help------------------------------------------------------
 * 導入に関しての注意
 * ------------------------------------------------------
 * このプラグインの動作にはCommonPopupCore_ver1.04以降が必要です。
 * このプラグインは、CommonPopupCoreよりも下に配置してください。
 * ------------------------------------------------------
 * プラグインコマンド
 * ------------------------------------------------------
 * アニメーションマップネーム 設定 ～
 * AnimationMapName Setting ～
 *
 * アニメーションマップネームの設定を変更します。
 * 変更できる項目は、それぞれプラグインパラメータに対応しており、
 * size:Anime Font Size
 * pattern:Anime Pattern
 * count:Anime Count
 * ox:Anime OriginalX
 * oy:Anime OriginalY
 * mx:Anime MoveX
 * my:Anime MoveY
 * color:Fill Rect Color
 * picture:Back Picture
 * となっています。
 * 記述は以下のように「変更したい項目:変更後の設定」と記述します。
 * 例:patternをGrowUp,countを200に変更する。
 * アニメーションマップネーム 設定 pattern:GrowUp count:200
 *
 * アニメーションマップネーム 表示 ～
 * AnimationMapName Add ～
 *
 * 指定したパラメータを使って、アニメーションマップネームを呼び出します。
 * 指定できるパラメータは上記の設定に加えて、
 * text:表示するテキスト
 * が使用可能です。
 * ------------------------------------------------------
 * 使い方
 * ------------------------------------------------------
 * マップ名表示を改造し、アニメーションするように変更します。
 * また、
 * \C[x]　\I[x]　\V[x] \N[x] \P[x] \G
 * の制御文字を使用できるようになります。
 *
 * ---変数によるパターンの設定---
 * 変数IDを設定してあると、変数の値を変更するだけで、アニメーションの
 * 表示パターンが変更可能です。
 * それぞれ、対応する数値と設定は、
 * 0でNormal、-1でStretch、-2でGrowUp
 * となります。
 * この数値は、プラグインコマンドで設定が変更された際には、自動で設定された
 * 値に合わせた数値が代入されます。
 *
 * ---マップのメモによるパラメータの設定---
 * マップのメモ欄を使うことでも、アニメーションマップネームの設定を、
 * 個別に変更することが可能です。
 * マップのメモ欄に以下のように記述してください。
 *
 * <アニメーションマップネーム設定>
 *
 * 設定項目
 *
 * </アニメーションマップネーム設定>
 *
 * 設定項目は、プラグインコマンドの設定の変更の項目で記述されているものが
 * 使用可能です。
 *
 * ---各設定項目の優先度---
 * プラグインコマンドによる設定は、基本設定を書き換えると同時に、パターンが
 * 設定されている場合は、指定した変数の数値も書き換えます。
 *
 * マップのメモによる設定は、基本的に優先されます。
 * プラグインコマンドで呼び出した場合も、マップに設定がある場合は、その設定を
 * ベースとして使用します。
 * また、マップのメモによるパターンの設定は、変数の値より優先されます。
 * その際、変数の値の変更は行いません。
 *
 * なので、優先度は
 * コマンドで呼び出した際の個別設定＞マップの設定＞変数のパターン設定＞基本設定
 * となります。
 *
 * ---リージョンネームの設定---
 * マップのメモ欄を使ってリージョンネームを設定することで、そのリージョンに
 * 足を踏み入れた際にリージョンネームをポップアップさせることができます。
 *
 * マップのメモ欄に
 * <RegionName○:xxx …>
 * <リージョンネーム○:xxx …>
 * のいずれかの書式で記述がある場合、○番のリージョンに侵入した際、xxxで指定した
 * テキストが、マップ名表示としてポップアップします。
 * …の部分は、プラグインコマンドと同じ設定項目が使用できます。
 * 設定せずに、<リージョンネーム○:xxx>だけでも動作します。
 * また、このポップアップは、リージョンネームの設定されたリージョンから、
 * 別のリージョンネームの設定されたリージョンに侵入したときのみ、反応します。
 *
 * 例:3番のリージョンに侵入した際、テストエリアA-1のテキストを、
 *    パターンGrowUpで60フレームの表示時間だけ表示
 * <リージョンネーム3:テストエリアA-1 pattern:GrowUp count:60>
 *
 * ------------------------------------------------------
 * 利用規約
 * ------------------------------------------------------
 * 使用に制限はありません。商用、アダルト、いずれにも使用できます。
 * 二次配布も制限はしませんが、サポートは行いません。
 * 著作表示は任意です。行わなくても利用できます。
 * 要するに、特に規約はありません。
 * バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
 * https://twitter.com/yanatsuki_
 * 素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * 更新履歴:
 * ver1.04:
 * イベントテスト時にエラーが発生するバグを修正。
 * ver1.03:
 * イベントコマンドでマップ名表示が無効化できなかったバグを修正。
 * 表示パターン「GrowUp」「Stretch」を追加。
 * プラグインコマンドを追加。
 * 設定項目を追加。
 * ver1.02:
 * CommonPopupCoreの変更に合わせて処理を修正。
 * ver1.01:
 * イベントテストが正常に機能していなかったバグを修正。
 * ver1.00:
 * 公開
 */

////////////////////////////////////////////////////////////////////////////////////

(function() {
    var parameters = PluginManager.parameters('AnimationMapName');
    var patternVariableId = Number(parameters['Pattern Variable ID']) || 0;
    var animeFontSize = Number(parameters['Anime Font Size'] || 28);
    var animeCount = Number(parameters['Anime Count'] || 300);
    var animeOriginalX = Number(parameters['Anime OriginalX'] || 0);
    var animeOriginalY = Number(parameters['Anime OriginalY'] || 0);
    var animeMoveX = Number(parameters['Anime MoveX'] || 0);
    var animeMoveY = Number(parameters['Anime MoveY'] || 0);
    var animePattern = parameters['Anime Pattern'] || 'Normal';
    var fillRectColor = parameters['Fill Rect Color'] || 'rgba(0,0,0,0.5)';
    var backPicture = parameters['Back Picture'];

    ////////////////////////////////////////////////////////////////////////////////////

    var __GInterpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        __GInterpreter_pluginCommand.call(this, command, args);
        if (command === 'AnimationMapName' || command === 'アニメーションマップネーム') {
            var code = args.shift();
            if (code === 'Setting' || code === '設定') this.setAmsSetting(args);
            if (code === 'Add' || code === '表示') this.showAmn(args);
        }
    };

    Game_Interpreter.prototype.setAmsSetting = function(args) {
        var params = $gameSystem.amnParameters();
        var amnParams = DataManager.makeAmnParams(params,args);
        if (patternVariableId){
            if (amnParams.pattern === 'Normal' || amnParams.pattern == 0){
                $gameVariables._data[patternVariableId] = 0;
            } else if (amnParams.pattern === 'Stretch' || amnParams.pattern == -1){
                $gameVariables._data[patternVariableId] = -1;
            } else if (amnParams.pattern === 'GrowUp' || amnParams.pattern == -2){
                $gameVariables._data[patternVariableId] = -2;
            } else {
                $gameVariables._data[patternVariableId] = Number(amnParams.pattern);
            }
        }
        $gameSystem.setAmnParameters(amnParams);
    };

    ////////////////////////////////////////////////////////////////////////////////////

    DataManager.amnMapParams = function(map) {
        if (!map) return false;
        if (map._amsParams){ return map._amsParams }
        var note = map.note ? map.note : '';
        var texts = note.split('\n');
        var params = {};
        for (var i=0,max=texts.length;i<max;i++) {
            if (/^<(?:AnimationMapNameSetting|アニメーションマップネーム設定)>/.exec(texts[i])){
                for (var j=i;j<max;j++){
                    if (/^<\/(?:AnimationMapNameSetting|アニメーションマップネーム設定)>/.exec(texts[j])) {
                        i=j;
                        break;
                    } else {
                        if (/(.+?):(.+)?/.exec(texts[j])){
                            var code = RegExp.$1;
                            var value = RegExp.$2;
                            switch(code) {
                                case 'size':    params.size = Number(value) ; break;
                                case 'count':   params.count = Number(value);break;
                                case 'ox':      params.ox = Number(value)   ;break;
                                case 'oy':      params.oy = Number(value)   ;break;
                                case 'mx':      params.mx = Number(value)   ;break;
                                case 'my':      params.my = Number(value)   ;break;
                                case 'pattern': params.pattern = value      ;break;
                                case 'color':   params.color = value        ;break;
                                case 'picture': params.picture = value      ;break;
                                case 'text':    params.text = value         ;break;
                            }
                        }
                    }
                }
            }
        }
        map._amsParams = params;
        return map._amsParams;
    };

    DataManager.makeAmnParams = function(params,args) {
        var amnParams = { size:params.size, count:params.count,
            ox:params.ox, oy:params.oy, mx:params.mx, my:params.my,
            pattern:params.pattern, color:params.color, picture:params.picture,
            text:params.text };
        args.forEach(function(a){
            if (/(.+?):(.+)?/.exec(a)){
                var code = RegExp.$1;
                var value = RegExp.$2;
                switch(code){
                    case 'size':   amnParams.size = Number(value);  break;
                    case 'count':  amnParams.count = Number(value); break;
                    case 'ox':     amnParams.ox = Number(value);    break;
                    case 'oy':     amnParams.oy = Number(value);    break;
                    case 'mx':     amnParams.mx = Number(value);    break;
                    case 'my':     amnParams.my = Number(value);    break;
                    case 'pattern':amnParams.pattern = value;       break;
                    case 'color':  amnParams.color = value;         break;
                    case 'picture':amnParams.picture = value;       break;
                    case 'text':   amnParams.text = value;          break;
                }
            }
        }.bind(this));
        return amnParams;
    };

    ////////////////////////////////////////////////////////////////////////////////////

    Game_System.prototype.amnParameters = function() {
        if (!this._amnParameters) this.initAmnParameters();
        if (patternVariableId){
            this._amnParameters.pattern = $gameVariables.value(patternVariableId);
        }
        var params = DataManager.amnMapParams($dataMap);
        var amnParams = { size:this._amnParameters.size, count:this._amnParameters.count,
                          ox:this._amnParameters.ox, oy:this._amnParameters.oy,
                          mx:this._amnParameters.mx, my:this._amnParameters.my,
                          pattern:this._amnParameters.pattern, color:this._amnParameters.color,
                          picture:this._amnParameters.picture };
        for (var key in params) { amnParams[key] = params[key] }
        return amnParams;
    };

    Game_System.prototype.initAmnParameters = function() {
        this._amnParameters = { size:animeFontSize, count:animeCount, ox:animeOriginalX,
                                oy:animeOriginalY, mx:animeMoveX, my:animeMoveY,
                                pattern:animePattern, color:fillRectColor, picture:backPicture,
                                text:''};
        if (patternVariableId){
            var pattern = this._amnParameters.pattern;
            if (pattern === 'Normal'  || pattern === 0)  $gameVariables._data[patternVariableId] = 0;
            if (pattern === 'Stretch' || pattern === -1) $gameVariables._data[patternVariableId] = -1;
            if (pattern === 'GrowUp'  || pattern === -2) $gameVariables._data[patternVariableId] = -2;
        }
    };

    Game_System.prototype.setAmnParameters = function(params) {
        this._amnParameters = params;
    };

    ////////////////////////////////////////////////////////////////////////////////////

    var __GInterpreter_update = Game_Interpreter.prototype.update;
    Game_Interpreter.prototype.update = function() {
        __GInterpreter_update.call(this);
        if (this._refreshAmn){
            if (ImageManager.isReady()) {
                this.refreshMapName(this._amnParams);
                this._refreshAmn = false;
                this._amnParams = null;
            }
        }
    };

    Game_Interpreter.prototype.animationMapName = function(params) {
        if(params.picture){
            ImageManager.loadPicture(params.picture);
            this._refreshAmn = true;
            this._amnParams = params;
        } else {
            this.refreshMapName(params);
        }
    };

    Game_Interpreter.prototype.refreshMapName = function(params) {
        var text = (params.text ? params.text : $gameMap.displayName()) || '';
        var array = CommonPopupManager.window().convertEscapeCharacters(text).split("");
        var a2 = [];
        var flag = false;
        var cflag = false;
        var setIndex = -1;
        var count = 0;
        var s1 = '';
        var aX = 0;
        var aY = 0;
        if (params.pattern === 'GrowUp' || params.pattern == -2) aY = 1.0;
        var pattern = params.pattern;
        var afs = params.size + 8;
        var supY = 0;
        if (params.pattern === 'GrowUp' || params.pattern == -2) supY = afs;
        for(var i=0,max=array.length;i<max;i++){
            if (array[i] === '\x1b') {
                var cnt = a2.length;
                a2[cnt] = array[i];
                for (var j=i;j<max;j++){
                    if (array[j] === ']') {
                        a2[cnt] += ']';
                        //a2[i] = a2[i].replace(/\x1b/,'\\');
                        if (a2[cnt].match(/\x1bI\[\d+\]/i)) count++;
                        i = j;
                        break;
                    } else {
                      a2[cnt] += array[j];
                    }
                }
            } else {
                a2.push(array[i]);
                s1 += array[i];
            }
        }

        CommonPopupManager.window().resetFontSettings();
        var fs = params.size;
        var fontStr = '\\FS[' + fs + ']';
        CommonPopupManager.window().drawTextEx(fontStr,0,0);
        var textSize = CommonPopupManager.window().textWidth(s1) + params.size;
        textSize += (params.size * 1.14) * count;
        var bitmap = null;
        var bw = textSize;
        var bh = fs;

        if (params.picture) {
            bitmap = ImageManager.loadPicture(params.picture);
            var arg = CommonPopupManager.setPopup('');
            bw = bitmap.width;
            bh = bitmap.height;
            arg.x = params.ox// + textSize / 2 - bitmap.width / 2;
            arg.y = params.oy + bitmap.height * aY;
            arg.moveX = params.mx;
            arg.moveY = params.my;
            arg.bitmap = bitmap;
            arg.count = params.count;
            arg.extend = [arg.count * 0.2, arg.count * 0.8];
            arg.fixed = false;
            arg.anchorX = aX;
            arg.anchorY = aY;
            arg.pattern = pattern;
            arg.tag = 'AnimationMapName';
            supY += bitmap.height / 2 - afs / 2;
        } else {
            bitmap = new Bitmap(textSize, params.size + 8);

            bitmap.gradientFillRect(0, 0, bitmap.width / 3, bitmap.height, 'rgba(0,0,0,0)', params.color);
            bitmap.fillRect(bitmap.width / 3, 0, bitmap.width / 3, bitmap.height, params.color);
            bitmap.gradientFillRect((bitmap.width * 2) / 3, 0, bitmap.width / 3, bitmap.height, params.color, 'rgba(0,0,0,0)');

            var arg = CommonPopupManager.setPopup('');
            arg.x = params.ox;
            arg.y = params.oy + supY;
            arg.moveX = params.mx;
            arg.moveY = params.my;
            arg.bitmap = bitmap;
            arg.count = params.count;
            arg.extend = [arg.count * 0.2, arg.count * 0.8];
            arg.fixed = false;
            arg.anchorX = aX;
            arg.anchorY = aY;
            arg.pattern = pattern;
            arg.tag = 'AnimationMapName';
        }
        if(arg) CommonPopupManager._tempCommonSprites.setNullPos(arg);

        var s = Math.floor((params.count*0.4)/s1.length);
        var n = 0;
        var setColor = '';
        var ssupY = (pattern == -2 || pattern === 'GrowUp') ? 4 : 0;
        var bfs = fs;
        var cnt = 0;
        CommonPopupManager.window().contents.fontSize = fs;
        for(var i=0;i<a2.length;i++){
            if (a2[i].match(/\x1bI\[(\d+)\]/i)) a2[i] = '\\I[' + RegExp.$1 + ']';
            if (a2[i].match(/\x1bC\[(\d+)\]/i)) {
                setColor = '\\C[' + RegExp.$1 + ']';
            }else if (a2[i].match(/\x1bFS\[(\d+)\]/i)){
                fs = Number(RegExp.$1);
                fontStr = '\\FS[' + fs + ']';
            }else{
                var fsy = (bfs - fs) / 2;
                if (fsy > 0 && ssupY > 0) fsy -= 8 ;
                var arg = CommonPopupManager.setPopup('');
                var bitmap = new Bitmap(fs+12,fs+12);
                var tx = fontStr + setColor + a2[i];
                CommonPopupManager.window().contents.fontSize = fs;
                var tw = CommonPopupManager.window().textWidth(a2[i]);
                CommonPopupManager.window().contents = bitmap;
                CommonPopupManager.window().drawTextEx(tx,4,0);
                arg.bitmap = bitmap;
                arg.x = params.ox + n + (bw - textSize)/ 2 + 10;
                arg.y = params.oy + supY + ssupY + fsy;
                arg.moveX = params.mx;
                arg.moveY = params.my;
                arg.anchorX = aX;
                arg.anchorY = aY;
                arg.delay = s * (cnt + 1);
                arg.count = Math.floor((params.count-20) - (cnt * s));
                arg.extend = [arg.count*0.2,arg.count*0.8];
                arg.fixed = false;
                arg.pattern = pattern;
                arg.tag = 'AnimationMapName';
                if (a2[i].match(/\\I\[\d+\]/i)){
                    n += 34;
                }else{
                    n += tw;
                }
                CommonPopupManager._tempCommonSprites.setNullPos(arg);
                cnt++;
            }
        }
    };

    Game_Interpreter.prototype.showAmn = function(args) {
        CommonPopupManager.clearPopup('AnimationMapName');
        var amnParams = DataManager.makeAmnParams($gameSystem.amnParameters(),args);
        this.animationMapName(amnParams);
    };

    ////////////////////////////////////////////////////////////////////////////////////

    Game_Map.prototype.showMapName = function() {
        if (this.displayName()){
            this._interpreter.animationMapName($gameSystem.amnParameters());
        }
    };

    Game_Map.prototype.displayRegionAmn = function(params) {
        if(!this.isNameDisplayEnabled()) return;
        var args = params.split(' ');
        args[0] = 'text:' + args[0];
        this._interpreter.showAmn(args);
    };

    ////////////////////////////////////////////////////////////////////////////////////

    var _animeMN_GPlayer_performTransfer = Game_Player.prototype.performTransfer;
    Game_Player.prototype.performTransfer = function() {
        _animeMN_GPlayer_performTransfer.call(this);
        if($gameMap.isNameDisplayEnabled()) $gameMap.showMapName();
        $gameTemp._regionAmnArray = null;
        $gameTemp._lastRegionId = null;
    };

    var __GPlayer_update = Game_Player.prototype.update;
    Game_Player.prototype.update = function(sceneActive) {
        __GPlayer_update.call(this, sceneActive);
        if ($dataMap.note) {
            var ri = this.regionId();
            if (this.regionAmnArray(ri) && ri !== $gameTemp._lastRegionId) {
                $gameTemp._lastRegionId = ri;
                if ($dataMap.meta['RegionName' + ri]) {
                    $gameMap.displayRegionAmn($dataMap.meta['RegionName' + ri]);
                } else if ($dataMap.meta['リージョンネーム' + ri]) {
                    $gameMap.displayRegionAmn($dataMap.meta['リージョンネーム' + ri]);
                }
            }
        }
    };

    Game_Player.prototype.regionAmnArray = function(ri) {
        if ($gameTemp._regionAmnArray) return $gameTemp._regionAmnArray[ri];
        $gameTemp._regionAmnArray = [];
        for (var i = 1, max = 255; i < max; i++) {
            if ($dataMap.meta['RegionName' + i]) $gameTemp._regionAmnArray[i] = true;
            if ($dataMap.meta['リージョンネーム' + i]) $gameTemp._regionAmnArray[i] = true;
        }
        return $gameTemp._regionAmnArray[ri];
    };

    ////////////////////////////////////////////////////////////////////////////////////

    // 再定義　何もしなくする
    Window_MapName.prototype.open = function() {
        //this.refresh();
        this._showCount = 0;
    };

    ////////////////////////////////////////////////////////////////////////////////////

})();

repo_name: Rexhunk/karryn

license: unknown


code:
//=============================================================================
// AnotherNewGame.js
// ----------------------------------------------------------------------------
// Copyright (c) 2015 Triacontane
// This plugin is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.1.0 2016/03/29 fftfanttさんからご提供いただいたコードを反映させ、アナザーニューゲーム選択時に
//                  既存のセーブファイルをロードする機能を追加
// 1.0.1 2015/11/10 プラグイン適用中にセーブできなくなる不具合を修正
// 1.0.0 2015/11/07 初版
// ----------------------------------------------------------------------------
// [Blog]   : http://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================

/*:
 * @plugindesc アナザーニューゲーム追加プラグイン
 * @author トリアコンタン
 *
 * @param name
 * @desc タイトル画面に表示されるコマンド名です。（文字列）
 * @default Another New Game
 *
 * @param map_id
 * @desc 移動先のマップIDです。（自然数）
 * @default 1
 *
 * @param map_x
 * @desc 移動先のX座標です。（自然数）
 * @default 1
 *
 * @param map_y
 * @desc 移動先のY座標です。（自然数）
 * @default 1
 *
 * @param hidden
 * @desc デフォルトで選択肢を非表示にします。プラグインコマンドで有効化できます。（ON/OFF）
 * @default OFF
 *
 * @param disable
 * @desc デフォルトで選択肢を選択禁止にします。プラグインコマンドで有効化できます。（ON/OFF）
 * @default OFF
 *
 * @param file_load
 * @desc アナザーニューゲーム選択時に、ロード画面に遷移して既存セーブデータをロードできるようになります。（ON/OFF）
 * @default OFF
 *
 * @help タイトル画面のウィンドウの一番下に、もう一つのニューゲームを追加します。
 * 選択すると、ニューゲームとは別に指定したマップに遷移します。
 * クリア後のおまけやCG回想モード、スタッフクレジット、ミニゲーム、隠し要素など
 * 使い手次第で様々な用途に使えます。
 *
 * 選択肢は、あらかじめ非表示あるいは選択禁止にしておくことができます。
 * これらはプラグインコマンドから解除でき、解除状態はセーブファイルを
 * 超えてゲーム全体で共有されます。解除した状態を再度、禁止にすることもできます。
 *
 * プラグインコマンド詳細
 *   イベントコマンド「プラグインコマンド」から実行。
 *
 *  ANG_VISIBLE : アナザーニューゲームを表示にする。
 *  ANG_ENABLE : アナザーニューゲームを選択可能にする。
 *  ANG_HIDDEN : アナザーニューゲームを非表示にする。
 *  ANG_DISABLE : アナザーニューゲームを選択禁止にする。
 *
 * 利用規約：
 *  作者に無断で改変、再配布が可能で、利用形態（商用、18禁利用等）
 *  についても制限はありません。
 *  このプラグインはもうあなたのものです。
 */
(function () {
    var parameters = PluginManager.parameters('AnotherNewGame');
    var localExtraStage = false;

    //=============================================================================
    // Game_Interpreter
    //  プラグインコマンド[ANG_VISIBLE]などを追加定義します。
    //=============================================================================
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        switch (command.toUpperCase()) {
            case 'ANG_VISIBLE' :
                ANGSettingManager.visible = true;
                ANGSettingManager.save();
                break;
            case 'ANG_ENABLE' :
                ANGSettingManager.enable = true;
                ANGSettingManager.save();
                break;
            case 'ANG_HIDDEN' :
                ANGSettingManager.visible = false;
                ANGSettingManager.save();
                break;
            case 'ANG_DISABLE' :
                ANGSettingManager.enable = false;
                ANGSettingManager.save();
                break;
        }
    };

    //=============================================================================
    // Scene_Title
    //  アナザーニューゲームの選択時の処理を追加定義します。
    //=============================================================================
    var _Scene_Title_create = Scene_Title.prototype.create;
    Scene_Title.prototype.create = function() {
        this.loadAngSetting();
        _Scene_Title_create.call(this);
    };

    var _Scene_Title_commandContinue = Scene_Title.prototype.commandContinue;
    Scene_Title.prototype.commandContinue = function() {
        _Scene_Title_commandContinue.call(this);
        localExtraStage = false;
    };

    Scene_Title.prototype.loadAngSetting = function() {
        var angInfo = ANGSettingManager.load();
        ANGSettingManager.visible =
            angInfo['visible'] !== undefined ? angInfo['visible'] : parameters['hidden'].toUpperCase() !== "ON";
        ANGSettingManager.enable =
            angInfo['enable'] !== undefined ? angInfo['enable'] : parameters['disable'].toUpperCase() !== "ON";
    };

    Scene_Title.prototype.commandNewGameSecond = function() {
        if ((parameters['file_load'] || '').toUpperCase() !== 'ON') {
            var preMapId = $dataSystem.startMapId;
            var preStartX = $dataSystem.startX;
            var preStartY = $dataSystem.startY;
            $dataSystem.startMapId = parseInt(parameters['map_id'], 10) || 1;
            $dataSystem.startX     = parseInt(parameters['map_x'], 10)  || 1;
            $dataSystem.startY     = parseInt(parameters['map_y'], 10)  || 1;
            this.commandNewGame();
            $dataSystem.startMapId = preMapId;
            $dataSystem.startX     = preStartX;
            $dataSystem.startY     = preStartY;
        } else {
            this.commandContinue();
            localExtraStage = true;
        }
    };

    var _Scene_Title_createCommandWindow = Scene_Title.prototype.createCommandWindow;
    Scene_Title.prototype.createCommandWindow = function() {
        _Scene_Title_createCommandWindow.call(this);
        if (ANGSettingManager.visible)
            this._commandWindow.setHandler('nameGame2',  this.commandNewGameSecond.bind(this));
    };

    var _Scene_Load_onLoadSuccess = Scene_Load.prototype.onLoadSuccess;
    Scene_Load.prototype.onLoadSuccess = function() {
        _Scene_Load_onLoadSuccess.call(this);
        if (localExtraStage) {
            var mapId = parseInt(parameters['map_id'], 10) || 1;
            var x = parseInt(parameters['map_x'], 10)  || 1;
            var y = parseInt(parameters['map_y'], 10)  || 1;
            $gamePlayer.reserveTransfer(mapId, x, y);
            DataManager.selectSavefileForNewGame();
        }
    };

    //=============================================================================
    // Window_TitleCommand
    //  アナザーニューゲームの選択肢を追加定義します。
    //=============================================================================
    var _Window_TitleCommand_makeCommandList = Window_TitleCommand.prototype.makeCommandList;
    Window_TitleCommand.prototype.makeCommandList = function() {
        _Window_TitleCommand_makeCommandList.call(this);
        if (ANGSettingManager.visible) this.addCommand(parameters['name'], 'nameGame2', ANGSettingManager.enable);
    };

    var _Window_TitleCommand_updatePlacement = Window_TitleCommand.prototype.updatePlacement;
    Window_TitleCommand.prototype.updatePlacement = function() {
        _Window_TitleCommand_updatePlacement.call(this);
        if (ANGSettingManager.visible) this.y += this.height / 8;
    };

    //=============================================================================
    // ANGManager
    //  アナザーニューゲームの設定ファイルのセーブとロードを定義します。
    //=============================================================================
    function ANGSettingManager() {
        throw new Error('This is a static class');
    }

    ANGSettingManager.visible = false;
    ANGSettingManager.enable  = false;

    ANGSettingManager.make = function() {
        var info = {};
        info.visible = ANGSettingManager.visible;
        info.enable = ANGSettingManager.enable;
        return info;
    };

    ANGSettingManager.load = function() {
        var json;
        try {
            json = StorageManager.load(-1001);
        } catch (e) {
            console.error(e);
            return [];
        }
        if (json) {
            return JSON.parse(json);
        } else {
            return [];
        }
    };

    ANGSettingManager.save = function() {
        var info = ANGSettingManager.make();
        StorageManager.save(-1001, JSON.stringify(info));
    };

    //=============================================================================
    // StorageManager
    //  アナザーニューゲームの設定ファイルのパス取得処理を追加定義します。
    //=============================================================================
    var _StorageManager_localFilePath = StorageManager.localFilePath;
    StorageManager.localFilePath = function(savefileId) {
        if (savefileId === -1001) {
            return this.localFileDirectoryPath() + 'AnotherNewGame.rpgsave';
        } else {
            return _StorageManager_localFilePath.call(this, savefileId);
        }
    };

    var _StorageManager_webStorageKey = StorageManager.webStorageKey;
    StorageManager.webStorageKey = function(savefileId) {
        if (savefileId === -1001) {
            return 'RPG AnotherNewGame';
        } else {
            return _StorageManager_webStorageKey.call(this, savefileId);
        }
    };
})();


code:
//
//  オートバトル ver1.03
//
// author yana
//

var Imported = Imported || {};
Imported['yAutoBattle'] = 1.03;

/*:
 * @plugindesc ver1.03/戦闘中にキー入力でオートバトルを開始できるようにします。また、オートバトル中は高速化します。
 * @author Yana
 *
 * @param Invalidate Auto Battle Switch
 * @desc オートバトルを無効化するためのスイッチのIDです。
 * @default 11
 *
 * @param Show X
 * @desc AutoBattleWindowの表示位置X座標です。
 * AutoBattleWindowの横幅は320です。
 * @default 496
 *
 * @param Show Y
 * @desc AutoBattleWindowの表示位置Y座標です。
 * AutoBattleWindowの縦幅は49です。
 * @default 395
 *
 * @param Auto Battle Speed
 * @desc オートバトル時の戦闘速度です。
 *　1~4で設定してください。1がデフォルト、4が最速です。
 * @default 4
 *
 * @param Show Window
 * @desc AutoBattleWindowのWindowを表示するかの設定です。
 *　非表示の場合、テキストの後ろに黒い帯が表示されます。
 * @default true
 *
 * @param Auto Battle Use Skill
 * @desc オートバトル時、スキルを使用するかの設定です。
 *　trueの場合、通常の自動戦闘と同じ行動をします。
 * @default false
 *
 * @param Window Hide Switch
 * @desc AutoBattleWindowを隠すスイッチのIDです。
 *　会話イベントなどで消したいときに使用してください。
 * @default 12
 *
 * @param Auto Battle Key
 * @desc オートバトルの開始に使用するキーです。
 * @default shift
 *
 * @param Auto Battle Usable Message
 * @desc オートバトル中、AutoBattleWindowに表示するのテキストです。
 * _keyを設定されているキーに変換します。
 * @default 現在オートバトル中 _keyで解除
 *
 * @param Auto Battle Message
 * @desc オートバトル中以外に、AutoBattleWindowに表示するのテキストです。
 * _keyを設定されているキーに変換します。
 * @default _keyでオートバトル開始
 *
 * @help------------------------------------------------------
 *  このプラグインにはプラグインコマンドはありません。
 * ------------------------------------------------------
 * 仕様と解説
 * ------------------------------------------------------
 * ・AutoBattleWindowをクリックすることでもオートバトルの開始/停止が可能です。
 * ・Auto Battle Keyで使用可能なキーの一覧は以下の通りです。
 * pageup : Qキー、pageupキー、LBボタン
 * pagedown : Wキー、pagedownキー、RBボタン
 * shift : shiftキー、Xボタン
 * control : ctrlキー、altキー
 * tab : tabキー
 * menu : Yボタン
 * ・Auto Battle Use Skillがfalseの場合、通常攻撃のみを行います。
 * ・イベントが開始しても自動でウィンドウは消えません。これはコモンイベントなどで開いたり閉じたりするのを防ぐ目的があります。
 * ------------------------------------------------------
 * 利用規約：特になし。素材利用は自己責任でお願いします。
 * ------------------------------------------------------
 * ver1.03:
 * スキルウィンドウとアイテムウィンドウが開いたとき、オートバトルウィンドウが閉じるように修正。
 * ver1.02:
 * startMoveでcallが抜けていたバグを修正
 * ver1.01:
 * startTurnが2回実行される可能性のあるバグを修正
 * ver1.00:
 * 公開
 */

(function(){

	var parameters = PluginManager.parameters('AutoBattle');
	var invalidateAutoBattleSwitch = Number(parameters['Invalidate Auto Battle Switch'] || 11);
	var showX = Number(parameters['Show X'] || 496);
	var showY = Number(parameters['Show Y'] || 395);
	var autoBattleSpeed = Number(parameters['Auto Battle Speed'] || 4);
	var showWindow = String(parameters['Show Window'] || 'true') === 'true';
	var autoBattleUseSkill = String(parameters['Auto Battle Use Skill'] || 'false') === 'true';
	var windowHideSwitch = Number(parameters['Window Hide Switch'] || 12);
	var autoBattleKey = String(parameters['Auto Battle Key'] || 'shift');
	var autoBattleUsableMessage = String(parameters['Auto Battle Usable Message'] || '現在オートバトル中　Shiftで解除');
	var autoBattleMessage = String(parameters['Auto Battle Message'] || 'Shiftでオートバトル開始');

	BattleManager.isAutoBattle = function(){
		return this._autoBattle && !this.isAutoBattleInvalid();
	};

	BattleManager.autoBattleActivate = function(){
		this._autoBattle = true;
	};

	BattleManager.autoBattleDeactivate = function(){
		this._autoBattle = false;
	};

	BattleManager.isAutoBattleInvalid = function(){
		return $gameSwitches.value(invalidateAutoBattleSwitch);
	};

	BattleManager.startAutoBattle = function(){
		this.clearActor();
		for(var i=0;i<$gameParty.members().length;i++){
			this.selectNextCommand();
			var actor = this.actor();
			if (actor && actor.canInput()){
				actor.makeActions();
				if (autoBattleUseSkill){
					actor.makeAutoBattleActions();
				}else{
					actor._actions.forEach(function(action){
						action.setAttack();
						actor.selectNextCommand();
					});
				}
			}
		}
		if (BattleManager.isInputting()){ this.startTurn() }
	};

	var _aB_BManager_startInput = BattleManager.startInput;
	BattleManager.startInput = function(){
		_aB_BManager_startInput.call(this);
		if (this.isAutoBattle()){ this.startAutoBattle() }
	};

	var _aB_BManager_startTurn = BattleManager.startTurn;
	BattleManager.startTurn = function() {
		if (!this.isAutoBattle()){ SceneManager._scene._autoBattleWindow.close() }
		_aB_BManager_startTurn.call(this);
    };

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

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

	Window_AutoBattle.prototype.initialize = function() {
		Window_Base.prototype.initialize.call(this,showX,showY,320,49);
		if (!showWindow){ this.opacity = 0 }
		this.refresh();
	};

	Window_AutoBattle.prototype.standardPadding = function(){
		return 6;
	};

	Window_AutoBattle.prototype.refresh = function(){
		this.contents.clear();
		this.contents.fontSize = 18;
		var b1 = 'rgba(0,0,0,0)';
		var b2 = 'rgba(0,0,0,0.5)';
		if (!showWindow){
			var w = this.contentsWidth()/4;
			this.contents.gradientFillRect(0,0,w,32,b1,b2);
			this.contents.fillRect(w,0,w*2,32,b2);
			this.contents.gradientFillRect(w*3,0,w,32,b2,b1);
		}
		var text = BattleManager.isAutoBattle() ? autoBattleUsableMessage : autoBattleMessage;
		text = text.replace(/_key/,autoBattleKey);
		this.drawText(text,0,0,this.contentsWidth(),'center');
	};

	///////////////////////////////////////////////////////////////////////////////////

	var _aB_SBattle_createAllWindows = Scene_Battle.prototype.createAllWindows;
	Scene_Battle.prototype.createAllWindows = function(){
		_aB_SBattle_createAllWindows.call(this);
		this.createAutoBattleWindow();
	};

	Scene_Battle.prototype.createAutoBattleWindow = function(){
		this._autoBattleWindow = new Window_AutoBattle();
		this._autoBattleWindow.hide();
		this._autoBattleWindow.close();
		this.addWindow(this._autoBattleWindow);
	};

	var _aB_SBattle_updateTurn = Scene_Battle.prototype.update;
	Scene_Battle.prototype.update = function() {
		_aB_SBattle_updateTurn.call(this);
		if (this._autoBattleWindow.isOpen() &&
			(Input.isTriggered(autoBattleKey) || this.onTouchCallAutoBattle())){
			if (BattleManager.isAutoBattle()){
				this.deactivateAutoBattle();
				SoundManager.playCancel();
			} else if (!BattleManager.isInTurn() && !BattleManager.isAutoBattleInvalid() &&
					  (this._partyCommandWindow.active || this._actorCommandWindow.active)){
				this.activateAutoBattle();
				SoundManager.playOk();
				this._partyCommandWindow.deactivate();
				this._actorCommandWindow.deactivate();
				BattleManager.startAutoBattle();
			}
		} else if (this._autoBattleWindow.isOpen() &&
				  (this.isHideAutoBattleWindow() || BattleManager.isAutoBattleInvalid())){
			this.deactivateAutoBattle();
		}
		this.endHideAutoBattleWindow();
	};

	Scene_Battle.prototype.onTouchCallAutoBattle = function(){
		if (TouchInput.isTriggered()){
			var x = TouchInput.x;
			var y = TouchInput.y;
			var ax = this._autoBattleWindow.x;
			var xw = ax + this._autoBattleWindow.width;
			var ay = this._autoBattleWindow.y;
			var yh = ay + this._autoBattleWindow.height;
			return x >= ax && x <= xw && y >= ay && y <= yh;
		}
		return false;
	};

	Scene_Battle.prototype.canAuto = function(){
		return !(BattleManager.isAutoBattleInvalid() || this.isHideAutoBattleWindow());
	};

	var _aB_SBattle_startPartyCommandSelection = Scene_Battle.prototype.startPartyCommandSelection;
	Scene_Battle.prototype.startPartyCommandSelection = function() {
		if (this.canAuto()){
			this._autoBattleWindow.show();
			this._autoBattleWindow.open();
		}
		_aB_SBattle_startPartyCommandSelection.call(this);
	};

	var _aB_SBattle_startActorCommandSelection = Scene_Battle.prototype.startActorCommandSelection;
	Scene_Battle.prototype.startActorCommandSelection = function(){
		_aB_SBattle_startActorCommandSelection.call(this);
		if (this.canAuto()){ this._autoBattleWindow.open() }
	};

	var _aB_SBattle_commandSkill = Scene_Battle.prototype.commandSkill;
	Scene_Battle.prototype.commandSkill = function(){
		_aB_SBattle_commandSkill.call(this);
		this._autoBattleWindow.close();
	};

	var _aB_SBattle_commandItem = Scene_Battle.prototype.commandItem;
	Scene_Battle.prototype.commandItem = function(){
		_aB_SBattle_commandItem.call(this);
		this._autoBattleWindow.close();
	};

	var _aB_SBattle_onSkillCancel = Scene_Battle.prototype.onSkillCancel;
	Scene_Battle.prototype.onSkillCancel = function(){
		_aB_SBattle_onSkillCancel.call(this);
		if (this.canAuto()){ this._autoBattleWindow.open() }
	};

	var _aB_SBattle_onItemCancel = Scene_Battle.prototype.onItemCancel;
	Scene_Battle.prototype.onItemCancel = function(){
		_aB_SBattle_onItemCancel.call(this);
		if (this.canAuto()){ this._autoBattleWindow.open() }
	};

	var _aB_SBattle_commandEscape = Scene_Battle.prototype.commandEscape;
	Scene_Battle.prototype.commandEscape = function(){
		if (!BattleManager.isAutoBattle()){ this._autoBattleWindow.close() }
		this.deactivateAutoBattle();
		_aB_SBattle_commandEscape.call(this);
	};

	Scene_Battle.prototype.isHideAutoBattleWindow = function(){
		return $gameSwitches.value(windowHideSwitch);
	};

	Scene_Battle.prototype.endHideAutoBattleWindow = function(){
		if (BattleManager.isAborting() || $gameParty.members().length === 0 ||
			$gameParty.isAllDead() || $gameTroop.isAllDead()){
			this.deactivateAutoBattle();
		}
	};

	Scene_Battle.prototype.deactivateAutoBattle = function(){
		BattleManager.autoBattleDeactivate();
		this._autoBattleWindow.refresh();
		if (this._autoBattleWindow.isOpen()){ this._autoBattleWindow.close() }
	};

	Scene_Battle.prototype.activateAutoBattle = function(){
		BattleManager.autoBattleActivate();
		this._autoBattleWindow.refresh();
		if (!this._autoBattleWindow.isOpen()){ this._autoBattleWindow.open() }
		Input.update();
   		TouchInput.update();
	};

	// オートバトル中、メッセージ速度を変更
	var _aB_WBLog_messageSpeed = Window_BattleLog.prototype.messageSpeed;
	Window_BattleLog.prototype.messageSpeed = function() {
		if (BattleManager.isAutoBattle()){
			return _aB_WBLog_messageSpeed.call(this) / autoBattleSpeed;
		}else{
			return _aB_WBLog_messageSpeed.call(this);
		}
	};

	// オートバトル中、rateを高速化
	var _aB_SAnimation_setupRate = Sprite_Animation.prototype.setupRate;
	Sprite_Animation.prototype.setupRate = function() {
		if (BattleManager.isAutoBattle()){
			this._rate = 4 / autoBattleSpeed;
		}else{
			_aB_SAnimation_setupRate.call(this);
		}
	};

	// オートバトル中、アクターのアクション待ちを短縮
	var _aB_SBattler_startMove = Sprite_Battler.prototype.startMove;
	Sprite_Battler.prototype.startMove = function(x, y, duration) {
    	if (BattleManager.isAutoBattle()){
    		duration /= autoBattleSpeed;
    	}
    	_aB_SBattler_startMove.call(this,x,y,duration);
	};
}());


code:
//=============================================================================
// BB_CenterSlide.js
//=============================================================================

/*:
 * @plugindesc 画面の中心点をずらすプラグイン
 * @author ビービー
 *
 * @param Switch ID
 * @desc 指定したスイッチIDがONの時に中心点をずらします。デフォルト：1
 * @default 1
 *
 * @param Center X
 * @desc 画面中心点をX方向にずらす数値です。デフォルト：0
 * @default 0
 *
 * @param Center Y
 * @desc 画面中心点をY方向にずらす数値です。デフォルト：0
 * @default 0
 *
 * @help 画面の中心点をずらすプラグインです。
 * ※スイッチをＯＮにしただけでは中心点をずらすことはできません。
 * 場所移動などでマップがリロードされるタイミングで中心点をずらします。
 * 画面切り替えなしでずらしたい場合は、場所移動を向きそのまま、フェードなしで
 * 今いる場所を指定していただけるのがベストかと思います。
 *
 * パラメータ
 * Switch ID：指定したスイッチIDがONの時に中心点をずらします。デフォルト：1
 * Center X：画面中心点をX方向にずらす数値です。マイナス値で逆にずらせます。
 * Center Y：画面中心点をY方向にずらす数値です。マイナス値で逆にずらせます。
 *
 */

(function() {

// プラグインパラメータ管理
var parameters = PluginManager.parameters('BB_CenterSlide');
var BBcenterX = Number(parameters['Center X'] || 0);
var BBcenterY = Number(parameters['Center Y'] || 0);
var BBCSswitch = Number(parameters['Switch ID'] || 1);

Game_Player.prototype.centerX = function() {
    var x = BBcenterX;
　　if($gameSwitches.value(BBCSswitch)){
        return (Graphics.width / $gameMap.tileWidth() - 1) / 2.0 + x;
            }else{
        return (Graphics.width / $gameMap.tileWidth() - 1) / 2.0;
            }
};

Game_Player.prototype.centerY = function() {
    var y = BBcenterY;
　　if($gameSwitches.value(BBCSswitch)){
    　　return (Graphics.height / $gameMap.tileHeight() - 1) / 2.0 + y;
            }else{
    　　return (Graphics.height / $gameMap.tileHeight() - 1) / 2.0;
            }
};

})();


code:
(function(){
    'use strict';

    // フェードイン時間（フレーム数）
    var fadeDuration = 0;

    // フェード用Bitmap
    var fadeBitmap = null;

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

    var _Scene_Map_startFadeIn = Scene_Map.prototype.startFadeIn;
    Scene_Map.prototype.startFadeIn = function(duration, white) {
        if (SceneManager.isPreviousScene(Scene_Battle) && fadeBitmap) {
            // フェード時間設定
            duration = fadeDuration;
            // フェードスプライトがすでに作られていたら削除
            if (this._fadeSprite) {
                this.removeChild(this._fadeSprite);
                this._fadeSprite = null;
            }
            // 元関数呼び出し
            _Scene_Battle_startFadeIn.call(this, duration, white);
            // フェードイン用の画像を、事前にキャプチャした画像に差し替え
            this.removeChild(this._fadeSprite);
            this._fadeSprite = new Sprite(fadeBitmap);
            this.addChild(this._fadeSprite);
            return;
        }
        if (!(this._fadeSprite instanceof ScreenSprite)) {
            this._fadeSprite = null;
        }
        _Scene_Map_startFadeIn.call(this, duration, white);
    };

    var _Scene_Map_startFadeOut = Scene_Map.prototype.startFadeOut;
    Scene_Map.prototype.startFadeOut = function(duration, white) {
        if (!(this._fadeSprite instanceof ScreenSprite)) {
            this._fadeSprite = null;
        }
        _Scene_Battle_startFadeOut.call(this, duration, white);
    };

    Scene_Map.prototype.startEncounterEffect = function() {
        // ウインドウ非表示
        this._windowLayer.visible = false;
        // マップクリック時の行き先エフェクトを消す
        $gameTemp.clearDestination();
        this._spriteset._destinationSprite.visible = false;
        // イベントを残した画面をキャプチャ
        fadeBitmap = Bitmap.snap(this);
        // イベント非表示
        this._spriteset.hideCharacters();
        // イベントを消した画面をキャプチャ
        SceneManager._backgroundBitmap = Bitmap.snap(this);
        // イベント非表示を解除
        this._spriteset._characterSprites.forEach(function(sprite) {
            if (!sprite.isTile()) {
                sprite.show();
            }
        });
        // ウインドウ非表示を解除
        this._windowLayer.visible = true;
    };

    //==============================================================================
    // Scene_Battle
    //==============================================================================

    var _Scene_Battle_startFadeIn = Scene_Battle.prototype.startFadeIn;
    Scene_Battle.prototype.startFadeIn = function(duration, white) {
        if (fadeBitmap) {
            // フェード時間設定
            duration = fadeDuration;
            // フェードスプライトがすでに作られていたら削除
            if (this._fadeSprite) {
                this.removeChild(this._fadeSprite);
                this._fadeSprite = null;
            }
            // 元関数呼び出し
            _Scene_Battle_startFadeIn.call(this, duration, white);
            // フェードイン用の画像を、事前にキャプチャした画像に差し替え
            this.removeChild(this._fadeSprite);
            this._fadeSprite = new Sprite(fadeBitmap);
            this.addChild(this._fadeSprite);
            return;
        }
        if (!(this._fadeSprite instanceof ScreenSprite)) {
            this._fadeSprite = null;
        }
        _Scene_Battle_startFadeIn.call(this, duration, white);
    };

    var _Scene_Battle_startFadeOut = Scene_Battle.prototype.startFadeOut;
    Scene_Battle.prototype.startFadeOut = function(duration, white) {
        this._fadeSprite = null;
        // 元関数呼び出し
        _Scene_Battle_startFadeOut.call(this, duration, white);
        // フェード無効化
        this._fadeDuration = 0;
        // ウインドウ非表示
        this._windowLayer.visible = false;
        // 画面をキャプチャ
        fadeBitmap = Bitmap.snap(this);
        // ウインドウ非表示を解除
        this._windowLayer.visible = true;
    };
}());


code:
var CC_Mod = CC_Mod || {};
CC_Mod.Gyaru = CC_Mod.Gyaru || {};

//=============================================================================
 /*:
 * @plugindesc Skin/eye/hair recolors and supporting passives/edicts
 * @author chainchariot/drchainchair/whatever random throwaway name I picked
 *  Current account on F95: https://f95zone.to/members/drchainchair2.2159881/
 *
 *  Asset contributions by tessai.san https://f95zone.to/members/tessai-san.1204811/
 *
 * @help
 * This is a free plugin.
 * If you want to redistribute it, leave this header intact.
 *
 */
//=============================================================================

// Mod Options
//////////////////////////////////////////////////////////////

var CCMod_gyaruEnabled = true;
var CCMod_edict_gyaruRequiredSlutLevel = 100;

//=============================================================================
//////////////////////////////////////////////////////////////
// Vars & Utility Functions

const CCMOD_DEBUG_GYARU = false;

const CCMOD_GYARU_SUFFIX_NONE               = '';

// Only skin tone is in a separate file
const CCMOD_GYARU_SUFFIX_SKINCOLOR_TAN      = '_tan';

// Not currently used as file paths but still need something to call colors
const CCMOD_GYARU_SUFFIX_HAIRCOLOR_PURPLE   = '_purple'; // default
const CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLONDE   = '_blonde';
const CCMOD_GYARU_SUFFIX_HAIRCOLOR_RED      = '_red';
const CCMOD_GYARU_SUFFIX_HAIRCOLOR_GREEN    = '_green';
const CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLUE     = '_blue';

const CCMOD_GYARU_SUFFIX_EYECOLOR_BLUE      = '_eyeBlue'; // default
const CCMOD_GYARU_SUFFIX_EYECOLOR_RED       = '_eyeRed';
const CCMOD_GYARU_SUFFIX_EYECOLOR_GREEN     = '_eyeGreen';
const CCMOD_GYARU_SUFFIX_EYECOLOR_BROWN     = '_eyeBrown';

// Cropped image with only hair
// Either actor.tachieBody or actor.tachieHead is added to the filename
// eg. hairpart_1, hairpart_fera, hairpart_normal_1, etc.
const CCMOD_GYARU_PREFIX_HAIRCOLOR_HAIRPART = 'hairpart_';

// Hair Colors
// hueRotation, toneR, toneG, toneB
// hue 0 to 360, tone -255 to 255
const CCMOD_GYARU_DEFINE_HAIRCOLOR_NONE     = [0, 0, 0, 0];
const CCMOD_GYARU_DEFINE_HAIRCOLOR_BLONDE   = [120, 0, 0, 0];
const CCMOD_GYARU_DEFINE_HAIRCOLOR_RED      = [80, 0, 0, 0];
const CCMOD_GYARU_DEFINE_HAIRCOLOR_GREEN    = [180, 0, 0, 0];
const CCMOD_GYARU_DEFINE_HAIRCOLOR_BLUE     = [240, 0, 0, 0];

// Eye Colors
const CCMOD_GYARU_DEFINE_EYECOLOR_NONE      = [0, 0, 0, 0];
const CCMOD_GYARU_DEFINE_EYECOLOR_RED       = [120, 0, 0, 0];
const CCMOD_GYARU_DEFINE_EYECOLOR_BROWN     = [180, 0, 0, 0];
const CCMOD_GYARU_DEFINE_EYECOLOR_GREEN     = [240, 0, 0, 0];

// Edicts
const CCMOD_EDICT_HAIRCOLOR_NONE_ID     = 1980;
const CCMOD_EDICT_EYECOLOR_NONE_ID      = 1982;
const CCMOD_EDICT_SKINCOLOR_NONE_ID     = 1981;

const CCMOD_EDICT_HAIRCOLOR_BLONDE_ID   = 1983;
const CCMOD_EDICT_HAIRCOLOR_RED_ID      = 1984;
const CCMOD_EDICT_HAIRCOLOR_GREEN_ID    = 1985;
const CCMOD_EDICT_HAIRCOLOR_BLUE_ID     = 1986;

const CCMOD_EDICT_EYECOLOR_RED_ID       = 1990;
const CCMOD_EDICT_EYECOLOR_GREEN_ID     = 1991;
const CCMOD_EDICT_EYECOLOR_BROWN_ID     = 1992;

const CCMOD_EDICT_SKINCOLOR_TAN_ID      = 1989;

const CCMOD_EDICTS_NONE = [ CCMOD_EDICT_HAIRCOLOR_NONE_ID,
                            CCMOD_EDICT_EYECOLOR_NONE_ID,
                            CCMOD_EDICT_SKINCOLOR_NONE_ID ];
const CCMOD_EDICTS_HAIR = [ CCMOD_EDICT_HAIRCOLOR_BLONDE_ID,
                            CCMOD_EDICT_HAIRCOLOR_RED_ID,
                            CCMOD_EDICT_HAIRCOLOR_GREEN_ID,
                            CCMOD_EDICT_HAIRCOLOR_BLUE_ID ];
const CCMOD_EDICTS_EYE  = [ CCMOD_EDICT_EYECOLOR_RED_ID,
                            CCMOD_EDICT_EYECOLOR_GREEN_ID,
                            CCMOD_EDICT_EYECOLOR_BROWN_ID ];
const CCMOD_EDICTS_SKIN = [ CCMOD_EDICT_SKINCOLOR_TAN_ID ];

// Passives
// Ideas: increase slut level based on days as gyaru?
//        general desire modifiers, like faster desire increase?

// See RemtairyPoses.js
const CCMOD_GYARU_SUPPORTED_POSES_SKINCOLOR =
    [ POSE_MAP, POSE_ATTACK ];

const CCMOD_GYARU_SUPPORTED_POSES_HAIRCOLOR =
    [ POSE_MAP, POSE_STANDBY, POSE_UNARMED, POSE_ATTACK, POSE_WAITRESS_SEX,
      POSE_BJ_KNEELING ];

// Should just be all of them
const CCMOD_GYARU_UNSUPPORTED_POSES_EYECOLOR =
    [ ];

// Todo
const CCMOD_GYARU_SUPPORTED_CUTIN =
    [ ];

// Pose map for hair attached to the body or head in image file
// to determine file name of the hair part file
// Poses in here have the body and head merged in the body file
const CCMOD_GYARU_POSES_HEADBODY_MERGED =
    [ POSE_ATTACK, POSE_BJ_KNEELING, POSE_DEFEATED_GUARD, POSE_DEFEATED_LEVEL1, POSE_DEFEATED_LEVEL2,
      POSE_DEFEND, POSE_DOWN_FALLDOWN, POSE_DOWN_ORGASM, POSE_DOWN_STAMINA, POSE_EVADE, POSE_GOBLINCUNNILINGUS,
      POSE_GUARDGANGBANG, POSE_HJ_STANDING, POSE_KICK, POSE_KICKCOUNTER, POSE_ORC_PAIZURI, POSE_PAIZURI_LAYING,
      POSE_RECEPTIONIST, POSE_RIMJOB, POSE_SLIME_PILEDRIVER_ANAL, POSE_STANDBY, POSE_THUGGANGBANG, POSE_UNARMED,
      POSE_WAITRESS_SEX ];
    // Pose 'dogeza' appears to fit in here but it's just wip sketches still

// mas_1 is special case, the only pose with 'hair' parts built in
const CCMOD_GYARU_POSES_WITHHAIR =
    [ POSE_MASTURBATE1 ];

// Setup
CC_Mod.initializeGyaruMod = function(actor) {
    if (actor._CCMod_version < CCMOD_VERSION_6n_2) {
        CC_Mod.setupGyaruRecords(actor);
        actor.CCMod_setupStartingGyaruEdicts();
    }

    CC_Mod.CCMod_currentPoseName = false;
    CC_Mod.CCMod_currentHairName = false;
    CC_Mod.CCMod_currentEyeName = false;

    actor._CCMod_currentHairColor = CC_Mod.Gyaru_getHairName(actor);
    actor._CCMod_currentEyeColor = CC_Mod.Gyaru_getEyeName(actor);
    actor._CCMod_currentSkinColor = CC_Mod.Gyaru_getSkinName(actor);

    CC_Mod.Gyaru_initEdictRequirements();
};

CC_Mod.setupGyaruRecords = function(actor) {
    actor._CCMod_recordDaysDyedHair = 0;
    actor._CCMod_recordDaysDyedEyes = 0;
    actor._CCMod_recordDaysDyedSkin = 0;

    actor._CCMod_recordDaysAsGyaru  = 0;
};

CC_Mod.Gyaru_advanceNextDay = function(actor) {
    if (CC_Mod.Gyaru_isHairChanged(actor)) {
        actor._CCMod_recordDaysDyedHair++;
    }
    if (CC_Mod.Gyaru_isEyeChanged(actor)) {
        actor._CCMod_recordDaysDyedEyes++;
    }
    if (CC_Mod.Gyaru_isSkinChanged(actor)) {
        actor._CCMod_recordDaysDyedSkin++;
    }

    if (CC_Mod.isGyaru(actor)) {
        actor._CCMod_recordDaysAsGyaru++;
    }
};

// hasEdict of type, all edicts go here
CC_Mod.Gyaru_hasHairEdict = function(actor) {
    let edict = false;
    for (var n = 0; n < CCMOD_EDICTS_HAIR.length; n++) {
        if (Karryn.hasEdict(CCMOD_EDICTS_HAIR[n])) {
            edict = true;
            break;
        }
    }
    return edict;
};

CC_Mod.Gyaru_hasEyeEdict = function(actor) {
    let edict = false;
    for (var n = 0; n < CCMOD_EDICTS_EYE.length; n++) {
        if (Karryn.hasEdict(CCMOD_EDICTS_EYE[n])) {
            edict = true;
            break;
        }
    }
    return edict;
};

CC_Mod.Gyaru_hasSkinEdict = function(actor) {
    let edict = false;
    for (var n = 0; n < CCMOD_EDICTS_SKIN.length; n++) {
        if (Karryn.hasEdict(CCMOD_EDICTS_SKIN[n])) {
            edict = true;
            break;
        }
    }
    return edict;
};

// isChanged in current pose
CC_Mod.Gyaru_isHairEdictChanged = function(actor) {
    currentHair = CC_Mod.Gyaru_getHairName(actor);
    let changed = false;
    if (currentHair != actor._CCMod_currentHairColor) {
        changed = true;
    }
    return changed;
};

CC_Mod.Gyaru_isHairChanged = function(actor) {
    if (!CCMod_gyaruEnabled) {
        return false;
    }

    let changed = false;
    // Hair is always drawn in supported poses
    if (CC_Mod.Gyaru_isHairPoseSupported(actor.poseName)) {
        changed = true;
    }
    return changed;
};

CC_Mod.Gyaru_isEyeEdictChanged = function(actor) {
    currentEye = CC_Mod.Gyaru_getEyeName(actor);
    let changed = false;
    if (currentEye != actor._CCMod_currentEyeColor) {
        changed = true;
    }
    return changed;
};

CC_Mod.Gyaru_isEyeChanged = function(actor) {
    if (!CCMod_gyaruEnabled) {
        return false;
    }

    let changed = false;
    if (CC_Mod.Gyaru_isEyePoseSupported(actor.poseName) &&
        CC_Mod.Gyaru_hasEyeEdict(actor)) {
        changed = true;
    }
    return changed;
};

CC_Mod.Gyaru_isSkinEdictChanged = function(actor) {
    currentSkin = CC_Mod.Gyaru_getSkinName(actor);
    let changed = false;
    if (currentSkin != actor._CCMod_currentSkinColor) {
        changed = true;
    }
    return changed;
};

CC_Mod.Gyaru_isSkinChanged = function(actor) {
    if (!CCMod_gyaruEnabled) {
        return false;
    }

    let changed = false;
    if (CC_Mod.Gyaru_isSkinPoseSupported(actor.poseName) &&
        CC_Mod.Gyaru_hasSkinEdict(actor)) {
        changed = true;
    }
    return changed;
};

// getSuffixName
// Should return empty if default or inactive
CC_Mod.Gyaru_getHairName = function(actor) {
    let name = CCMOD_GYARU_SUFFIX_NONE;
    if (CC_Mod.Gyaru_isHairChanged(actor)) {
        if (Karryn.hasEdict(CCMOD_EDICT_HAIRCOLOR_BLONDE_ID)) {
            name = CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLONDE;
        } else if (Karryn.hasEdict(CCMOD_EDICT_HAIRCOLOR_RED_ID)) {
            name = CCMOD_GYARU_SUFFIX_HAIRCOLOR_RED;
        } else if (Karryn.hasEdict(CCMOD_EDICT_HAIRCOLOR_GREEN_ID)) {
            name = CCMOD_GYARU_SUFFIX_HAIRCOLOR_GREEN;
        } else if (Karryn.hasEdict(CCMOD_EDICT_HAIRCOLOR_BLUE_ID)) {
            name = CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLUE;
        }
    }
    return name;
};

CC_Mod.Gyaru_getEyeName = function(actor) {
    let name = CCMOD_GYARU_SUFFIX_NONE;
    if (CC_Mod.Gyaru_isEyeChanged(actor)) {
        if (Karryn.hasEdict(CCMOD_EDICT_EYECOLOR_RED_ID)) {
            name = CCMOD_GYARU_SUFFIX_EYECOLOR_RED;
        } else if (Karryn.hasEdict(CCMOD_EDICT_EYECOLOR_GREEN_ID)) {
            name = CCMOD_GYARU_SUFFIX_EYECOLOR_GREEN;
        } else if (Karryn.hasEdict(CCMOD_EDICT_EYECOLOR_BROWN_ID)) {
            name = CCMOD_GYARU_SUFFIX_EYECOLOR_BROWN;
        }
    }
    return name;
};

CC_Mod.Gyaru_getSkinName = function(actor) {
    let name = CCMOD_GYARU_SUFFIX_NONE;
    if (CC_Mod.Gyaru_isSkinChanged(actor)) {
        if (Karryn.hasEdict(CCMOD_EDICT_SKINCOLOR_TAN_ID)) {
            name = CCMOD_GYARU_SUFFIX_SKINCOLOR_TAN;
        }
    }
    return name;
};

// Full hairFileName
CC_Mod.Gyaru_getHairPartFileName = function(actor) {
    let name = CCMOD_GYARU_PREFIX_HAIRCOLOR_HAIRPART;
    if (CCMOD_GYARU_POSES_HEADBODY_MERGED.includes(actor.poseName)) {
        // using tachieBody
        name += actor.tachieBody;
    } else {
        // using tachieHead
        name += actor.tachieHead;
    }
    return name;
};

// getColorData
CC_Mod.Gyaru_getHairColorData = function(actor) {
    hair = CC_Mod.Gyaru_getHairName(actor);
    color = CCMOD_GYARU_DEFINE_HAIRCOLOR_NONE;
    if (hair == CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLONDE) {
        color = CCMOD_GYARU_DEFINE_HAIRCOLOR_BLONDE;
    } else if (hair == CCMOD_GYARU_SUFFIX_HAIRCOLOR_RED) {
        color = CCMOD_GYARU_DEFINE_HAIRCOLOR_RED;
    } else if (hair == CCMOD_GYARU_SUFFIX_HAIRCOLOR_GREEN) {
        color = CCMOD_GYARU_DEFINE_HAIRCOLOR_GREEN;
    } else if (hair == CCMOD_GYARU_SUFFIX_HAIRCOLOR_BLUE) {
        color = CCMOD_GYARU_DEFINE_HAIRCOLOR_BLUE;
    }
    return color;
};

CC_Mod.Gyaru_getEyeColorData = function(actor) {
    eye = CC_Mod.Gyaru_getEyeName(actor);
    color = CCMOD_GYARU_DEFINE_EYECOLOR_NONE;
    if (eye == CCMOD_GYARU_SUFFIX_EYECOLOR_RED) {
        color = CCMOD_GYARU_DEFINE_EYECOLOR_RED;
    } else if (eye == CCMOD_GYARU_SUFFIX_EYECOLOR_GREEN) {
        color = CCMOD_GYARU_DEFINE_EYECOLOR_GREEN;
    } else if (eye == CCMOD_GYARU_SUFFIX_EYECOLOR_BROWN) {
        color = CCMOD_GYARU_DEFINE_EYECOLOR_BROWN;
    }
    return color;
};

// Filter for supported poses
CC_Mod.Gyaru_isHairPoseSupported = function(pose) {
    if (CCMOD_GYARU_SUPPORTED_POSES_HAIRCOLOR.includes(pose)) {
        return true;
    }
    return false;
};

CC_Mod.Gyaru_isEyePoseSupported = function(pose) {
    if (CCMOD_GYARU_UNSUPPORTED_POSES_EYECOLOR.includes(pose)) {
        return false;
    }
    return true;
};

CC_Mod.Gyaru_isSkinPoseSupported = function(pose) {
    if (CCMOD_GYARU_SUPPORTED_POSES_SKINCOLOR.includes(pose)) {
        return true;
    }
    return false;
};

// Need to have changes to hair, skin, and eyes
CC_Mod.isGyaru = function(actor) {
    return (CC_Mod.Gyaru_hasHairEdict(actor) && CC_Mod.Gyaru_hasEyeEdict(actor) && CC_Mod.Gyaru_hasSkinEdict(actor));
};

// returns TRUE for draw on body, FALSE for draw on head
CC_Mod.Gyaru_checkHairDrawOrder = function(actor) {
    if (CCMOD_GYARU_POSES_HEADBODY_MERGED.includes(actor.poseName)) {
        return true;
    }
    return false;
};

//=============================================================================
//////////////////////////////////////////////////////////////
// Edicts

CC_Mod.Gyaru_initEdictRequirements = function() {
    let skill = $dataSkills[CCMOD_EDICT_HAIRCOLOR_BLONDE_ID];
    skill.remMessageEN[2] = "Testing dynamic text";
};

Game_Actor.prototype.CCMod_edict_gyaruHairColorReq = function() {
    return true;
};

Game_Actor.prototype.CCMod_edict_gyaruEyeColorReq = function() {
    return true;
};

Game_Actor.prototype.CCMod_edict_gyaruSkinColorReq = function() {
    return true;
};

Game_Actor.prototype.CCMod_setupStartingGyaruEdicts = function() {
    this.learnSkill(CCMOD_EDICT_HAIRCOLOR_NONE_ID);
    this.learnSkill(CCMOD_EDICT_EYECOLOR_NONE_ID);
    this.learnSkill(CCMOD_EDICT_SKINCOLOR_NONE_ID);
};

//=============================================================================
//////////////////////////////////////////////////////////////
// SabaTachie Hooks

// Using file name instead of tachie name since that one is used in direct comparisons to set other stuff up

CC_Mod.Gyaru.Game_Actor_tachieBodyFile = Game_Actor.prototype.tachieBodyFile;
Game_Actor.prototype.tachieBodyFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieBodyFile.call(this);
    if (f != null) {
        //if (CCMOD_GYARU_SUPPORTED_POSES_HAIRCOLOR.includes(this.poseName)) {
        //    f = f + CC_Mod.Gyaru_getHairName(this);
        //}
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieRightArmFile = Game_Actor.prototype.tachieRightArmFile;
Game_Actor.prototype.tachieRightArmFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieRightArmFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieLeftArmFile = Game_Actor.prototype.tachieLeftArmFile;
Game_Actor.prototype.tachieLeftArmFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieLeftArmFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieHeadFile = Game_Actor.prototype.tachieHeadFile;
Game_Actor.prototype.tachieHeadFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieHeadFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieHatFile = Game_Actor.prototype.tachieHatFile;
Game_Actor.prototype.tachieHatFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachieHatFile.call(this);
};

CC_Mod.Gyaru.Game_Actor_tachiePubicFile = Game_Actor.prototype.tachiePubicFile;
Game_Actor.prototype.tachiePubicFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachiePubicFile.call(this);
};

CC_Mod.Gyaru.Game_Actor_tachieLegsFile = Game_Actor.prototype.tachieLegsFile;
Game_Actor.prototype.tachieLegsFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieLegsFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieBoobsFile = Game_Actor.prototype.tachieBoobsFile;
Game_Actor.prototype.tachieBoobsFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieBoobsFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieLeftBoobFile = Game_Actor.prototype.tachieLeftBoobFile;
Game_Actor.prototype.tachieLeftBoobFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieLeftBoobFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieRightBoobFile = Game_Actor.prototype.tachieRightBoobFile;
Game_Actor.prototype.tachieRightBoobFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieRightBoobFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieButtFile = Game_Actor.prototype.tachieButtFile;
Game_Actor.prototype.tachieButtFile = function () {
    let f = CC_Mod.Gyaru.Game_Actor_tachieButtFile.call(this);
    if (f != null) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieFrontAFile = Game_Actor.prototype.tachieFrontAFile;
Game_Actor.prototype.tachieFrontAFile = function () {
    // Need to filter this here to check for 'leftarm'
    let f = CC_Mod.Gyaru.Game_Actor_tachieFrontAFile.call(this);
    if (f != null && f.includes('leftarm')) {
        f = f + CC_Mod.Gyaru_getSkinName(this);
    }
    return f;
};

CC_Mod.Gyaru.Game_Actor_tachieEyesFile = Game_Actor.prototype.tachieEyesFile;
Game_Actor.prototype.tachieEyesFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachieEyesFile.call(this);
};

CC_Mod.Gyaru.Game_Actor_tachieHairFile = Game_Actor.prototype.tachieHairFile;
Game_Actor.prototype.tachieHairFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachieHairFile.call(this);
};

CC_Mod.Gyaru.Game_Actor_tachieCutInFile = Game_Actor.prototype.tachieCutInFile;
Game_Actor.prototype.tachieCutInFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachieCutInFile.call(this);
};

CC_Mod.Gyaru.Game_Actor_tachieFaceFile = Game_Actor.prototype.tachieFaceFile;
Game_Actor.prototype.tachieFaceFile = function () {
    return CC_Mod.Gyaru.Game_Actor_tachieFaceFile.call(this);
};

//=============================================================================
//////////////////////////////////////////////////////////////
// Bitmap Layers

// Need to create and manage new bitmaps
// The color function is costly to performance, so need to redraw these bitmaps
// as little as possible
//
// The eye bitmap holds eyes only, it's only updated on a change, and then merged into
// either the normal cache or the tempBitmap.  The temp bitmap also holds the cutIn files
// which is where the big performance hit (as in, 1 fps on a gaming machine performance hit)
// comes if it is redrawn every time (so don't do that)

//////////////////////////////////////////////////////////////
// Bitmap Objects

const CCMOD_BITMAP_CACHE_ARRAY_SIZE = 5;

CC_Mod.Gyaru_bitmapCacheInit = function() {
    // TODO: annoyingly complicated caching processes to improve performance
    // TODO: Explore option to render everything on game load so there's no extra delays during scenes

    /*
    if (!$gameTemp.tachieTmpBitmap) {
        $gameTemp.tachieTmpBitmap = new Bitmap(Graphics.width + TACHIE_REM_CUSTOM_WIDTH, Graphics.height+TACHIE_REM_CUSTOM_HEIGHT);
    } */
};

CC_Mod.Gyaru_clearAllCaches = function() {
    CC_Mod.Gyaru_clearHairCache();
    CC_Mod.Gyaru_clearPubicCache();
    CC_Mod.Gyaru_clearEyeCache();
};

CC_Mod.Gyaru_clearHairCache = function() {
    CC_Mod.CCMod_bitmapHairLayer().clear();
};

CC_Mod.Gyaru_clearPubicCache = function() {
    CC_Mod.CCMod_bitmapPubicLayer().clear();
};

CC_Mod.Gyaru_clearEyeCache = function() {
    CC_Mod.CCMod_bitmapEyeLayer().clear();
};

// Hair
Game_Temp.prototype.CCMod_getActorBitmapHairLayer = function (actor) {
    this.CCMod_actorBitmapHairLayer = this.CCMod_actorBitmapHairLayer || {};
    var actorId = actor.actorId();
    if (actor.temp) {
        actorId = -1;
    }
    if (!this.CCMod_actorBitmapHairLayer[actorId]) {
        this.CCMod_actorBitmapHairLayer[actorId] = new Bitmap(Graphics.width + TACHIE_REM_CUSTOM_WIDTH, Graphics.height+TACHIE_REM_CUSTOM_HEIGHT);
    }
    return this.CCMod_actorBitmapHairLayer[actorId];
};

// Pubic - Layering issues if head and body are not merged in one image, so it needs it's own bitmap
Game_Temp.prototype.CCMod_getActorBitmapPubicLayer = function (actor) {
    this.CCMod_actorBitmapPubicLayer = this.CCMod_actorBitmapPubicLayer || {};
    var actorId = actor.actorId();
    if (actor.temp) {
        actorId = -1;
    }
    if (!this.CCMod_actorBitmapPubicLayer[actorId]) {
        this.CCMod_actorBitmapPubicLayer[actorId] = new Bitmap(Graphics.width + TACHIE_REM_CUSTOM_WIDTH, Graphics.height+TACHIE_REM_CUSTOM_HEIGHT);
    }
    return this.CCMod_actorBitmapPubicLayer[actorId];
};

// Eyes
Game_Temp.prototype.CCMod_getActorBitmapEyeLayer = function (actor) {
    this.CCMod_actorBitmapEyeLayer = this.CCMod_actorBitmapEyeLayer || {};
    var actorId = actor.actorId();
    if (actor.temp) {
        actorId = -1;
    }
    if (!this.CCMod_actorBitmapEyeLayer[actorId]) {
        this.CCMod_actorBitmapEyeLayer[actorId] = new Bitmap(Graphics.width + TACHIE_REM_CUSTOM_WIDTH, Graphics.height+TACHIE_REM_CUSTOM_HEIGHT);
    }
    return this.CCMod_actorBitmapEyeLayer[actorId];
};

// getBitmapLayer
CC_Mod.CCMod_bitmapHairLayer = function() {
    return $gameTemp.CCMod_getActorBitmapHairLayer($gameActors.actor(ACTOR_KARRYN_ID));
};

CC_Mod.CCMod_bitmapPubicLayer = function() {
    return $gameTemp.CCMod_getActorBitmapPubicLayer($gameActors.actor(ACTOR_KARRYN_ID));
};

CC_Mod.CCMod_bitmapEyeLayer = function() {
    return $gameTemp.CCMod_getActorBitmapEyeLayer($gameActors.actor(ACTOR_KARRYN_ID));
};

//////////////////////////////////////////////////////////////
// Bitmap Rendering

CC_Mod.Gyaru_isHairLayerActive = function(actor) {
    //let active = CC_Mod.Gyaru_isHairChanged(actor);
    return CC_Mod.Gyaru_isHairChanged(actor);
};

CC_Mod.Gyaru_isEyeLayerActive = function(actor) {
    //let active = CC_Mod.Gyaru_isEyeChanged(actor);
    return CC_Mod.Gyaru_isEyeChanged(actor);
};

// Call this at the start of drawTachieActor
CC_Mod.Gyaru_checkCacheChange = function(sabaTachie, actor, cache, x, y, rect, scale) {
    // Reference stuff here that's needed later but not visible to the drawTachiePart functions
    CC_Mod.tachie_sabaTachie = sabaTachie;
    CC_Mod.tachie_actor = actor;
    CC_Mod.tachie_cache = cache;
    CC_Mod.tachie_x = x;
    CC_Mod.tachie_y = y;
    CC_Mod.tachie_rect = rect;
    CC_Mod.tachie_scale = scale;

    if (actor.isCacheChanged()) {
        CC_Mod.Gyaru_redrawAll();
    } else if (actor.tachieEyesFile() != CC_Mod.CCMod_currentEyeName) {
        CC_Mod.Gyaru_drawEyes(true);
    }

    CC_Mod.CCMod_currentPoseName = actor.poseName;
};

// Called on status window, so it'll trigger when exiting the edict menu
CC_Mod.Gyaru_checkEdictChanged = function() {
    let actor = $gameActors.actor(ACTOR_KARRYN_ID);
    if (CC_Mod.Gyaru_isHairEdictChanged(actor) ||
        CC_Mod.Gyaru_isEyeEdictChanged(actor) ||
        CC_Mod.Gyaru_isSkinEdictChanged(actor)) {

        actor.setCacheChanged();
        actor._CCMod_currentHairColor = CC_Mod.Gyaru_getHairName(actor);
        actor._CCMod_currentEyeColor = CC_Mod.Gyaru_getEyeName(actor);
        actor._CCMod_currentSkinColor = CC_Mod.Gyaru_getSkinName(actor);
    }
};

// This will draw and prepare all bitmaps, which will then get combined during the normal part draw call
CC_Mod.Gyaru_redrawAll = function() {
    //CC_Mod.Gyaru_clearAllCaches();

    CC_Mod.Gyaru_drawHair();
    CC_Mod.Gyaru_drawPubic();
    CC_Mod.Gyaru_drawEyes();
};

// drawTachiePart
CC_Mod.Gyaru_drawPart = function(fileName, bitmap, colorArray) {
    CC_Mod.tachie_sabaTachie.drawTachieFile(fileName, bitmap, CC_Mod.tachie_actor);
    CC_Mod.Gyaru_setBitmapColor(bitmap, colorArray);
};

CC_Mod.Gyaru_drawHair = function(limitedRedraw = false) {
    if (CC_Mod.Gyaru_isHairLayerActive(CC_Mod.tachie_actor)) {
        let hairFileName = CC_Mod.Gyaru_getHairPartFileName(CC_Mod.tachie_actor);
        let hairBitmap = CC_Mod.CCMod_bitmapHairLayer();
        let hairColor = CC_Mod.Gyaru_getHairColorData(CC_Mod.tachie_actor);
        CC_Mod.CCMod_currentHairName = hairFileName;

        CC_Mod.Gyaru_clearHairCache();
        CC_Mod.Gyaru_drawPart(hairFileName, hairBitmap, hairColor);
    }
};

CC_Mod.Gyaru_drawPubic = function(limitedRedraw = false) {
    if (CC_Mod.Gyaru_isHairLayerActive(CC_Mod.tachie_actor)) {
        let pubicFileName = CC_Mod.tachie_actor.tachiePubicFile();
        let pubicBitmap = CC_Mod.CCMod_bitmapPubicLayer();
        let pubicColor = CC_Mod.Gyaru_getHairColorData(CC_Mod.tachie_actor);

        CC_Mod.Gyaru_clearPubicCache();
        CC_Mod.Gyaru_drawPart(pubicFileName, pubicBitmap, pubicColor);
    }
};

CC_Mod.Gyaru_drawEyes = function(limitedRedraw = false) {
    if (limitedRedraw) {
        if (CC_Mod.tachie_actor.tachieEyesFile() == CC_Mod.CCMod_currentEyeName) {
            return;
        }
    }

    if (CC_Mod.Gyaru_isEyeLayerActive(CC_Mod.tachie_actor)) {
        let eyeFileName = CC_Mod.tachie_actor.tachieEyesFile();
        let eyeBitmap = CC_Mod.CCMod_bitmapEyeLayer();
        let eyeColor = CC_Mod.Gyaru_getEyeColorData(CC_Mod.tachie_actor);
        CC_Mod.CCMod_currentEyeName = eyeFileName;

        CC_Mod.Gyaru_clearEyeCache();
        CC_Mod.Gyaru_drawPart(eyeFileName, eyeBitmap, eyeColor);
    }
};

// Move ready custom bitmaps into the main bitmap
CC_Mod.Gyaru_combineBitmaps = function(src, dest) {
    CC_Mod.tachie_sabaTachie.drawTachieCache(CC_Mod.tachie_actor, src, dest, CC_Mod.tachie_x, CC_Mod.tachie_y, CC_Mod.tachie_rect, CC_Mod.tachie_scale);
};

CC_Mod.Gyaru_combineHairBitmaps = function(dest) {
    CC_Mod.Gyaru_combineBitmaps(CC_Mod.CCMod_bitmapHairLayer(), dest);
};

CC_Mod.Gyaru_combinePubicBitmaps = function(dest) {
    if (CC_Mod.tachie_actor.tachiePubicFile() != null) {
        CC_Mod.Gyaru_combineBitmaps(CC_Mod.CCMod_bitmapPubicLayer(), dest);
    }
};

CC_Mod.Gyaru_combineEyeBitmaps = function(dest) {
    CC_Mod.Gyaru_combineBitmaps(CC_Mod.CCMod_bitmapEyeLayer(), dest);
};

// The color function destroys performance, so need to be much more aware of when it's used
// and limit bitmap changes as much as possible
// This is really just a problem on cutIn, but eyes are drawn at the same time as cutIn
// There is also a small but noticeable performance hit when shifting poses rapidly, like when attacking
// hueRotation, toneR, toneG, toneB
CC_Mod.Gyaru_setBitmapColor = function(bitmap, colorArray) {
    if (colorArray[0] != 0) {
        bitmap.rotateHue(colorArray[0]);
    }
    if ((colorArray[1] != 0) || (colorArray[2] != 0) || (colorArray[3] != 0)) {
        bitmap.adjustTone(colorArray[1], colorArray[2], colorArray[3]);
    }
};