//============================================================================
// MOG_ActorPictureCM.js
// Translate to Japanese : fungamemake.com
//============================================================================

/*:
 * @plugindesc (v2.4f *) Apresenta a imagem do personagem durante a seleção de comandos.
 * @author Moghunter
 *
 * @param -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @desc
 *
 * @param Slide Speed
 * @parent -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição da velocidade de deslize.
 * @default 10
 *
 * @param File Name
 * @parent -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição do nome do arquivo.
 * @default Actor_
 *
 * @param
 *
 * @param -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc
 *
 * @param Bust Visible
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @text Visible
 * @type boolean
 * @desc Ativar a imagem do personagem.
 * @default true
 *
 * @param Bust X-Axis
 * @text X-Axis
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição da posição X-axis da imagem.
 * @default 0
 *
 * @param Bust Y-Axis
 * @text Y-Axis
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição da posição Y-axis da imagem.
 * @default 0
 *
 * @param Bust Slide X
 * @text Slide Animation X
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição de deslize X-Axis.
 * @default -150
 *
 * @param Bust Slide Y
 * @text Slide Animation Y
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição de deslize Y-Axis.
 * @default 0
 *
 * @param Breath Effect
 * @text Breath Animation
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @type boolean
 * @desc Ativar respiração de respiração.
 * @default true
 *
 * @param Blink Effect
 * @text Blink Animation
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @type boolean
 * @desc Ativar o efeito de piscar.
 * @default false
 *
 * @param Blink Speed
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Velocidade de piscar.
 * @default 7
 *
 * @param Blinking Interval
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Intervalo de para piscar.
 * @default 190
 *
 * @param
 *
 * @param -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @desc
 *
 * @param Face Visible
 * @text Visible
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @type boolean
 * @desc Ativar a imagem da Face.
 * @default true
 *
 * @param Face X-Axis
 * @text X-Axis
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição da posição X-axis da imagem.
 * @default 570
 *
 * @param Face Y-Axis
 * @text Y-Axis
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição da posição Y-axis da imagem.
 * @default 0
 *
 * @param Face Slide X
 * @text Slide Animation X
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição de deslize X-Axis.
 * @default 150
 *
 * @param Face Slide Y
 * @text Slide Animation Y
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @desc Definição de deslize Y-Axis.
 * @default 0
 *
 * @help
 * ===========================================================================
 * +++ MOG - Actor Picture CM (v2.4f) +++
 * By Moghunter
 * https://atelierrgss.wordpress.com/
 * ===========================================================================
 * Apresenta a imagem do personagem durante a seleção de comandos.
 *
 * ===========================================================================
 * - REQUIRED FILES -
 * ===========================================================================
 * As imagens dos personagens devem ser gravadas na pasta. /img/actor_picture_cm/
 * A nomeação dos arquivos devem ser feitas da seguinte forma.
 *
 * Actor_ + ID + _bust.png
 *
 * Exemplo
 *
 * -> Actor_1_bust.png
 * -> Actor_2_bust.png
 * -> Actor_3_bust.png
 *
 * ---------------------------------------------------------------------------
 *
 * Para definir a imagem secundária do personagem nomeie o arquivo da seguinte
 * forma.
 *
 * -> Actor_ ID + _sub.png
 *
 * Exemplo
 *
 * -> Actor_1_sub.png
 * -> Actpr_2_sub.png
 * -> ...
 *
 * ---------------------------------------------------------------------------
 *
 * Para definir a imagem dos olhos nomeie o arquivo da seguinte forma.
 *
 * -> Actor_ ID + _eyes.png
 *
 * Exemplo
 *
 * -> Actor_1_eyes.png
 * -> Actpr_2_eyes.png
 * -> ...
 *
 * ===========================================================================
 * - PLUGIN COMMANDS -
 * ===========================================================================
 * Se desejar mudar a imagem do arquivo de imagem no meio do jogo utilize o
 * commando abaixo
 *
 * actorCM_fileName : ACTOR_ID : FILE_NAME
 *
 * EG
 *
 * actorCM_fileName : 1 : ActorAwaked_5
 *
 * ===========================================================================
 * Para ativar ou desativar o efeito de respiração utilize o plugin
 * command abaixo
 *
 * actorCM_breathEffect : ACTOR_ID : ENABLE
 *
 * EG
 *
 * actorCM_breathEffect : 1 : true
 *
 * ===========================================================================
 * - WHAT'S  NEW (version 2.4f)
 * ===========================================================================
 * - (BUG FIX) - Corrigido um erro que causava um erro dependendo das
 *               condições (by Dark Plasma)
 * - (NEW) - Plugins parameters compatíveis com RM1.5+
 * - (BUG FIX) - Corrigido o bug de não ocultar as imagens quando a janela
 *               de messagem estiver ativa. (ATB plugin)
 *
 */

/*:ja
 * @plugindesc (v2.4f *) 戦闘コマンド選択中にアクターの立ち絵を表示します。
 * @author Moghunter
 *
 * @param -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @text -> 一般 <<<<<<<<<<<<<<<<<<<<<<<
 *
 * @param Slide Speed
 * @parent -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @text スライド速度
 * @default 10
 *
 * @param File Name
 * @parent -> MAIN <<<<<<<<<<<<<<<<<<<<<<<
 * @text ファイル名接頭辞
 * @default Actor_
 *
 * @param
 *
 * @param -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @text -> 立ち絵 <<<<<<<<<<<<<<<<<<<<<<<
 *
 * @param Bust Visible
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @text 有効化
 * @default true
 * @type boolean
 * @on 有効
 * @off 無効
 *
 * @param Bust X-Axis
 * @text X軸位置
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default 0
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Bust Y-Axis
 * @text Y軸位置
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default 0
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Bust Slide X
 * @text X軸スライド量
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default -150
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Bust Slide Y
 * @text Y軸スライド量
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default 0
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Breath Effect
 * @text 呼吸アニメ有効化
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default true
 * @type boolean
 * @on 有効
 * @off 無効
 *
 * @param Blink Effect
 * @text 瞬きエフェクト有効化
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @default false
 * @type boolean
 * @on 有効
 * @off 無効
 *
 * @param Blink Speed
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @text 瞬きの速度
 * @default 7
 *
 * @param Blinking Interval
 * @parent -> BUST <<<<<<<<<<<<<<<<<<<<<<<
 * @text 瞬きの間隔
 * @default 190
 *
 * @param
 *
 * @param -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @text -> サブ画像 <<<<<<<<<<<<<<<<<<<<<<<
 *
 * @param Face Visible
 * @text 有効化
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @default true
 * @type boolean
 * @on 表示
 * @off 非表示
 *
 * @param Face X-Axis
 * @text X軸位置
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @default 570
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Face Y-Axis
 * @text Y軸位置
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @default 0
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Face Slide X
 * @text Slide Animation X
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @text X軸スライド量
 * @default 150
 * @desc 正:右 / 負:左
 * @type number
 * @min -9007
 * @max 9007
 *
 * @param Face Slide Y
 * @text Y軸スライド量
 * @parent -> FACE <<<<<<<<<<<<<<<<<<<<<<<
 * @default 0
 * @desc 正:下 / 負:上
 * @type number
 * @min -9007
 * @max 9007
 *
 * @help
 * 翻訳:ムノクラ
 * https://fungamemake.com/
 * https://twitter.com/munokura/
 *
 * ===========================================================================
 * +++ MOG - Actor Picture CM (v2.4f) +++
 * By Moghunter
 * https://atelierrgss.wordpress.com/
 * ===========================================================================
 * 戦闘コマンド選択中にアクターの立ち絵を表示します。
 *
 * ===========================================================================
 * - 必要ファイル -
 * ===========================================================================
 * 戦闘コマンド選択中にアクターの立ち絵を表示します。
 * /img/actor_picture_cm/
 * ファイル名は下記のようにしてください。
 *
 * Actor_ + ID + _bust.png
 *
 * 例
 *
 * -> Actor_1_bust.png
 * -> Actor_2_bust.png
 * -> Actor_3_bust.png
 *
 * ---------------------------------------------------------------------------
 *
 * アクターのサブ画像ファイル名は下記のようにしてください。
 *
 * -> Actor_ ID + _sup.png  <- ファイル名注意！（元ヘルプのミスです）
 *
 * 例
 *
 * -> Actor_1_sup.png
 * -> Actpr_2_sup.png
 * -> ...
 *
 * ---------------------------------------------------------------------------
 *
 * 瞬きの画像ファイル名は下記のようにしてください。
 *
 * -> Actor_ ID + _eyes.png
 *
 * 例
 *
 * -> Actor_1_eyes.png
 * -> Actpr_2_eyes.png
 * -> ...
 *
 * 瞬きの画像は下記の仕様で動作します。
 *
 * 例
 *
 * 1.Actor_1_bust.png を横に2つ連結したサイズでActor_1_eyes.pngを作成。
 * 2.Actor_1_eyes.png の左半分は「目が開いた絵」、右半分は「目が閉じた絵」
 * 3.Actor_1_eyes.png は Actor_1_bust.png の上レイヤーで表示される。
 * 4.Actor_1_eyes.png の瞬きに関わらない部分は透明化しておくことが可能。
 *
 * ===========================================================================
 * - プラグインコマンド -
 * ===========================================================================
 * ゲームの途中で表示する画像ファイルを変更したい場合、
 * 以下のコマンドを使用してください。
 *
 * actorCM_fileName : ACTOR_ID : FILE_NAME
 *
 * 例
 *
 * actorCM_fileName : 1 : ActorAwaked_5
 *
 * ===========================================================================
 * 呼吸エフェクトを有効/無効にするには、以下のプラグインコマンドを使用します。
 *
 * actorCM_breathEffect : ACTOR_ID : ENABLE
 *
 * 例
 *
 * actorCM_breathEffect : 1 : true
 *
 * ===========================================================================
 * - 更新履歴 (version 2.4f)
 * ===========================================================================
 * - (BUG FIX) - 条件によりエラーが出るバグを修正(by Dark Plasma)
 * - (NEW) - RM1.5 +と互換性のあるプラグインパラメータ
 * - (BUG FIX) - メッセージウィンドウが有効な時、
 *               画像を隠さないバグを修正しました。(ATBプラグイン)
 *
 */

//============================================================================
// ** PLUGIN PARAMETERS
//============================================================================

//============================================================================
// ** PLUGIN PARAMETERS
//============================================================================
var Imported = Imported || {};
Imported.MOG_ActorPictureCM = true;
var Moghunter = Moghunter || {};

Moghunter.parameters = PluginManager.parameters('MOG_ActorPictureCM');
Moghunter.actor_slideSpeed = Number(Moghunter.parameters['Slide Speed'] || 10);
Moghunter.actor_fileName = String(Moghunter.parameters['File Name'] || "Actor_");
Moghunter.actor_cm1_visible = String(Moghunter.parameters['Face Visible'] || "true");
Moghunter.actor_cm1_slideX = Number(Moghunter.parameters['Face Slide X'] || 150);
Moghunter.actor_cm1_slideY = Number(Moghunter.parameters['Face Slide Y'] || 0);
Moghunter.actor_cm1_x = Number(Moghunter.parameters['Face X-Axis'] || 570);
Moghunter.actor_cm1_y = Number(Moghunter.parameters['Face Y-Axis'] || 0);
Moghunter.actor_cm2_visible = String(Moghunter.parameters['Bust Visible'] || "true");
Moghunter.actor_cm2_slideX = Number(Moghunter.parameters['Bust Slide X'] || -150);
Moghunter.actor_cm2_slideY = Number(Moghunter.parameters['Bust Slide Y'] || 0);
Moghunter.actor_cm2_x = Number(Moghunter.parameters['Bust X-Axis'] || 0);
Moghunter.actor_cm2_y = Number(Moghunter.parameters['Bust Y-Axis'] || 0);
Moghunter.actor_cm2_breathEffect = String(Moghunter.parameters['Breath Effect'] || "true");

Moghunter.actor_cm3_visible = String(Moghunter.parameters['Blink Effect'] || "true");
Moghunter.actor_cm3_blinkS = Number(Moghunter.parameters['Blink Speed'] || 5);
Moghunter.actor_cm3_blinkD = Number(Moghunter.parameters['Blinking Interval'] || 180);

//============================================================================
// ** ImageManager
//============================================================================

//==============================
// * Actor Hud
//==============================
ImageManager.loadActorpicCM = function (filename) {
    return this.loadBitmap('img/actor_picture_cm/', filename, 0, true);
};

//============================================================================
// ** Game_Temp
//============================================================================

//==============================
// * Initialize
//==============================
var _alias_mog_actorcm_temp_initialize = Game_Temp.prototype.initialize;
Game_Temp.prototype.initialize = function () {
    _alias_mog_actorcm_temp_initialize.call(this);
    this._actorCmData = [false, false, true];
};

//============================================================================
// ** Game Interpreter
//============================================================================

//==============================
// * PluginCommand
//==============================
var _mog_actorCM_gint_pluginCommand = Game_Interpreter.prototype.pluginCommand
Game_Interpreter.prototype.pluginCommand = function (command, args) {
    _mog_actorCM_gint_pluginCommand.call(this, command, args)
    if (command === "actorCM_fileName") { this.setActorCM(args) };
    if (command === "actorCM_breathEffect") { this.setActorBreathEffect(args) };
    return true;
};

//==============================
// * Set Actor CM
//==============================
Game_Interpreter.prototype.setActorCM = function (args) {
    var id = Number(args[1]);
    var fileName = String(args[3]);
    for (var i = 0; i < $gameParty.members().length; i++) {
        var actor = $gameParty.members()[i];
        if (actor._actorId === id) {
            if (actor) { actor.setActorCMNAme(fileName) };
        };
    };
};

//==============================
// * Set Actor Breath Effect
//==============================
Game_Interpreter.prototype.setActorBreathEffect = function (args) {
    var id = Number(args[1]);
    var enable = String(args[3]) == "true" ? true : false;
    for (var i = 0; i < $gameParty.members().length; i++) {
        var actor = $gameParty.members()[i];
        if (actor._actorId === id) {
            if (actor) { actor.setActorCMbreathEffect(enable) };
        };
    };
};

//============================================================================
// ** Game_Actor
//============================================================================

//==============================
// * Initialize
//==============================
var _mog_actorcm_gactor_initMembers = Game_Actor.prototype.initMembers;
Game_Actor.prototype.initMembers = function () {
    _mog_actorcm_gactor_initMembers.call(this);
    var breathEffect = String(Moghunter.actor_cm2_breathEffect) == "true" ? true : false;
    this._actorCMData = ["", 0, 0, breathEffect];
};

//==============================
// * Setup
//==============================
var _mog_actorcm_gactor_setup = Game_Actor.prototype.setup;
Game_Actor.prototype.setup = function (actorId) {
    _mog_actorcm_gactor_setup.call(this, actorId);
    this._actorCMData[0] = String(Moghunter.actor_fileName) + this._actorId;
};

//==============================
// * set Actor CMNAme
//==============================
Game_Actor.prototype.setActorCMNAme = function (fileName) {
    this._actorCMData[0] = String(fileName);
};

//==============================
// * set Actor CM Breath Effect
//==============================
Game_Actor.prototype.setActorCMbreathEffect = function (enable) {
    this._actorCMData[3] = enable;
};

//============================================================================
// ** Scene Base
//============================================================================

//==============================
// ** create Hud Field
//==============================
Scene_Base.prototype.createHudField = function () {
    this._hudField = new Sprite();
    this._hudField.z = 10;
    this.addChild(this._hudField);
};

//==============================
// ** sort MZ
//==============================
Scene_Base.prototype.sortMz = function () {
    this._hudField.children.sort(function (a, b) { return a.mz - b.mz });
};

//============================================================================
// ** Scene Battle
//============================================================================

//==============================
// ** create Spriteset
//==============================
var _mog_actorPicCM_sbattle_createSpriteset = Scene_Battle.prototype.createSpriteset;
Scene_Battle.prototype.createSpriteset = function () {
    _mog_actorPicCM_sbattle_createSpriteset.call(this);
    if (!this._hudField) { this.createHudField() };
    this.createActorCMBase();
    this.createActorCM();
    this.sortMz();
};

//==============================
// * Create Actor CM Base
//==============================
Scene_Battle.prototype.createActorCMBase = function () {
    this.actorPictureCMBase = new Actor_CMPictureBase();
    this.actorPictureCMBase.mz = 104;
    this._hudField.addChild(this.actorPictureCMBase);
};

//==============================
// * Create Actor CM
//==============================
Scene_Battle.prototype.createActorCM = function () {
    this.actorPictureCM = new Actor_CMPicture();
    this.actorPictureCM.mz = 105;
    this._hudField.addChild(this.actorPictureCM);
};

//============================================================================
// * Actor_CMPicture
//============================================================================
function Actor_CMPicture() {
    this.initialize.apply(this, arguments);
};

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

//==============================
// * Initialize
//==============================
Actor_CMPicture.prototype.initialize = function () {
    Sprite.prototype.initialize.call(this);
    this._actor = null;
    this._CmName = null;
    this._breahEffect = false;
    $gameTemp._actorCmData = [false, false, true];
    this._cm1 = String(Moghunter.actor_cm1_visible) === "true" ? true : false;
    this._cm2 = String(Moghunter.actor_cm2_visible) === "true" ? true : false;
    this._cm3 = String(Moghunter.actor_cm3_visible) === "true" ? true : false;
    this._sldSpd = Math.min(Math.max(Moghunter.actor_slideSpeed, 1), 999);
    if (this._cm1) { this.createCM1() };
    if (this._cm2) { this.createCM2() };
    if (this._cm3) { this.createCM3() };
};

//==============================
// * is Visible
//==============================
Actor_CMPicture.prototype.isVisible = function () {
    if (!$gameTemp._actorCmData[2]) { return false };
    return $gameTemp._actorCmData[0];
};

//==============================
// * create CM1
//==============================
Actor_CMPicture.prototype.createCM1 = function () {
    this._supSprite = new Sprite();
    this._supSprite.visible = false;
    this._supSpriteData = null;
    this.addChild(this._supSprite);
};

//==============================
// * create CM2
//==============================
Actor_CMPicture.prototype.createCM2 = function () {
    this._bust = new Sprite();
    this._bust.anchor.x = 0.5;
    this._bust.anchor.y = 1.0;
    this._bust.visible = false;
    this._bustData = null;
    this.addChild(this._bust);
};

//==============================
// * create CM3
//==============================
Actor_CMPicture.prototype.createCM3 = function () {
    this._eyes = new Sprite();
    this._eyes.anchor.x = 0.5;
    this._eyes.anchor.y = 1.0;
    this._eyes.visible = false;
    this.addChild(this._eyes);
};

//==============================
// * Hide Sprites
//==============================
Actor_CMPicture.prototype.hideSprites = function () {
    if (this._supSprite) { this._supSprite.visible = false };
    if (this._bust) { this._bust.visible = false };
};

//==============================
// * move To
//==============================
Actor_CMPicture.prototype.moveto = function (value, real_value) {
    if (value == real_value) { return value };
    var dnspeed = 2 + (Math.abs(value - real_value) / this._sldSpd);
    if (value > real_value) {
        value -= dnspeed;
        if (value < real_value) { value = real_value };
    }
    else if (value < real_value) {
        value += dnspeed;
        if (value > real_value) { value = real_value };
    };
    return Math.floor(value);
};

//==============================
// * File Name Real
//==============================
Actor_CMPicture.prototype.fileNameReal = function () {
    if (!this._actor) { return "" };
    return this._actor._actorCMData[0];
};

//==============================
// * FileName
//==============================
Actor_CMPicture.prototype.fileName = function () {
    return String(this._CmName);
};

//==============================
// * Need Refresh Actor
//==============================
Actor_CMPicture.prototype.refreshActor = function () {
    this._actor = BattleManager.actor();
    if (this._actor) { this.refreshSprites() };
};

//==============================
// * refresh Bitmap CM1
//==============================
Actor_CMPicture.prototype.refreshBitmapCM1 = function () {
    var fileName = this.fileName() + "_sup"
    this._supSprite.bitmap = ImageManager.loadActorpicCM(fileName);
    this._supSprite.visible = false;
    this._supSpriteData = null;
};

//==============================
// * refresh Bitmap CM2
//==============================
Actor_CMPicture.prototype.refreshBitmapCM2 = function () {
    var fileName = this.fileName() + "_bust";
    this._bust.bitmap = ImageManager.loadActorpicCM(fileName);
    this._bust.visible = false;
    this._bust.zoom = {}
    this._bust.zoom.speed = 0.0004;
    this._bust.zoom.maxScale = 0.008;
    this._bust.zoom.phase = 0;
    this._bust.zoom.y = 0;
    this._breahEffect = false;
    this._bustData = null;
    if (this._eyes) { this.refreshBitmapCM3() };
};

//==============================
// * refresh Bitmap CM3
//==============================
Actor_CMPicture.prototype.refreshBitmapCM3 = function () {
    var fileName = this.fileName() + "_eyes";
    this._eyes.bitmap = ImageManager.loadActorpicCM(fileName);
    this._eyes.visible = false;
};

//==============================
// * refresh Sprites
//==============================
Actor_CMPicture.prototype.refreshSprites = function () {
    this._CmName = this._actor ? this._actor._actorCMData[0] : null;
    if (this._supSprite) { this.refreshBitmapCM1() };
    if (this._bust) { this.refreshBitmapCM2() };
};

//==============================
// * Need Refresh Actor
//==============================
Actor_CMPicture.prototype.needRefreshActor = function () {
    if ($gameTemp._actorCmData[1]) { return true };
    if (BattleManager.actor() != this._actor) { return true };
    if (this._actor && this._CmName != this._actor._actorCMData[0])
        return false;
};

//==============================
// * get Data CM1
//==============================
Actor_CMPicture.prototype.getDataCM1 = function () {
    this._supSpriteData = [this._supSprite.bitmap.width, this._supSprite.bitmap.height,
    Moghunter.actor_cm1_x, Moghunter.actor_cm1_y, 0, 0, true,
    Moghunter.actor_cm1_slideX, Moghunter.actor_cm1_slideY
    ];
    this._supSprite.visible = true;
    this._supSprite.opacity = 0;
    this._supSprite.x = this._supSpriteData[6] ? this._supSpriteData[2] + this._supSpriteData[7] : this._supSpriteData[2];
    this._supSprite.y = this._supSpriteData[6] ? this._supSpriteData[3] + this._supSpriteData[8] : this._supSpriteData[3];
};

//==============================
// * Update CM1
//==============================
Actor_CMPicture.prototype.updateCM1 = function () {
    if (!this.isVisible()) {
        this._supSpriteData[4] = this._supSpriteData[2] + this._supSpriteData[7];
        this._supSpriteData[5] = this._supSpriteData[3] + this._supSpriteData[8];
        this._supSprite.opacity -= 15;
    } else {
        this._supSpriteData[4] = this._supSpriteData[2];
        this._supSpriteData[5] = this._supSpriteData[3];
        this._supSprite.opacity += 15;
    };
    this._supSprite.x = this.moveto(this._supSprite.x, this._supSpriteData[4]);
    this._supSprite.y = this.moveto(this._supSprite.y, this._supSpriteData[5]);
};

//==============================
// * need Get Data 1
//==============================
Actor_CMPicture.prototype.needGetData1 = function () {
    if (!this._supSprite) { return false };
    if (this._supSpriteData) { return false };
    if (!this._supSprite.bitmap) { return false };
    if (!this._supSprite.bitmap.isReady()) { return false };
    return true;
};

//==============================
// * get Data CM2
//==============================
Actor_CMPicture.prototype.getDataCM2 = function () {
    this._bustData = [this._bust.bitmap.width, this._bust.bitmap.height,
    Moghunter.actor_cm2_x, Moghunter.actor_cm2_y, 0, 0, true,
    Moghunter.actor_cm2_slideX, Moghunter.actor_cm2_slideY,
        0, 0, 0];
    this._bust.visible = true;
    this._bust.opacity = 0;
    this._bustData[2] = Moghunter.actor_cm2_x + (Graphics.boxWidth / 2);
    this._bustData[3] = Moghunter.actor_cm2_y + Graphics.boxHeight;
    this._bust.x = this._bustData[6] ? this._bustData[2] + this._bustData[7] : this._bustData[2];
    this._bust.y = this._bustData[6] ? this._bustData[3] + this._bustData[8] : this._bustData[3];
    //    this._breahEffect = this._actor._actorCMData[3];
    this._breahEffect = this._actor ? this._actor._actorCMData[3] : false;	//fix by DarkPlasma
    if (this._eyes) { this.getDataCM3() };
};

//==============================
// * get Data CM 3
//==============================
Actor_CMPicture.prototype.getDataCM3 = function () {
    this._eyesData = {};
    this._eyesData.index = 0;
    this._eyesData.speed = 0;
    this._eyesData.motionM = Number(Moghunter.actor_cm3_blinkS);
    this._eyesData.blinkD = Number(Moghunter.actor_cm3_blinkD)
    this._eyesData.duration = Math.randomInt(60) + 60;
    this._eyesData.cw = this._eyes.bitmap.width / 2;
    this._eyesData.ch = this._eyes.bitmap.height;
    this.refreshFrame(this._eyes, -1);
};

//==============================
// * update Blink
//==============================
Actor_CMPicture.prototype.updateBlink = function () {
    if (this._eyesData.duration <= 0) {
        this._eyesData.speed++;
        if (this._eyesData.speed < this._eyesData.motionM) { return }
        this._eyesData.speed = 0;
        this._eyesData.index++;
        if (this._eyesData.index > 1) {
            this._eyesData.index = -1
            this._eyesData.duration = Math.randomInt(160) + this._eyesData.blinkD;
        };
        this.refreshFrame(this._eyes, this._eyesData.index);
    } else {
        this._eyesData.duration--;
    }
};

//==============================
// * refresh Frame
//==============================
Actor_CMPicture.prototype.refreshFrame = function (sprite, index) {
    var cw = this._eyesData.cw;
    var ch = this._eyesData.ch;
    var fr = cw * index;
    sprite.setFrame(fr, 0, cw, ch)
};

//==============================
// *  update CM3
//==============================
Actor_CMPicture.prototype.updateCM3 = function () {
    this.updateBlink();
    this._eyes.visible = this._bust.visible;
    this._eyes.opacity = this._bust.opacity;
    this._eyes.x = this._bust.x;
    this._eyes.y = this._bust.y;
    this._eyes.scale.x = this._bust.scale.x;
    this._eyes.scale.y = this._bust.scale.y;
};

//==============================
// * breathSpeed
//==============================
Actor_CMPicture.prototype.breathSpeed = function () {
    return 0.000225;
};

//==============================
// * Update CM2
//==============================
Actor_CMPicture.prototype.updateCM2 = function () {
    if (!this.isVisible()) {
        this._bustData[4] = this._bustData[2] + this._bustData[7];
        this._bustData[5] = this._bustData[3] + this._bustData[8];
        this._bust.opacity -= 15;
    } else {
        this._bustData[4] = this._bustData[2];
        this._bustData[5] = this._bustData[3];
        this._bust.opacity += 15;
    };
    this._bust.x = this.moveto(this._bust.x, this._bustData[4]);
    this._bust.y = this.moveto(this._bust.y, this._bustData[5]);
    if (this._breahEffect && this._bust.opacity > 0) { this.updateBreathEffect() };
    if (this._eyes) { this.updateCM3() };
};

//==============================
// * Update Breath Effect
//==============================
Actor_CMPicture.prototype.updateBreathEffect = function () {
    this._bust.zoom.speed = this.breathSpeed();
    if (this._bust.zoom.phase === 0) {
        this._bust.zoom.y += this._bust.zoom.speed
        if (this._bust.zoom.y >= this._bust.zoom.maxScale) {
            this._bust.zoom.y = this._bust.zoom.maxScale;
            this._bust.zoom.phase = 1;
        };
    } else {
        this._bust.zoom.y -= this._bust.zoom.speed
        if (this._bust.zoom.y <= 0) {
            this._bust.zoom.y = 0;
            this._bust.zoom.phase = 0;
        };
    };
    this._bust.scale.y = 1.00 + this._bust.zoom.y;
};

//==============================
// * need Get Data 2
//==============================
Actor_CMPicture.prototype.needGetData2 = function () {
    if (!this._bust) { return false };
    if (this._bustData) { return false };
    if (!this._bust.bitmap) { return false };
    if (!this._bust.bitmap.isReady()) { return false };
    return true;
};

//==============================
// * Update
//==============================
Actor_CMPicture.prototype.update = function () {
    Sprite.prototype.update.call(this);
    if (this.needRefreshActor()) { this.refreshActor() };
    if (this.needGetData1()) { this.getDataCM1() };
    if (this.needGetData2()) { this.getDataCM2() };
    if (this._supSpriteData) { this.updateCM1() };
    if (this._bustData) { this.updateCM2() };
};

//============================================================================
// * Actor_CMPicture Base
//============================================================================
function Actor_CMPictureBase() {
    this.initialize.apply(this, arguments);
};

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

//==============================
// * Initialize
//==============================
Actor_CMPictureBase.prototype.initialize = function () {
    Sprite.prototype.initialize.call(this);
};

//==============================
// * create Background
//==============================
Actor_CMPictureBase.prototype.createBackground = function () {
    this._background = new TilingSprite(ImageManager.loadActorpicCM("Background"));
    this._background.move(0, 0, Graphics.width, Graphics.height);
    this.addChild(this._background);
};

//==============================
// * update Visible
//==============================
Actor_CMPictureBase.prototype.updateVisible = function () {
    this.visible = this.visibleBase();
};

//==============================
// * visble Base
//==============================
Actor_CMPictureBase.prototype.visibleBase = function () {
    if (!BattleManager.actor()) { return false };
    return true;
};

//==============================
// * Update
//==============================
Actor_CMPictureBase.prototype.update = function () {
    Sprite.prototype.update.call(this);
    this.updateVisible();
};

//============================================================================
// * Scene Battle
//============================================================================

//==============================
// * Update
//==============================
var _alias_mog_actorcm_scbat_update = Scene_Battle.prototype.update;
Scene_Battle.prototype.update = function () {
    _alias_mog_actorcm_scbat_update.call(this);
    $gameTemp._actorCmData[0] = this.sprite_actor_cm_visible();
};

//==============================
// * Sprite Actor CM Visible
//==============================
Scene_Battle.prototype.sprite_actor_cm_visible = function () {
    if (!BattleManager.actor()) { return false };
    if (this._actorWindow.active) { return false };
    if (this._enemyWindow.active) { return false };
    if (this._partyCommandWindow.active) { return false };
    if ($gameMessage.isBusy()) { return false };
    if (!BattleManager.isInputting()) { return false };
    return true;
};