//=============================================================================
// EventEnemies.js
//=============================================================================

/*:ja
 * @plugindesc ver1.02 マップ上でエネミーの情報を簡単入手！
 * @author まっつＵＰ
 * 
 * @param deadself
 * @desc イベントのhpが0になった時にオンするセルフスイッチ。
 * 記入されていない場合はオンになりません。
 * @default D
 * 
 * @param mapend
 * @desc このプラグインの機能でマップの座標を取得するとき
 * マップの端より外側の座標を取得しないようにします。
 * @default 1
 *
 * @help
 * 
 * RPGで笑顔を・・・
 * 
 * このヘルプとパラメータの説明をよくお読みになってからお使いください。
 * 本格的に使う前に、必ず使用機会の多いと思われる処理の実行を試してください。
 * 
 * ※プラグインパラメータ
 * deadself・・・セルフスイッチA~Dを指定、または空白。
 * mapend・・・0なら制限なし、1ならマップの端より外側の座標を取得しません。
 * 
 * マップイベントのメモに以下のノートタグを付けることによって
 * そのマップイベントから敵キャラの能力値などを取得できます。
 * ノートタグが付いていない場合でも指定の命令をすることで
 * 敵キャラ設定をさせることができます。（後述）
 * 
 * xはデータベースの敵キャラのID
 * <EEid:x>
 * 
 * 例：<EEid:2>
 * 
 * 
 * このプラグインにおけるよく使いそうな主体の取得は以下の通りです。
 * this.character(0)・・・このイベント
 * this.character(x)・・・IDxのイベント
 * 
 * ※値の取得（イベントコマンド「変数の操作」の「スクリプト」でも取得できます。）
 * 例えば実行中のイベントの経験値の取得は以下の通りです。
 * this.character(0).exp();
 * 
 * 取得できる値の一覧を置いておきます。
 * 元が%設定の数値は100倍して返します。
 * exp()・・・経験値
 * gold()・・・所持金
 * enemyId()・・・敵キャラのID
 * name()・・・敵キャラの名前
 * hp()・・・現在hp
 * mp()・・・現在mp
 * tp()・・・現在tp
 * param(Id)・・・現在の基本能力値、引数Idには0~7の数値を入れてください。
 * xparam(Id)・・・追加能力値、引数Idには0~9の数値を入れてください。
 * sparam(Id)・・・特殊能力値、引数Idには0~9の数値を入れてください。
 * elr(Id)・・・属性有効度、引数Idには属性IDを入れてください。
 * dbr(Id)・・・弱体有効度、引数Idには0~7の数値を入れてください。
 * str(Id)・・・ステート有効度、引数IdにはステートIDを入れてください。
 * isStateResist(Id)・・・
 * ステート無効化かどうか、含まれるステートIDなら1を、それ以外の場合は0を返します。
 * hpRate()・・・hp / mhp
 * mpRate()・・・mp / mmp
 * tpRate()・・・tp / 100 （最大tpがデフォルトの仕様の場合）
 * 
 * 以下の値の取得はプレイヤーも主体とすることができます。
 * this.character(-1)・・・プレイヤー
 * 
 * rookX(value)・・・イベントからイベントと同じ向きにvalueマス離れた座標のx
 * rookY(value)・・・イベントからイベントと同じ向きにvalueマス離れた座標のy
 * cuckooX(value, param)・・・
 * イベントからイベントの向きから斜めにvalueマス離れた座標のx
 * paramが-1の時はイベントの左前、1の時は右前。
 * cuckooY(value, param)・・・
 * イベントからイベントと同じ向きにvalueマス離れた座標のy
 * paramが-1の時はイベントの左前、1の時は右前。
 * 
 * 例：this.character(-1).rookX(3)
 * プレイヤーの前方３マス先の座標xを取得。
 * 
 * 
 * ※スクリプトコマンドの実行
 * （イベントコマンド「スクリプト」に一行書きます。）
 * addenemy(Id)・・・引数Idに敵キャラのIDを入れてください。
 * そのイベントがこの敵キャラのデータを持ちます。
 * 例：this.character(0).addenemy(2);
 * 実行中のイベントがID2の敵キャラのデータを持ちます。
 * 
 * gainDropItems(Id, Id2)・・・
 * 実際に敵キャラのドロップアイテムの抽選を行い、
 * 当たったアイテムを手に入れることができます。
 * 引数IdとId2は変数のIDを指定してください。
 * それぞれこの機能で最後に入手したアイテムのカテゴリとIDを代入します。
 * カテゴリはアイテムが0、武器が1、それ以外が2、見つからない場合は3とします。
 * なお、引数の内、どちらかが0以下の場合は代入を行いません。
 * 
 * heal()・・・イベントコマンドの全回復と同じ効果を与えます。
 * 
 * damage(value)・・・hpを減算します。引数valueには数値を入れてください。
 * この処理でhp0になったイベントのセルフスイッチの内
 * パラメータdeadselfをオンにします。（ただし、記入がある場合）
 * 
 * mpdamage(value)・・・mpを減算します。引数valueには数値を入れてください。
 * 
 * tpdamage(value)・・・tpを減算します。引数valueには数値を入れてください。
 * 
 * 
 * （プラグインコマンド）
 * 上のスクリプトコマンドの機能をプラグインコマンドで実行します。
 * こちらは変数の指定が容易でより高度な処理を期待できます。
 * 以下の説明は便宜上commandがargs[0]を含みます。
 * 
 * command:EE damageまたはEE mpdamageまたはEE tpdamage
 * args:1 eventId(イベントIDを入れたゲーム変数のID)
 *      2 value(ダメージの数値を入れたゲーム変数のID)
 * 
 * 例：EE damage 10 15
 * ID10の変数の値と同じIDのイベントのhpを
 * ID15の変数の値分減算します。
 * 
 * command:EE drop
 * args:1 eventId(イベントIDを入れたゲーム変数のID)
 *      2 Id(変数ID)
 *      3 Id2(変数ID)
 * 
 * 例：EE drop 0 12 13
 * eventIdに0を指定した場合はこのイベントを指定します。
 * つまり、このイベントを主体としてgainDropItemsを実行します。
 * 
 * command:EE addenemy
 * args:1 eventId(イベントIDを入れたゲーム変数のID)
 *      2 Id(敵キャラのID)
 * 
 * command:EE heal
 * args:1 eventId(イベントIDを入れたゲーム変数のID)
 * 
 * 
 * このプラグインを利用する場合は
 * readmeなどに「まっつＵＰ」の名を入れてください。
 * また、素材のみの販売はダメです。
 * 上記以外の規約等はございません。
 * もちろんツクールMVで使用する前提です。
 * 何か不具合ありましたら気軽にどうぞ。
 * 
 * ver1.01 プラグインコマンド実装、rookとcuckooの追加
 * ver1.02 rookとcuckooの制御を強化するパラメータを追加
 *  
 * 免責事項：
 * このプラグインを利用したことによるいかなる損害も制作者は一切の責任を負いません。
 * 
 */

(function() {
    
var parameters = PluginManager.parameters('EventEnemies');
var EEdeadself = String(parameters['deadself']);
var EEmapend = Number(parameters['mapend'] || 0);

//Game
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
    _Game_Interpreter_pluginCommand.call(this, command, args);
        switch(command){
            case 'EE':
                var character = this.EEtarget(args[1]);
                var val1 = $gameVariables.value(args[2]);
                switch(args[0]){
                    case 'addenemy':
                        character.addenemy(val1);
                    break;

                    case 'drop':
                        character.gainDropItems(args[2], args[3]);
                    break;

                    case 'heal':
                        character.heal();
                    break;

                    case 'damage':
                        character.damage(val1);
                    break;

                    case 'mpdamage':
                        character.mpdamage(val1);
                    break;

                    case 'tpdamage':
                        character.tpdamage(val1);
                    break;
                }
            break;
        }
};

Game_Interpreter.prototype.EEtarget = function(param) {
    if(param > 0){
        return this.character($gameVariables.value(param));
    }else{
        return this.character(0);
    }
};

Game_CharacterBase.prototype.EEstartXY = function() {
    return EEmapend ? 0 : -500;
};

Game_CharacterBase.prototype.EEendX = function() {
    return EEmapend ? $gameMap.width() - 1 : 500;
};

Game_CharacterBase.prototype.EEendY = function() {
    return EEmapend ? $gameMap.height() - 1 : 500;
};

Game_CharacterBase.prototype.rookX = function(value) {
    var x = this._x;
    var d = this._direction;
    var point = $gameMap.roundX(x + (d === 6 ? value : d === 4 ? -value : 0));
    return point.clamp(this.EEstartXY(), this.EEendX());
};

Game_CharacterBase.prototype.rookY = function(value) {
    var y = this._y;
    var d = this._direction;
    var point = $gameMap.roundY(y + (d === 2 ? value : d === 8 ? -value : 0));
    return point.clamp(this.EEstartXY(), this.EEendY());
};

Game_CharacterBase.prototype.cuckooX = function(value, param) {
    var x = this.rookX(value);
    var d = this._direction;
    value *= param;
    var point = $gameMap.roundX(x + (d === 2 ? -value : d === 8 ? value : 0));
    return point.clamp(this.EEstartXY(), this.EEendX());
};

Game_CharacterBase.prototype.cuckooY = function(value, param) {
    var y = this.rookY(value);
    var d = this._direction;
    value *= param;
    var point = $gameMap.roundY(y + (d === 6 ? value : d === 4 ? -value : 0));
    return point.clamp(this.EEstartXY(), this.EEendY());
};

var _Game_Event_initialize = Game_Event.prototype.initialize;
Game_Event.prototype.initialize = function(mapId, eventId) {
    _Game_Event_initialize.call(this, mapId, eventId);
    this.addid();
};

Game_Event.prototype.addid = function() {
    this._EEid = Number(this.event().meta['EEid'] || 0);
    this.addenemy(this._EEid);
};

Game_Event.prototype.addenemy = function(enemyId) {
    if($dataEnemies[enemyId]) this._EEenemy = new Game_Enemy(enemyId, 0, 0);
};

Game_Event.prototype.timingself = function(mapId, eventId, timing) {
    if(!EEdeadself) return;
    var key = [mapId, eventId, EEdeadself];
    $gameSelfSwitches.setValue(key, timing);
};

Game_Event.prototype.gainDropItems = function(Id, Id2) {
    if(!this._EEenemy) return;
    var items = this._EEenemy.makeDropItems();
    var category = 3;
    var last = 0;
    items.forEach(function(item){
        $gameParty.gainItem(item, 1);
        last = item;
    });
    if(Id <= 0 || Id2 <= 0) return;
    if(last !== 0){
        if(DataManager.isItem(last)){
            category = 0;
        }else if(DataManager.isWeapon(last)){
            category = 1;
        }else{
            category = 2;
        }
        last = last.id;
    }
    $gameVariables.setValue(Id, category);
    $gameVariables.setValue(Id2, last);
};

Game_Event.prototype.exp = function() {
    return this._EEenemy ? this._EEenemy.exp() : 0;
};

Game_Event.prototype.gold = function() {
    return this._EEenemy ? this._EEenemy.gold() : 0;
};

Game_Event.prototype.enemyId = function() {
    return this._EEenemy ? this._EEenemy.enemyId() : 0;
};

Game_Event.prototype.name = function() {
    return this._EEenemy ? this._EEenemy.originalName() : 0;
};

Game_Event.prototype.hp = function() {
    return this._EEenemy ? this._EEenemy.hp : 0;
};

Game_Event.prototype.mp = function() {
    return this._EEenemy ? this._EEenemy.mp : 0;
};

Game_Event.prototype.tp = function() {
    return this._EEenemy ? this._EEenemy.tp : 0;
};

Game_Event.prototype.param = function(paramId) {
    return this._EEenemy ? this._EEenemy.param(paramId) : 0;
};

Game_Event.prototype.xparam = function(paramId) {
    return this._EEenemy ? this._EEenemy.xparam(paramId) * 100 : 0;
};

Game_Event.prototype.sparam = function(paramId) {
    return this._EEenemy ? this._EEenemy.sparam(paramId) * 100 : 0;
};

Game_Event.prototype.elr = function(elementId) {
    return this._EEenemy ? this._EEenemy.elementRate(elementId) * 100 : 0;
};

Game_Event.prototype.dbr = function(paramId) {
    return this._EEenemy ? this._EEenemy.debuffRate(paramId) * 100 : 0;
};

Game_Event.prototype.str = function(stateId) {
    return this._EEenemy ? this._EEenemy.stateRate(stateId) * 100 : 0;
};

Game_Event.prototype.isStateResist = function(stateId) {
    return this._EEenemy ? Number(this._EEenemy.isStateResist(stateId)) : 0;
};

Game_Event.prototype.hpRate = function() {
    return this._EEenemy ? this._EEenemy.hpRate() * 100 : 0;
};

Game_Event.prototype.mpRate = function() {
    return this._EEenemy ? this._EEenemy.mpRate() * 100 : 0;
};

Game_Event.prototype.tpRate = function() {
    return this._EEenemy ? this._EEenemy.tpRate() * 100 : 0;
};

Game_Event.prototype.heal = function() {
    if(this._EEenemy) this._EEenemy.recoverAll();
};

Game_Event.prototype.damage = function(value) {
    if(!this._EEenemy) return; 
    this._EEenemy.setHp(this.hp() - value);
    if(this.hp() <= 0) this.timingself(this._mapId, this._eventId, true);
};

Game_Event.prototype.mpdamage = function(value) {
    if(this._EEenemy) this._EEenemy.setMp(this.mp() - value);
};

Game_Event.prototype.tpdamage = function(value) {
    if(this._EEenemy) this._EEenemy.setTp(this.tp() - value);
};
 
})();
