//============================================================================
// ChangeSurpriseRateByDir.js (Individual Specified Plugin)
//============================================================================
/*:
 * @plugindesc On Symbol Encount System, change surprise rate according to direction.
 * @author Sasuke KANNAZUKI
 *
 * @help
 * This plugin does not provide plugin commands.
 *
 * [Summary]
 * This plugin is the order-made.
 * see https://forum.tkool.jp/index.php?threads/1300/
 * (Japanese page)
 *
 *
 * [License]
 * this plugin is released under MIT license.
 * http://opensource.org/licenses/mit-license.php
 */

/*:ja
 * @plugindesc シンボルエンカウントで、イベントの向きによって先制や不意打ち率を変更します。
 * @author 神無月サスケ
 *
 * @help
 * このプラグインには、プラグインコマンドはありません。
 *
 * ■概要
 * このプラグインは、下記の要望によって作られたオーダーメイドのプラグインです。
 * https://forum.tkool.jp/index.php?threads/1300/
 *
 * 具体的には以下の機能を実装しています。
 * ・「シンボルに背後から接触された場合」に100％の確率で不意打ち
 * ・「シンボルに背後から接触した場合」は100％の確率で先制攻撃
 *
 * ■ライセンス表記
 * このプラグインは MIT ライセンスで配布されます。
 * ご自由にお使いください。
 * http://opensource.org/licenses/mit-license.php
 */

(function() {
  //
  // judge the position and direction of troop event and player
  //
  Game_Character.prototype._isEventAdjacent = function (direction, eventId) {
    var x = $gameMap.roundXWithDirection(this.x, direction);
    var y = $gameMap.roundYWithDirection(this.y, direction);
    return $gameMap.eventsXyNt(x, y).some(function (e) {
      return e.eventId() === eventId && e.direction() === this.direction();
    }, this);
  };

  Game_Character.prototype._isEventThere = function (eventId) {
    return this._isEventAdjacent(this.direction(), eventId);
  };

  Game_Character.prototype._isEventBehind = function (eventId) {
    return this._isEventAdjacent(10 - this.direction(), eventId);
  };

  //
  // change the rate of preemptive and surprise
  //
  var nowBattleHasBegun = function () {
    return BattleManager._phase === 'init';
  };

  var _Game_Interpreter_command301 = Game_Interpreter.prototype.command301;
  Game_Interpreter.prototype.command301 = function() {
    var wasInBattle = $gameParty.inBattle();
    _Game_Interpreter_command301.call(this);
    var symbolEventId = this._eventId;
    if (!wasInBattle && nowBattleHasBegun() && $gameTroop.troop()) {
      if ($gamePlayer._isEventThere(symbolEventId)) {
        BattleManager._preemptive = true;
        BattleManager._surprise = false;
      } else if ($gamePlayer._isEventBehind(symbolEventId)) {
        BattleManager._preemptive = false;
        BattleManager._surprise = true;
      }
    }
    return true;
  };

})();
